修改Android镜像文件 ramdisk.img、system.img、userdata.img获取root权限

        首先,介绍一下这三个文件。

        ramdisk.img 是你make android源代码后,生成的/out/target/product/generic/root目录下经过打包压缩而成的。

        system.img 是你make android源代码后,生成的/out/target/product/generic/system目录下经过打包压缩而成的。

        userdata.img 是你make android源代码后,生成的/out/target/product/generic/data目录下经过打包压缩而成的。

        android系统起来后,会把ramdisk.img挂载为rootfs(根文件系统),system.img挂载到ramdisk.img的system文件下, userdata.img挂载到ramdisk.img的data目录下。

        当建立好了开发环境后(eclipse+ADT+SDK),启动eclipse中的虚拟设备,其默认的Android镜像文件位于SDK 目录system-images文件下,当然有不同的等级,我的目录如下:android-sdk-linux/system-images/android-15/armeabi-v7a/。其中除了3个.img文件外,还有一个kernel-qemu,它是linux内核文件,其他的文件都没有什么作用。这个3个文件都可以用你自己生成的文件代替。

         下面开始解压这三个文件,在开始修改前,提醒一下,要备份你的文件。

          首先从最难的ramdisk.img开始,你别看它和其他两个的后缀是一样,其实它跟它们不是同一样的文件格式,从后面的操作就可以看出。

解压:

          1. 新建文件夹 :mkdir tmp tmp/ramdisk tmp/system tmp/userdata.

          2. 拷贝ramdisk.img到tmp,cd tmp

          3. mv ramdisk.img ramdisk.img.gz

          4. gunzip ramdisk.img.gz

          5. cd ramdisk

          6. cpio -i -F ../tmp/ramdisk.img

          这样,ramdisk的文件就都解压到ramdisk里面了。

修改:

          1. 开机用root登录系统,修改init.rc 文件中的:

                       service console /system/bin/sh
                             class core
                              console
                              disabled
                              user shell
                              group log
               user shell 改为user root。

          2. 更改为可写文件,修改init.rc 文件中的:

                        on fs
                           # mount mtd partitions
                           # Mount /system rw first to give the filesystem a chance to….
                           mount yaffs2 mtd@system /system
                           mount yaffs2 mtd@system /system
ro
remount
                           mount yaffs2 mtd@userdata /data nosuid nodev
                           mount yaffs2 mtd@cache /cache nosuid nodev

                        on post-fs
                           # once everything is setup, no need to modify /
                           mount rootfs rootfs /
ro
remount
                   将只读 ro 改为rw可读写。当然,这些有可能不在这个文件里,那肯定再xxx.rc 里面,xxx.rc有很多可以改的,它们可以配置系统的服务。修改好了后,进行压缩

打包:

         方法一:

         1.用mkrootfs制作ramdisk.img,mkrootfs 是android生成的命令:out/host/linux-x86/bin/mkbootfs,可以将此命令拷贝到tmp目录下,在tmp下执行:mkbootfs ramdisk | gzip ramdisk.img.

         方法二:

         在tmp/ramdisk执行:

         cpio -i -t -F ../ramdisk.img | cpio -o -H newc -O ./ramdisk_new.img

         gzip ramdisk_new.img
         mv ramdisk_new.img.gz ramdisk.img           

这样新的img就制作成功了,可以用其代替原来的了。

         system.img 以及userdata.img,因为这两个文件是一样的格式,所以一起说明。

解压:

          它们都是yaffs2 格式的文件,要解压yaffs2文件,需要用到uyaffs,这个网上有源码,我 csdn 资源上也有,要的可以去下载。执行:

          uyaffs2 system.img

          uyaffs2 userdata.img

就会生成对应的文件夹:system、uersdata.系统预装的apk在system/app下,可以删除不需要的apk。

打包:

          使用mkyaffs2image能对yaffs2文件打包,android也会生成:out/host/linux-x86/bin/mkyaffs2image,用法如下:

                 mkyaffs2image tmp/system/ system.img

                 mkyaffs2image tmp/userdata userdata.img

生成img 后,就可以用它们替换原来的了。



1.用file命令查询文件类型

file ramdisk.img --> ramdisk.img: gzip compressed data, from Unix

file system.img --> system.img: VMS Alpha executable

file system.img --> userdata.img: VMS Alpha executable

 

结论:ramdisk.img用gzip打包和解压,file system.img和file system.img用unyaffs解压,用mkyaffs2image压缩而成.

 

2.mkyaffs2image可在out文件夹里查找到(注意是要在编译成功后的out里查找) find out -name mkyaffs2image

  unyaffs下载地址: http://code.google.com/p/tookubuntu/downloads/detail?name=unyaffs.tar.gz&can=2&q=

 

将上述五个文件拷入同一文件夹,以便操作...

 

3.gunzip ramdisk.img.gz解压之后,我们发现它是一个小型的文件系统,包含一些对于启动android的很重要的文件,比如内核启动完后加载的第一个进程init、一些重要的配置文件等,总之它控制着整个android的启动。根据 init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小

 

4.解压system.img

./unyaffs system.img

android的应用程序,所需要的库文件,各种资源,framework jar库等均包含在system.img中.

 

5.解压userdata.img

./unyaffs userdata.img

这里包含部分不太重要的应用程序


使用方法:http://blog.csdn.net/asmcvc/article/details/11770851 工具: unyaffs,mkyaffs2image 其中unyaffs有windows版本和linux版本,mkyaffs2image只有linux版本。 windows版本的unyaffs用法: 把system.img复制到unyaffs的相同目录下,cmd命令下cd到unyaffs的目录下,然后执行命令:unyaffs system.img unyaffs会把system.img解压到其目录下。 linux版本的unyaffs用法: 把unyaffs复制到/usr/bin目录下,并修改权限为可执行。 然后cd到system.img目录下(假定目录为system目录),执行命令:unyaffs system.img 然后对system目录下的文件进行修改。 注意:修改完后的文件要修改一下权限,尽量和其他文件的权限保持一致。例如:chmod 644 framework-res.apk mkyaffs2image用法: 复制到/usr/bin目录下,并修改权限为可执行。 这里以打包system目录为system.img为例,执行命令: mkyaffs2image system system.img 然后把新生成的system.img复制替换掉原:adt-bundle-windows-x86\sdk\system-images\android-17\armeabi-v7a\system.img 执行bat批处理命令启动模拟器: D:\adt-bundle-windows-x86\sdk\tools\emulator-arm.exe -avd AndroidVM -partition-size 128 这里以修改android系统启动画面为例: 打开解包目录下的\framework\framework-res.apk 替换图片:framework-res.apk\assets\images\android-logo-mask.png为下图: 然后对\framework\framework-res.apk文件重新签名,复制到linux下后修改文件权限和原来一致。 然后mkyaffs2image system system.img打包生成新的system.img,替换原来的system.img,并启动模拟器,效果图如下: 修改代码: 工具:odextools(参考:《一键odex批量合并工具odextools的重新整理与使用》)、dexopt-wrapper 其中odextools.bat的代码: 批处理有一处bug:每打包一次会把odex文件删除掉,导致在后面的打包过程中会出现找不到:system/framework/core.odex类似的错误,因此只需要在打包完后不删除odex文件即可,找到del /f !apkx!.odex 1>nul 2>nul改为:::del /f !apkx!.odex 1>nul 2>nul,也就是注释掉这一行代码。 具体使用方法(操作在windows下): 在odextools\romdir目录下创建文件夹:system 利用unyaffs解包system.img后,把所有文件复制到system目录下。 然后运行odextools.bat,如图: 选择一个需要整合odex的目录选项即可。odextools.bat会自动设置环境变量,使用baksmali.jar来反编译odex为smali,然后再调用smali.jar打包为classes.dex, 然后再打包到相应的apk包(framework目录下对应的是jar后缀的,实际上也是个apk包),最后再重新签名。 如果要修改代码,则需要把上面重新打包生成的apk文件,利用常规方法反编译修改smali代码,例如插桩输入log信息。然后再回编译并重新签名。 最后一步:因为system.img中的apk是优化过的,apk主目录下是没有classes.dex文件的,而是一个被优化过的odex文件,用于优化启动速度。 因此需要将修改后的apk包再用dexopt-wrapper优化apk包后生成出odex文件,然后删除apk包里的classes.dex,并在相同目录下放置与apk包同名的odex文件。 按照原system目录的文件结构组织好后,目录复制到linux环境下使用mkyaffs2image重新打包成system.img
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值