前面是手工load policy,手工修改文件的selinux label。更进一步就应该让image中的file_context和sepolicy两个文件保留正确的数据。这样系统一启动用的就是正确的配置。而我还不想去build全部cm代码,简便的作法是解开image,修改文件,然后再制作image。
一、解开image。这很简单,image只是一个zip文件:
mkdir cm; cd cm; unzip ../xxx.zip
这时看到有一个目录META-INF,目录中内容是:
com/android/{metadata,otacert}
com/google/android/{update-binary,updater-script}
关于此目录中文件内容,可以参考http://andwise.net/?p=115
这个目录与android应用签名机制有关,可参考:http://developer.android.com/tools/publishing/app-signing.html
二、修改文件,将file_contexts替换,但还不够,还需要替换boot.img中的file_contexts和sepolicy文件。boot.img实际就是linux中的initramfs。关于其结构可参考:http://android-dls.com/wiki/index.php?title=HowTo:_Unpack%2c_Edit%2c_and_Re-pack_Boot_Images
在该网页可下载两个工具,是用perl写的。一个用来解开img,一个用来制作img。我更喜欢直接用命令,替换完file_contexts和sepolicy后就可以用下面的命令制作新的boot.img了。
find .|cpio -o -H newc | gzip > ../new_ramdisk.cpio.gz
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel <kernel_file> --ramdisk <ramdisk_file> -o boot_new.img
mkbootimg是android工具,如果没有可以到下载的aosp源代码目录执行:
. build/envsetup.sh
make mkbootimg
然后可以在out/host/linux-x86/bin下找到它。
三、重压缩
rm -rf META-INF
zip -9 -r ../new.zip *
四、签名
1、生成密钥
keytool -genkey -v -keystore ~/.android/my-release-key.keystore -alias first -keyalg RSA -keysize 2048 -validity 10000
验证一下:
keytool -list -keystore ~/.android/my-release-key.keystore -v -storepass <password>
2. 签名
jarsigner -verbose -keystore ~/.android/my-release-key.keystore ../new.zip first
几点过程中的技巧
a) 可以用diff -rq比较两个目录,一个处理前,一个处理后,只列出变化的文件名
b) 在android/linux中,flash memory分区信息在/proc/mtd,备份分区可以用命令:
cat /dev/mtd/mtd1 > /sdcard/mtd1.img
c) 多个android设备连接时,可以用:
adb -s <device id> shell
来使用adb连接设备
d) 改变default.prop文件,将ro.secure=1改为0后,su的进程继承有变化。