1. 程式人生 > >android user版本如何開啟root許可權

android user版本如何開啟root許可權

                首先您要確認您是想開啟adbd 的root 許可權,還是讓app 也可以拿到root 許可權。
 
(1). adbd 的root 許可權
我們通常在debug user 版本問題時, 或者進行user 版本的monkey test 時都會這個工作,以便debug.
 
如果你想user 版本adb root 許可權預設關閉, 而在想開啟時, 可以通過工程模式中的設定項開啟, 那麼請USER2ROOT 功能。
此功能預設關閉, 如果開啟, 需要在ProjectConfig.mk 中設定: MTK_USER_ROOT_SWITCH = yes
 
(2). app 的root 許可權
app 的root 許可權通常是通過執行su 命令來獲取。注意的是KK 上, 因為多種限制, 普通的su 難以直接拿到root 許可權, 需要做針對性的改動.
通常我們會內建具有控制端的第三方su, 下面以內建SuperSU, 以及使用Google default su 為例進行說明。
 
(3). 如何內建第三方SuperSU
該方式可以繞過zygote 和 adbd 對Root Capabilities BoundSet 的限制.
3.1. 下載SuperSU
 SuperSU: http://forum.xda-developers.com/showthread.php?t=1538053
 
3.2. 內建Superuser.apk 到 system/app
   將su 複製並改名成: daemonsu
   內建su 到 system/xbin
   內建daemonsu 到 system/xbin
   內建chattr 到 system/xbin
   內建chattr.pie 到 /system/xbin
 
3.3. 內建install-recovery.sh 到system/etc
更新alps/system/core/inlcude/private/android_filesystem_config.h
在android_files 陣列的最開始新增.
{ 00755, AID_ROOT,      AID_ROOT,      0, "system/etc/install-recovery.sh" },
 
(4). 如何內建Google default su
4.1 放開Google default su 只准shell/root 使用者使用的限制.
    system/extras/su/su.c 中刪除下面3行程式碼
    if (myuid != AID_ROOT && myuid != AID_SHELL) {
        fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
        return 1;
    }
 
4.2 首先將此編譯出的su 內建到system/bin, 然後修改su 的內建許可權,啟用sbit 位.
更新alps/system/core/inlcude/private/android_filesystem_config.h
在android_files 陣列中
增加
{ 06755, AID_ROOT,      AID_ROOT,      0, "system/bin/su" },
注意這行要放在
{ 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
之前
 
4.3 如果是KK 以及以後版本, 需要強行解除zygote 和 adbd 對Root Capabilities BoundSet 的限制
更新kernel/security/commoncap.c 中 cap_prctl_drop 函式為:
static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
  //begin: Let 'zygote' and 'adbd' drop Root Capabilities BoundSet ineffectively
        if (!strncmp(current->comm, "zygote", 16)) {
                return -EINVAL;
        }
        if (!strncmp(current->comm, "adbd", 16)) {
                return -EINVAL;
        }
        // add end
        if (!capable(CAP_SETPCAP))
                return -EPERM;
        if (!cap_valid(cap))
                return -EINVAL;
        cap_lower(new->cap_bset, cap);
        return 0;
}
重新編譯系統, 重新download 後, adb shell 進入後再輸入su 看看是否命令列由$切換到#, 如果切換即成功。