android apk 的root 权限和USB adb 权限的区别

USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权限,通常如果adb shell 看到是:
Android 4.0 以后版本:
C:\>adb shell
root@android:/ #
Android 2.3 版本:
C:\>adb shell
#
即表明adb 的连接是root 权限的,相反如果看到是$ 即表明是shell 权限
Android 的APK 本身都是不具备root 权限的,如果想启用root 权限,那么就必须借助具有root 权限的进程或者具有s bit 的文件,目前比较通用的手法是,手机root 后,内置了su到system/bin, 然后普通APP 即可借助su 命令来达到root 权限切换。 
网络上已经有同仁修改su 命令,并通过一个APK 来控制su 命令的权限控制。
 SuperSU: http://forum.xda-developers.com/showthread.php?t=1538053 (更新速度很快,推荐使用)
综上所叙,如果adb 已经有root 权限,那么让apk 行使root 权限就很简单了。
比如在JB 版本或者以前的版本上:
adb remount
adb push su /system/bin
adb push Superuser.apk /system/app
adb shell chmod 0644 /system/app/Superuser.apk
adb shell chmod 6755 /system/bin/su
adb reboot
KK 以后的版本:

* 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

如果是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' $@ > $@.dontaudit
 
 将-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 成功。

(1). adbd 的root 权限
我们通常在debug user 版本问题时, 或者进行user 版本的monkey test 时都会这个工作,以便debug. 可以参考FAQ. 
如果你想user 版本adb root 权限默认关闭, 而在想开启时, 可以通过工程模式中的设置项开启, 那么请USER2ROOT 功能 (L 版本不再支持此功能)。
此功能默认关闭, 如果开启, 需要在ProjectConfig.mk 中设置: MTK_USER_ROOT_SWITCH = yes
同样注意此项功能通常只用于debug 或者 cmcc 送测, 在正式出货版本, 强烈要求关闭, 否则有安全风险.
 
(2). app 的root 权限
app 的root 权限通常是通过执行su 命令来获取。注意的是KK 上, 因为多种限制, 普通的su 难以直接拿到root 权限, 需要做针对性的改动.
通常我们会内置具有控制端的第三方su, 下面以内置SuperSU, 以及使用Google default su 为例进行说明。
(3). 如何内置第三方SuperSU
该方式可以绕过zygote 和 adbd 对Root Capabilities BoundSet 的限制. MTK 目前仅测试KK 以及以前的版本, L 版本后因为SuperSU 还在持续更新中, 请客户查看它官网的说明.
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
并且按照FAQ:  FAQ09021 如何修改系统内置文件的权限, 用户,属性 https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ09021
更新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 位.
按照FAQ:  FAQ09021 如何修改系统内置文件的权限, 用户,属性 https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ09021
更新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 版本(非KK2 MT6752/MT6732), 需要强行解除zygote 和 adbd 对Root Capabilities BoundSet 的限制
更新kernel/security/commoncap.c 中 cap_prctl_drop 函数为:
static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
  //mtk71029 add 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;
}
4.4 如果贵司一定要在K2(MT6752/MT6732) 上开启, 请提交eService, 申请定制的DVM, 放开相关的权限限制.
4.5 如果贵司在L 版本操作, 请按下面的流程:
 4.5.1 更新alps/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp  
  将 DropCapabilitiesBoundingSet(JNIEnv* env) 这个函数置空.

 4.5.2 更新alps/frameworks/base/cmds/app_process/app_main.cpp 的main 函数, 注释掉main函数开始的下面这段代码
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
   // Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
   // EINVAL. Don't die on such kernels.
   if (errno != EINVAL) {
    LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
    return 12;
   }
  }

 4.5.3 更新alps/system/core/adb/adb.c 将should_drop_privileges() 函数, 清空这个函数,直接返回 0 即可.

 4.5.4 将SELinux 调整到permissve mode, 参考FAQ11484: http://online.mediatek.inc/Pages/FAQ.aspx?List=SW&FAQID=FAQ11484
  
重新编译系统, 重新download 后, adb shell 进入后再输入su 看看是否命令行由$切换到#, 如果切换即成功。
 
(5). 在KK 版本后app 使用root 权限受到更加严格的限制, 可以参考FAQ
[FAQ11414] android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
http://online.mediatek.inc/Pages/FAQ.aspx?List=SW&FAQID=FAQ11414
FAQ11538:android KK 4.4 版本后,app 使用root(su) 权限受到严格限制说明
https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11538

Android 系统(67)---android apk 的root 权限和USB adb 权限的区别相关推荐

  1. android 版本权限差别,android apk 的root 权限和USB adb 权限的区别

    USB adb 权限是指,当adb 连接手机时,手机中的守护进程adbd 的权限为root 权限,从而它的子进程也具有root 权限,通常如果adb shell 看到是: Android 4.0 以后 ...

  2. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  3. 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.今天让我先来分析下升级包update.zip. 一 ...

  4. android log抓取方法,Android系统之Android抓取各种log的方法

    Android系统之Android抓取各种log的方法 2018年11月25日 | 萬仟网移动技术 | 我要评论 android之android抓取各种log的方法 1.logcat (四类log b ...

  5. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...

    Android系统构架 PAGE 1 目 录 TOC \o "1-3" \h \z \u 一.Android系统构架 1 二.Linux内核层 2 三.系统运行库层 3 (一)系统 ...

  6. 【android系统】android系统升级流程分析(一)---recovery模式中进行update包升级流程分析

    今天我们直接来看下android中具体的升级过程是如何的. 升级流程概述 升级的流程图: 升级流程分析 第一步:升级包获取 升级获取可以通过远程下载,也可直接拷贝到指定目录即可. 第二步:准备升级 然 ...

  7. Android 系统(11)---android 系统权限大全

    收集到的android权限都很实用的(permission)大全 1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.andro ...

  8. Android 系统(71)---Android系统build.prop文件生成过程

    Android系统build.prop文件生成过程 Android系统build.prop生成过程 这个文件类似于windows的注册表文件,定义了系统初始的一些参数属性,功能的开放等,通过调整或增加 ...

  9. Android系统(62)-----Android 7.1 新特性之 Shortcuts 介绍

    Android 7.1 新特性之 Shortcuts 介绍 Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch.通过在桌面长按 App 弹出 Shor ...

最新文章

  1. node 关键点总结
  2. HDFS Federation在美团点评的应用与改进
  3. 1.MySQL数据库的介绍
  4. C#开发笔记之10-如何用C#根据发票代码判断发票种类?
  5. double 保留两位小数
  6. 二、十六进制数互相转换
  7. 快速入门上手第一课 | 从云计算到 Serverless
  8. 基于python+opencv的图像目标区域自动提取
  9. CodeForces - 468A 24 Game
  10. 10.解决分支合并冲突
  11. IT行业程序员工资一般多少?发量与薪资成反比
  12. win11改win10重装系统教程图解
  13. 服务器装虚拟声卡,虚拟声卡,教您怎么安装虚拟声卡
  14. PDF阅读器开关“手型工具阅读文章”功能
  15. 个人永久性免费-Excel催化剂功能第22波-Excel文件类型、密码批量修改,补齐PowerQuery短板...
  16. redis 集群 实操 (史上最全、5w字长文)
  17. 关于处理npm ERR! Unexpected token in JSON at position...
  18. 计算机组成原理扩展指令CLC实验报告,计算机组成原理实验设计
  19. 性能领域:你知道的越多,不知道的也就越多
  20. [遇到的问题]html中<script>标签无效

热门文章

  1. 卡尔曼滤波 -- 从推导到应用(一)
  2. android 进程有时间片运行,kernel笔记——进程调度
  3. Redis模式对比:主从模式 VS 哨兵sentinel模式 VS Redis cluster模式
  4. mysql 排序后在查询
  5. windosw启动redis
  6. bzoj1449 [JSOI2009]球队收益
  7. mongo-关于仲裁节点
  8. 百度地图个性化模板列表
  9. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)...
  10. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务...