正常情况下我们只要将system中的内容按需求更改后重新编译即可。最近需要修改"rk3288"的system,只有一个别人提供的固件和一份没编译过的android源码,因为编译android需要的时间太长,于是就打起了解包的主意。在 rk3288 的 linux-update/rockdev目录下查看了 unpack.sh:
./rkImageMaker -unpack update.img output || pause
./afptool -unpack output/firmware.img output || pause固件是update_xxx.img,所以按照要求改成 update.img,然后在当前目录下(linux-update/rockdev/)执行下面两句:
cp update_xxx.img update.img
./unpack.sh update.img执行完后可以发现多了一个output目录,进入output下的Image目录可以发现刚刚解包的文件,包括Andorid编译生成的各种img文件,然后将其中的system.img文件拷贝到根目录,执行以下几句:
cp system.img /
cd /
mkdir newdir这样我们在根目录创建了一个newdir,同时也将system.img拷贝到了根目录('/'),执行下面的命令:
mount -t ext4 -o loop system.img newdir该命令是将 system.img 挂载在刚刚创建的 newdir 中,可以在该目录中看到 system 的原文件结构,继续执行:
mkdir sysdir
cp /newdir/* /sysdir/ -r再在根目录创建一个 sysdir 目录,然后把刚刚 newdir 中的所有内容拷贝到 sysdir 中,同时在该目录下按照客户的要求修改相关的内容,修改完后继续执行:
./xxx/rk3288/out/host/linux-x86/bin/make_ext4fs -l 440M -s new.img sysdir这一句是将修改好之后的目录重新打包成为new.img,但是通过 file 命令查看时可以发现它的类型跟之前的system.img不一致:
file system.img
file new.img需要执行下一句才能将它封装成跟 system.img 一样的格式:
./xxx/rk3288/out/host/linux-x86/bin/simg2img new.img new_out.img再通过 file 命令可看到格式一致了,最终的 new_out.img 即是修改好后的 system.img,用烧录软件单独烧录即可。
工具:make_ext4fs、simg2img都在源码目录下面的 out/host/linux-x86/bin/ 下。
因为我在 newdir 下面无法直接修改,有一些格式和权限方面的问题,所以我将所有文件拷贝到一个新目录sysdir中再修改再打包,最终烧录成功。