修改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实现不同



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

相关文章推荐

MTK平台user版本下怎样开启和抓取MTKlog

user版本抓取恢复出厂设置的开机log,是让人烦恼的事情,一般可以通过在编译的时候修改MTKLog的配置来达到目的,但这不是最简单有效的方法 (一)打开root权限 a...

Android5.0以上编译Root权限

修改一下几个地方: //mt6580为当前工程芯片,不同的选择不同目录,如mt6580,mt6735,mt6753 1.  alps\bootable\bootloader\lk\platform\m...

如何默认打开user版本 debug 选项, 默认打开adb 连接

如何默认打开user 版本的USB debug 选项, 默认打开adb 连接 [Keyword] 量产版本 user usb debug root adb 连接 ...

MTK Android user版本如何打开root权限

[FAQ11862]user版本如何打开root权限  [Description]  user版本怎么打开root权限  [Keyword]  user root adb superuser 用户版...

全志R16调通USB接口的WIFI:RTL8188CUv1.0版本.txt

全志R16调通USB接口的WIFI:RTL8188CUv1.0版本.txt 2017/4/5 16:56 开发板:SC3817R OS/SDK:Android4.4.2/Parr...
  • wb4916
  • wb4916
  • 2017年04月06日 14:29
  • 365

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

转自 http://blog.csdn.net/mirkerson/article/details/19175489 adb 的root 权限是在system/core/adb/ad...

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

分类: Android MTK2013-12-11 18:00 427人阅读 评论(0) 收藏 举报 csdnAndroidgoogleapkframeworks 前言     ...

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

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

android boot.img 拆包,修改adb 具有root权限,以i9250为例

Android 系统的rom最主要的就是3个文件:boot.img、system.img、userdata.img。其中boot.img 存放着内核以及Android系统的配置信息,比如android...

Android 获取Root权限之后的静默安装实现 代码示例分析&&源码下载

droid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但是如果之前没有接触过就需要花好多时间去研究解决。 今天,总结介绍一下 获取Root权限之后的静默安装和进门卸载功能的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修改Android源码,开启adb的Root权限
举报原因:
原因补充:

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