修改Android源码,开启adb的Root权限

原创 2016年08月31日 09:52:07
 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' $@ > $@.dontaudit
 将-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng
 
即第一种方法在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' $@ > $@.dontaudit
 将-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng  
 
即第二种方法在android L(5.0) 以后你需要改(1),(3).  
当修改完成后,只需要重新build bootimage ,然后download 即可,然后到setting 中开启debug 选项,adb 连接后,会显示 #, 即root 成功。

如果想实现开启关闭ROOT的控制开关,只需要在system/core/adb/adb.c 的控制逻辑中做修改,我们只需要控制实现全局变量,控制其值实现ROOT开关控制,开启的话should_drop_privileges()返回0,否则返回1;

关于系统全局变量可以查一下SystemProperties,c和java实现不同



版权声明:本文为博主原创文章,转载请标明来源。

Android 如何永久性开启adb 的root权限 M

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net       ...
  • luckkof
  • luckkof
  • 2013年12月11日 18:00
  • 9696

设置默认adb 调试

设置默认adb 调试 用adb调试android设备时,首次连接时,会出现一个授权提示: error: device unauthorized. Please check the confirma...
  • a623891391
  • a623891391
  • 2016年06月03日 09:07
  • 3426

关于adbd进程的ROOT权限问题

adbd源码位于system/core/adb/目录下,可执行文件位于/sbin/adbd。通过adb执行ps命令,结果如下:USER     PID   PPID  VSIZE  RSS     W...
  • a345017062
  • a345017062
  • 2011年03月16日 18:56
  • 32606

/default.prop中的ro.secure

ro.secure=1后,su的行为改变 adb shell: uid=0 gid=0 context=u:r:shell:s0 su       : uid=0 gid=0 context=u:...
  • xiaoxiangfu
  • xiaoxiangfu
  • 2013年12月08日 21:05
  • 979

Android应用程序永久获取root权限方法

在项目的过程中,有可能会要实现类似360优化大师、安卓优化大师的软件搬家、静默安装等需要root权限的功能,或者类似SET_PREFERRED_APPLICATIONS、MOVE_PACKAGE 等需...
  • mergerly
  • mergerly
  • 2013年12月26日 11:34
  • 25388

安卓源码--添加root权限

KK版本: 1、修改 alps\system\extras\su\Android.mk LOCAL_MODULE_TAGS := debug 改为 LOCAL_MODULE_T...
  • muyang_ren
  • muyang_ren
  • 2015年10月30日 10:23
  • 1964

Android实现系统ROOT, 并能赋予app root权限

1. 获取root权限 -->  修改adb源码     a. 打开 system/core/adb/adb_main.cpp,或者是 system/core/adb/daemon/main.cpp ...
  • LoongEmbedded
  • LoongEmbedded
  • 2016年08月16日 14:44
  • 3072

Android4.4添加busybox 支持——基于Android Bionic库

Android 的toolbox没有自动补齐,命令少,对于开发人员还是需要busybox,直接移植官方的busybox会有很多问题,这里简单阐述cyanogenmod提供的针对android bion...
  • zhanglongit
  • zhanglongit
  • 2015年01月04日 11:11
  • 3468

原生源代码移植

原生“设置”源代码的移植,将其中的一块功能移植到一个单独的应用,然后和系统源码一起编译生成apk,安装到手机中。 问题: (1)生成的apk安装到手机上不会和原有的设置中的相同功能...
  • zxl331288
  • zxl331288
  • 2015年05月13日 15:30
  • 235

让Android adb运行在ARM平台上

对android/system/core中的adb打上如下补丁: From e8853dc01a99fddd57b375c29489cd817ddebc2d Mon Sep 17 00:00:0...
  • 21cnbao
  • 21cnbao
  • 2012年05月02日 11:11
  • 7125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改Android源码,开启adb的Root权限
举报原因:
原因补充:

(最多只允许输入30个字)