一、关于OTA包的提取
其实这个问题很好搞定,还是详细给出。。。
首先你需要一个有ROOT权限的文件管理器,R.E.或者ES什么的
然后使用安卓系统的系统更新,下载更新包文件,等下载完成后不要选择更新,选稍后提醒。
用文件管理器打开至根目录,就是下图所示,那个cache文件内就放着下好的zip包,这是官方的OTA升级包。
将它复制出来,先复制到SD卡上,再传输到电脑。
这个弄好了就开始对OTA升级包的ROOT添加操作了。
二、ROOT相关工具添加
这个部分网上也有相关的教程,我也是四处看来的~~~嘿嘿~~~
主要是两个工具的添加:
一个是Superuser.apk和它的su文件,
另一个就是busybox(主要是提供扩展指令作用,部分软件会用到,比如:钛备份)
网上可以搜到,不想自己找的,可以下我打包的附件,里面都有。
安放位置:
将APK文件放入压缩包内的"\SYSTEM\APP"文件夹下,su文件放入"\SYSTEM\BIN" 文件夹下。
(若不安装Busybox,则不需要放入Busybox.apk,并跳过下图,直接进入第三步)
另:这里同样可以对OTA包进行精简操作~~~删除一些不需要的自带软件。当然,完全可以在刷机后,使用金山、360等手机软件管理功能的软件自行卸载处理,有ROOT权限一切都好办~~~
分别在"\SYSTEM\XBIN"放入busybox和zip包根目录下installbusybox文件。
三、对updater-script文件修改(关键部分)
这个是刷机包修改的关键部分,需要十分小心和谨慎,防止出现意外,导致刷机失败。
文件位置:
上图为例:
systemupdate.zip\META-INF\com\google\android目录下
将updater-script文件解压出来,用记事本打开,有如下(以官方4.1.1OTA包为例,其他类似):
assert(getprop("ro.product.device") == "A2109A" ||
getprop("ro.product.board") == "cl2n");
show_progress(1.000000, 180);
set_progress(0.500000);
format("ext4", "EMMC", "/dev/block/platform/sdhci-tegra.3/by-name/APP", "0", "/system"); mount("ext4", "EMMC", "/dev/block/platform/sdhci-tegra.3/by-name/APP", "/system"); package_extract_dir("recovery", "/system");
package_extract_dir("system", "/system");
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf"); symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("mksh", "/system/bin/sh");
symlink("toolbox", "/system/bin/cat", "/system/bin/chmod", "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",
"/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",
"/system/bin/getevent", "/system/bin/getprop", "/system/bin/hd", "/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop",
"/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice",
"/system/bin/kill", "/system/bin/ln", "/system/bin/log",
"/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof",
"/system/bin/md5", "/system/bin/mkdir", "/system/bin/mount",
"/system/bin/mv", "/system/bin/nandread", "/system/bin/netstat", "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",
"/system/bin/ps", "/system/bin/reboot", "/system/bin/renice",
"/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",
"/system/bin/route", "/system/bin/schedtop", "/system/bin/sendevent",
"/system/bin/setconsole", "/system/bin/setprop", "/system/bin/sleep",
"/system/bin/smd", "/system/bin/start", "/system/bin/stop",
"/system/bin/sync", "/system/bin/top", "/system/bin/touch",
"/system/bin/umount", "/system/bin/uptime", "/system/bin/vmstat",
"/system/bin/watchprops",
"/system/bin/wipe");
set_progress(0.650000);
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 02750, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
set_perm(0, 2000, 06750, "/system/bin/run-as");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth"); set_perm(0, 0, 0755, "/system/etc/bluetooth");
set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");
set_perm(0, 0, 0644, "/system/etc/bluetooth/bdaddr");
set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf"); set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks"); set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm(0, 0, 0544, "/system/etc/install-recovery.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm(0, 2000, 0755, "/system/vendor");
set_perm(0, 2000, 0755, "/system/vendor/firmware");
set_perm(0, 2000, 0755, "/system/vendor/firmware/bcm4330");
set_perm(0, 2000, 0755, "/system/vendor/lib");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/lib/drm"); set_perm(0, 0, 0644, "/system/vendor/lib/drm/libdrmwvmplugin.so"); set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_progress(0.800000);
package_extract_file("boot.img",
"/dev/block/platform/sdhci-tegra.3/by-name/LNX");
set_progress(0.980000);
nv_copy_blob_file("blob", "/staging");
unmount("/system");
set_progress(1.000000);
——————————————————————————————
我先对几个指令做下基本介绍,帮助理解,其实也就刚开始看着头疼assert(getprop("ro.product.device") == "A2109A" ||
getprop("ro.product.board") == "cl2n");
这是一个判断,它验证刷机包要求符合的机型A2109A 以及cl2n 的board ,这两个条件必须符合,才能刷这个包。
这是为了安全考虑,防止混刷。但官方包的这个验证会影响我们的刷机,用CWM的Recovery必然会出现条件2的验证无法通过,我直接删除了。
show_progress和set_progress是用来显示和控制刷机进度条的。多几个少几个没什么影响~~~
format、mount用来格式化和挂载分区,无需关注,了解即可。package_extract_dir设定解压目录、symlink(target,link) 对于已有的target 建立一个名为link 的符号连接。
以下是关键部分
et_perm
【语法】set_perm(
【作用】设置单个文件或目录的所有者和权限,像linux中的chmod、chown或chgrp命令一样,只是集中在了一个命令当中
set_perm_recursive
【语法】set_perm_recursive
【作用】设置文件夹及文件夹中的文件的所有者和用户组
【说明】其中
这个2个指令是我们需要用到的,在放入Superuser后,对文件权限的设定就靠它们了。
例如:set_perm_recursive(0, 0, 0755, 0644, "/system");
第一个0,是
用户&用户组中,0代表root,2000代表shell。
权限数据中,以0755为例,这组数据的最后三位755,分别代表所有者\组用户\其他用户的权限,也就是我们在RE管理中“用户\群组\其他”三行。事实上,我们ROOT只需要这后三位就可以了,其它不需要关注。
以XXX来表示这三组权限,其中:×=4 读的权限×=2 写的权限×=1 执行的权限×=0 没有权限
复合权限就是这些数字相加,所以数字权限的格式应为3个从0到7的八进制数。
例如,"读/写"二种权限,把4(可读)+2(可写)=6(读/写)即rw-。要读、写、执行权限,即rwx属性,则4+2+1=7;其它类似。
故,我在updater-script文件中添加上了如下内容:
set_perm(0, 0, 06755, "/system/bin/su");
symlink("/system/bin/su", "/system/xbin/su");
以下部分是添加busybox 的,不安装的可以不添加。
set_perm(0, 1000, 0755, "/system/xbin/busybox");
symlink("/system/xbin/busybox", "/system/bin/busybox");
package_extract_file("installbusybox", "/tmp/installbusybox");
set_perm(0, 0, 0777, "/tmp/installbusybox");
run_program("/tmp/installbusybox");
set_progress(0.750000);/*设定进度条至75%
等等~~~还有什么?对,添加位置!!!
这个也很关键!
为了防止命令被覆盖,或者与其他命令冲突,你需要选择一个较为稳妥的位置。
注意到:
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
对于文件夹属性更改了,故我在该指令之前加入ROOT相关的刷机指令就可以了。
得到了修改后的:
show_progress(1.000000, 180);
。。。(中间略)
set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
set_perm(0, 0, 06755, "/system/bin/su");
symlink("/system/bin/su", "/system/xbin/su");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
symlink("/system/xbin/busybox", "/system/bin/busybox");
package_extract_file("installbusybox", "/tmp/installbusybox");
set_perm(0, 0, 0777, "/tmp/installbusybox");
run_program("/tmp/installbusybox");set_progress(0.750000);
set_perm(0, 0, 0544, "/system/etc/install-recovery.sh");
set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");