android user版本如何開啟root許可權
阿新 • • 發佈:2019-02-19
首先您要確認您是想開啟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 看看是否命令列由$切換到#, 如果切換即成功。
(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 看看是否命令列由$切換到#, 如果切換即成功。