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