大家都知道Android分为debug版本和release版本,二者一个重要的区别就是ro.secure属性,这个属性在根目录下default.prop中被定义,debug版本为0,release版本为1。Adb进程会读取这个属性,如果是1,就将自己设为shell用户:
if (strcmp(value, "1") == 0) {
// don't run as root if ro.secure is set...
secure = 1;
...
/* then switch user and group to "shell" */
if (setgid(AID_SHELL) != 0) {
exit(1);
}
if (setuid(AID_SHELL) != 0) {
exit(1);
}
很多同学以为debug版本就是有root权限的版本,其实不然,debug版本只是adb进程可以获得root权限,其他应用依然不能获取root。所谓root其实质是应用可以调用su来改变自己的用户权限。但Android代码里默认su是不允许被非root/shell用户调用的:
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;