如何永久性開啓adb 的root權限

轉載連接:https://onlinesso.mediatek.com/Pages/FAQ.aspx?list=SW&FAQID=FAQ06317



[Description]
如何永久性開啓adb 的root權限
 
[Keyword]
user debug root adb adbd
 
[Solution]
* adb 的root 權限是在system/core/adb/adb.c 中控制。主要根據ro.secure 以及 ro.debuggable 等system property 來控制。
默認即檔ro.secure 爲0 時,即開啓root 權限,爲1時再根據ro.debuggable 等選項來確認是否可以用開啓root 權限。爲此如果要永久性開啓adb 的root 權限,有兩種修改的方式:
1. 修改system property ro.secure, 讓ro.secure=0。
2. 修改adb.c 中開啓root 權限的判斷邏輯。

在L 版本上adb 會受到SELinux 的影響, 所以需要調整SELinux policy 設置.

下面詳細說明這兩種修改方式:
第一種方法. 修改system property ro.secure, 讓ro.secure=0。
(1)修改alps/build/core/main.mk 
ifneq (,$(user_variant))
  # Target is secure in user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1

將ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 改成 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 即可。

(2)在android JB 版本(4.1) 以後,google 從編譯上直接去除了adbd 的user 版本root 權限, 爲此您要修改system/core/adb/Android.mk 中的編譯選項ALLOW_ADBD_ROOT, 如果沒有打開這個選項,那麼adb.c 中將不會根據ro.secure 去選擇root 還是shell 權限,直接返回shell 權限。因此您必須需要Android.mk 中的第126行:
    ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
    ===> ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT)))

(3)在android L (5.0) 以後, google 默認開啓SELinux enforce mode, 需要在user build 上將su label 默認build 進SEPolicy.
   放開SELinux 的限制. 更新alps/external/sepolicy/Android.mk 116 行,  將su label 默認編譯進入sepolicy.
 sepolicy_policy.conf := $(intermediates)/policy.conf
 $(sepolicy_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
 $(sepolicy_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
 $(sepolicy_policy.conf) : $(call build_policy, $(sepolicy_build_files))
  @mkdir -p $(dir $@)
  $(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
   -D target_build_variant=$(TARGET_BUILD_VARIANT) \
   -D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
   -s $^ > $@
  $(hide) sed '/dontaudit/d' $@ > [email protected]
 
 將-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng

如果是N 版本, selinux policy 已經搬移到 alps/system/sepolicy.
 
即第一種方法在android L(5.0) 以後你需要改(1),(2),(3). 
    
第二種方法. 修改adb.c 中開啓root 權限的判斷邏輯。這裏針對4.1 以後版本 和4.1以前版本有所區別。
(1).如果是JB 4.1 以後版本,直接修改函數should_drop_privileges() 函數, 清空這個函數,直接返回 0 即可。返回0 即開啓root 權限。

(2).如果是JB 4.1 以前版本,直接修改函數adb_main 函數,在
    /* don't listen on a port (default 5037) if 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);
        }
  
在這段代碼前加一行:

    secure = 0;  //mtk71029 add for root forever.

    /* don't listen on a port (default 5037) if 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);
        }
  
(3)在android L (5.0) 以後, google 默認開啓SELinux enforce mode, 需要在user build 上將su label 默認build 進SEPolicy.
   放開SELinux 的限制. 更新alps/external/sepolicy/Android.mk 116 行,  將su label 默認編譯進入sepolicy.
 sepolicy_policy.conf := $(intermediates)/policy.conf
 $(sepolicy_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
 $(sepolicy_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
 $(sepolicy_policy.conf) : $(call build_policy, $(sepolicy_build_files))
  @mkdir -p $(dir $@)
  $(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
   -D target_build_variant=$(TARGET_BUILD_VARIANT) \
   -D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
   -s $^ > $@
  $(hide) sed '/dontaudit/d' $@ > [email protected]
 
 將-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng  

如果是N 版本, selinux policy 已經搬移到 alps/system/sepolicy.
  
即第二種方法在android L(5.0) 以後你需要改(1),(3).   
  
[測試與確認]
當修改完成後,只需要重新build bootimage ,然後download 即可,然後到setting 中開啓debug 選項,adb 連接後,會顯示 #, 即root 成功。


[相關FAQ]
JB 版本後user build + eng bootimage 無法開機
如何打開user debug選項
JB 4.2 user 版本的開發選項不見了,如何打開adb debug




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章