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