找了文章一開始以為只要修改init.rc server adbd 的權限就好
service adbd /sbin/adbd
實際上跑得時候發現 adbd 碰沒有跑起來user adb
group shell log adb
改用別的身份login console跑 adbd 出現
cannot bind 'tcp:5037'
這時才知道原來adbd本身需要跑再root的權限上。
trace adbd 的 source code 看看
再system/core/adb/adb.c
int adb_main(int is_daemon) { .... /* run adbd in secure mode if ro.secure is set and ** we are not in the emulator */ property_get("ro.kernel.qemu", value, ""); if (strcmp(value, "1") != 0) { property_get("ro.secure", value, ""); if (strcmp(value, "1") == 0) { // don't run as root if ro.secure is set... secure = 1; // ... except we allow running as root in userdebug builds if the // service.adb.root property has been set by the "adb root" command property_get("ro.debuggable", value, ""); if (strcmp(value, "1") == 0) { property_get("service.adb.root", value, ""); if (strcmp(value, "1") == 0) { secure = 0; } } } } /* don't listen on port 5037 if we are running in secure mode */ /* don't run as root if we are running in secure mode */ if (secure) { struct __user_cap_header_struct header; struct __user_cap_data_struct cap; if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) { exit(1); } ... }由 get property service.adb.root 可得知 login root 時會將secure設成0 轉而往上 trace 發現 source = 1 的情況如下:
ro.kernel.qemu = 0
ro.secure = 1
service.adb.root = 0
這時可以設定的方式有三種:
- 修改code(廢話...),要麼就是讓source 永遠等於0,不然就是再特定地方加上property_set的function。不過這會改到android的code所以不鼓勵。
- 根據網路上其他文章可以發現system起來的時候,會去Load幾個property的檔案。
- 修改init.rc 加入
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
setprop ro.kernel.qemu 0
setprop ro.secure 1
setprop service.adb.root 0
沒有留言:
張貼留言