Android Root 原理

题外话:最近确实很闲,因此想要升级nexus 7了。可是安装了twrp recovery之后,OTA升级总是不成功,出现error: has unexpected content。前面也讲过怎么擦除后升级。 也可以只擦除system和boot分区,这样不会影响数据。但总这样不是办法,网上说用Philz Touch Recovery,感觉还是不靠谱,索性就换了个cyanogenmod(CM)的ROM。感觉很OK!接下去就了解了一下root的原理。

Root原理

android约等于linux。这就导致android对root的处理方式也类似与linux。看他的su源文件。截取如下:

就是说只有ROOT用户和SHELL用户(adb shell)可以获得root权限,之后启动setuid的shell。这不是坑爹吗。所以我们要改的话要把下面的条件去掉,然后编译。 (怎么编译后面讲) 其实这只对4.3以前的android有效,现在android增加安全方面的考虑,禁止setuid了。而现在的root方式比较复杂,可以看superuser的源代码。

编译su

有人就喜欢动手尝试,我也是。编译这个需要懂交叉编译。有点麻烦,而且编译出来的是静态的,先不管。所以直接使用NDK,Superuser也是采用这种方法。其实可以编译任意c代码。写个helloworld就行了。

替换su

既然su可以用shell运行,那连上电脑不就行了。但是无论是adb shell还是adb root都不行,adbd cannot run as root in production builds,这有点蛋疼。简单方法果然不行,所以还是要用recovery,怎么刷recover,就不提了。我用的是TWRP,总感觉比CWR好用。然后方法就多了,可以先把su复制到普通文件夹,然后在TWRP中移动到/system/xbin。或者直接adb sideload,这个方法要写edify脚本,见链接。

SuperUser

实际上root复杂的多,像SuperUser要对能获取root权限的app进行管理,否则肯定会悲剧。参照源码,可以得到如下流程图(来自http://www.imooc.com/video/2570)。

superuser

编译android

还是闲的蛋疼,所以试着编译android。可是主页上说要16G内存才行,我加上swap才8G。不管先试。tmd,编译了4个多小时,还是没编出来。观察编译过程,主要是chromium在编译,最后内存飙到7G,我也顶不住了,就放弃了。看个内存跳舞的图。android也快出x64的了,详见01.org

memory-building

链接

  1. Edify script language, Make Flash Zip
  2. android su source code, superuser su, linux susuperuser
  3. building
  4. imooc

Nexus 7 手动更新4.4 和安装MultiROM

保留用户数据的更新

google下载Factory Images,解压之后看看里面的shell脚本写了什么,然后不要flash分区userdata就行了。如

recovery我用的是TWRP所以就下载TWRP的更新。

然后root


如果你想完全擦除,更新,就这么来。

注意,以下操作会格式化你的设备,请谨慎操作,备份数据。

由于要更新到Android 4.4 KitKat,但是没有收到OTA,因为我本来就有安装MultiROM,所以有可能因此检查到的更新都是4.3. 但是我已经更新到4.3了啊。好吧,先不管他,手动升级MultiROM和Android好了。

在此之前,先说明一下android的分区,参考Android Partitions。共有两部分(有可能存在误区):

  • internal memory partition
    • /boot
    •  启动分区,跟普通linux的boot差不多,里面是linux压缩的内核。小心操作,变成砖就不好了。
    • /system
    •  系统分区,放android整个系统。还有系统应用,和预先按照的应用。刷了这个分区完全不要紧,有recovery和boot在,再刷个ROM就行了。
    • /recovery
    •  如其名,“恢复”,具体介绍。官方的recovery基本没用。所以刷recovery才是真正应该做的事,他能提供很多底层的操作。感觉最好的还是 TWRP
    • /data
    •  数据分区。安装的app,设置什么的。恢复原厂设置就是格了这个分区。
    • /cache
    •  缓存。放一些经常使用的文件数据,刷了他会自动恢复。
    • /misc
    •  这里面好像比较重要,涉及硬件比如USB的配置,反正不会用到,不动就是了。
  • sdcard
    • /sdcard
    •  这个应该是最熟悉的,是我们唯一能看到的。放视频啊什么的。备份这个大概就能保留你想要保留的东西了。

 

因为直接升级4.4,没搞定而改变了策略,打算全部格了重来. 所以我直接下载了Factory Image.然后整个格了重装了.如果不想格式化,可以直接尝试 nexus 7 wifi OTA,然后用 adb sideload. 反正我是失败了. 完全重新安装,正好瘦瘦身,而且google自己有备份,应用会自动安装回来.所以不怕了.这次我操作的设计 /data /boot /system /recovery。

下载4.4文件:Google  Factory Image

这里注意啊,分清mobile 和 wifi 简直就是坑爹.  我是完全重新安装,大部分都被我格式化了.当然还必需有adb,准备完毕后。

原厂文件刷入ok了.就能进入展现的android界面.

接下去就是刷recovery 和 安装MultiROM.

首先参考 xda MultiROM,下载3样东西:

  1. MultiROM
  2. Modified recovery (TWRP 2.6.3.0)
  3. Kernel w/ kexec-hardboot patch (stock 4.4)

其实MultiRom可以不下载,直接去APP store 下载一个app, 这样还可以更新,更加方便.

刷ROM什么的都要enable debug,如果连上电脑adb devices还是没有反映,就试试下面的命令.其中idVendor可以用dmesg看到.18d1是Nexus 7 的.

接下去就是正式刷Recovery. 用的是TWRP,我觉得比CWR更好用.

重启把 MultiROM的zip文件放到根目录下,然后重启在TWRP中安装即可.

还要root: