当前位置: 代码迷 >> 综合 >> 移植e4defrag到android系统中
  详细解决方案

移植e4defrag到android系统中

热度:30   发布时间:2024-01-29 09:58:12.0

1、环境安装:
gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz 
建立目录 sudo mkdir -p /usr/local/arm-64/
解压后,放入 /usr/local/arm-64/ 


1、下载e2fsprogs的源码
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git

2、路径导入环境变量中,
export PATH=/usr/local/arm-64/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin:$PATH

3、编译
cd e2fsprogs
mkdir build
cd build
#../configure -host=aarch64-linux-gnu cc=arm-linux-gcc  -prefix=/home/zyf/software/e2fff/e2fsprogs/build

../configure -host=aarch64-linux-gnu cc=arm-linux-gcc --target=arm-linux LDFLAGS=-static -prefix=/home/zyf/software/e2fff/e2fsprogs/build

make

(sudo make install)

/home/zyf/software/e2fff/e2fsprogs/build下面的相应子目录中已经生成了可执行文件及动态库。

4、拷贝文件
如果我们需要e4defrag 可执行文件在 : /home/zyf/software/e2fff/e2fsprogs/build/misc/e4defrag  
(1)、用readelf看看e4defrag需要使用哪些动态库
zyf@zyf-Vostro-3671:~/software/e2fff/e2fsprogs/build$  readelf -d  misc/e4defrag
There is no dynamic section in this file. -- 这里刚好不需要任何的动态库

别人的例子:
eadelf -d misc/mke2fs

Dynamic section at offset 0x11474 contains 30 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libext2fs.so.2]
0x00000001 (NEEDED) Shared library: [libcom_err.so.2]
0x00000001 (NEEDED)                     Shared library: [libblkid.so.1]
0x00000001 (NEEDED)                     Shared library: [libuuid.so.1]
0x00000001 (NEEDED)                     Shared library: [libe2p.so.2]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.0]

需要的库为 libblkid.so libext2fs.so等库

(2)、将 build/lib目录下对应的so动态库拷贝到android的/lib目录
(3)、将 build/misc/e4defrag 拷贝到android的/sbin目录下,这里我这个目录不允许写入。改为/bin目录。

~/software/e2fff/e2fsprogs/build$ adb push misc/e4defrag /bin/
5544 KB/s (6567464 bytes in 1.156s)

5、执行
zyf@zyf-Vostro-3671:~/software/e2fff/e2fsprogs/build$ adb shell
BV5900:/ # e4
e4crypt   e4defrag
BV5900:/ # e4defrag                                                            
e4defrag 1.46-WIP (20-Mar-2020)
Usage    : e4defrag [-v] file...| directory...| device...
: e4defrag  -c  file...| directory...| device...
已经运行成功了

6、检查文件碎片:
BV5900:/ # e4defrag -c /data                                                   
e4defrag 1.46-WIP (20-Mar-2020)
Couldn't access /etc/mtab: No such file or directory

报错:没有 /etc/mtab 这个文件 。
解决 : 把 vendor/etc/fstab.mt6761 拷贝并改名 /etc/mtab 
cp vendor/etc/fstab.mt6761  /etc/mtab

再执行检查命令:
BV5900:/system/etc # e4defrag -c /data                                         
e4defrag 1.46-WIP (20-Mar-2020)
<Fragmented files>                             now/best       size/ext
1. /data/data/com.google.android.gms/files/clearcut/0/ICING/-290687769/1594888825324.NONE
3/1              5 KB
2. /data/data/com.google.android.gms/files/AppDataSearch/main/rq/0000000000000003
2/1              4 KB
3. /data/data/com.google.android.projection.gearhead/databases/google_analytics_v4.db
3/1              9 KB
4. /data/data/com.google.android.youtube/databases/google_app_measurement_local.db
2/1              8 KB
5. /data/misc/profiles/cur/0/com.google.android.inputmethod.latin/primary.prof
2/1              8 KB

 Total/best extents                3907/3823
Average size per extent            1402 KB
Fragmentation score                0
[0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
This directory (/data) does not need defragmentation.
Done.


成功。

7、整理
e4defrag /data                                                      
e4defrag 1.46-WIP (20-Mar-2020)
ext4 defragmentation for directory(/data)
[4/6767]/data/duraspeed/launchcount/1594742400118:    100%    [ OK ]
...
[6766/6767]/data/app/com.android.vending-HzNpXTM138ikxvuO0Fnm1w==/oat/arm/base.art:    100%    [ OK ]

    Success:            [ 3674/7271 ]
Failure:            [ 3597/7271 ]
Total extents:            3813->3677
Fragmented percentage:          2%->0%

成功。


如果flash空间紧张的话,则可以将部分功能编译成动态库。

方法如下:
../configure -host=aarch64-linux-gnu cc=arm-linux-gcc --target=arm-linux --enable-elf-shlibs

make

  相关解决方案