Androidがadbのroot権限を永久的に開く方法

3932 ワード

[Solution]
adbのroot権限はsystem/core/adb/adbである.cで制御する.主な根拠ro.义齿debuggableなどのsystem propertyで制御します.
デフォルトはアーカイブro.secureが0の場合、root権限を開き、1の場合にroに従う.debuggableなどのオプションでroot権限を開くことができるかどうかを確認します.このためadbのroot権限を永続的に開くには、2つの変更方法があります.1.システムpropertyを変更します.ああ、そうだ.secure=0. 2.adbを修正する.cでroot権限の判断ロジックをオンにします.*LバージョンでadbはSELinuxの影響を受けるため、SELinux policyの設定を調整する必要がある.以下、この2つの修正方法を詳細に説明する:第1の方法.システムpropertyを変更します.ああ、そうだ.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))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
 
すなわち、第1の方法は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  
  
すなわち、第2の方法はandroid L(5.0)以降に(1)、(3)を変更する必要があります.  
  
[テストと確認]
修正が完了したら、build bootimageを再build bootimageし、downloadするだけで、settingでdebugオプションをオンにし、adb接続すると、#、すなわちrootが成功したと表示されます.