
Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg(out/host/linux-x86/bin/)来打包。
在制作手机ROM时,有时会单独编译内核或抽出根文件进行修改内容,比如我只编译内核,其余的地方不变。这样重新安装巨大的Android开发环境实在不划算。因此很多boot.img解包工具被人开发出来,这一些工具都是把内核和根文件系统从一个现成的boot.img抽取出来,修发后再次打包还原。
一.常见的解包工具
因为boot.img的格式比较简单,它主要分为三大块(有的可能有四块)
因此很多人开发分析工具,有是linux shell脚本,比如repack-zImage,也有人采用perl,还有C语言编写的 unbootimg,
我使用的是在源码位置system/core/mkbootimg/ 下的 mkbootimg。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。
使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件mkbootimg ,unpackbootimg。
二.解/打包工具使用
解包工具:unpackbootimg
常见格式
unpackbootimg -i .\tmp\boot.img -o .\out
这一句命令行表示把boot.img解包,所有文件输出到out目录下
它会解压出如下文件:
boot.img-zImage (内核文件)
boot.img-ramdisk.gz (根文件系统打包文件)
boot.img-cmdline (mkbootimg cmdline参数)
boot.img-pagesize (mkbootimg pagesize参数)
boot.img-base (mkbootimg base参数)
打包工具:mkbootimg (Android自带)
常见的命令格式:
./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000
这句含义是把内核文件zImage和boot目录下的根文件压缩包 boot.img-ramdisk.gz打包成boot.img.
其中cmdline和base的值均来源于unpackbootimg的结果
工具/原料Android程序里加载linux内核模块
方法/步骤
java层。 java.lang.Runtime's exec() methods:native层就是jni了。
可以用popen() 。
但指令知否支持就得看bionic了。
也可以尝试system() and pipe。
普通apk不可能有root权限,除非机器被root了,使用Runtime.exec之类的执行su -c insmod xx.kosu为root的象征,配合superuser使用 。
在终端下使用su进入root用户,然后insmod xx.ko这个肯定可以成功的,因为insmod在root用户下执行的。但是Java的Runtime.exec()也好,Native层execl()也好,只能用su -c命令临时在root用户下执行一条指令。adb shell进入终端,普通用户下执行su -c insmod xx.ko,会发现命令执行失败,失败原因就是需要注意的地方,su的-c参数只把下一个变量作为可执行的指令,因此其执行的命令是insmod而参数并没有传递过去,xx.ko作为了su的参数,因此如果想执行成功我们需要使用su -c "insmod xx.ko",将传递给insmod的参数和命令组合成一个参数。这样的话在Java层和Native层执行失败的问题也可以解决了,在Runtime.exec()中将命令格式进行格式化,比如Runtime.exec(“su -c ” + "\"insmod xx.ko\"" ),或者在Native中执行execl("/sytem/bin/su","/sytem/bin/su","-c","insmod xx.ko", NULL),这样最终传递给shell的命令就是su -c "insmod xx.ko"了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)