说明

应该是2016年之前的记录,之前没有写文档记录的习惯,都是随手记录的txt文件,所以没有图片、格式等。甚至现在看来有些地方逻辑不通(可能还因为年少轻狂,有些偏颇的话语),但是这些与现在的我不重要了,所以也不打算再复现、推理,重新编辑等,仅仅是在旧硬盘中发现,删除之前觉得可能还有点价值,记录下来吧。

1:小米2原系统只要在default.prop中配置如下即可关机状态下开启adb_root:
ro.adb.secure=0
ro.secure=0
ro.allow.mock.location=0
ro.debuggable=1

2:但是貌似4.3起的系统关机状态下都不能以root启动,即使adb shell登录后用特定的su取得root,但是依然无法执行某些root权限,比如挂载分区等。ps -Z查看adbd是shell用户组不是root
做过如下尝试:
使用自己米2下可以关机adb_root的boot中的adbd替换,貌似可以执行分区挂载了。但是adb root启动还是不可以。

替换init后确实可以adb_root启动了,挂载分区也可以,但是ps -Z没有发现u:r:adbd:s0这样的lable,说明selinux没有用,也确实,这个init是4.1的,这个版本没有selinux。另外adb reboot貌似不能执行,说明有些地方不通用的。

对selinux不是很了解,想可能是这方面的问题,网上看到:
service adbd /sbin/adbd --root_seclabel=u:r:su:s0
class core
socket adbd stream 660 system system
disabled
seclabel u:r:adbd:s0
比编译版本自带的init.rc多了–root_seclabel=u:r:su:s0参数,加上测试依然不行,把u:r:adbd:s0改为u:r:su:s0不行

3:思考发现adb root打印adbd cannot run as root in production builds,所以在system/core下面搜索找到system/core/adb/services.c中:
void restart_root_service(int fd, void *cookie)
{
char buf[100];
char value[PROPERTY_VALUE_MAX];
char build_type[PROPERTY_VALUE_MAX];
char cm_version[PROPERTY_VALUE_MAX];

if (getuid() == 0) {snprintf(buf, sizeof(buf), "adbd is already running as root\n");writex(fd, buf, strlen(buf));adb_close(fd);
} else {property_get("ro.debuggable", value, "");if (strcmp(value, "1") != 0) {snprintf(buf, sizeof(buf), "adbd cannot run as root in production builds\n");writex(fd, buf, strlen(buf));adb_close(fd);return;}property_get("persist.sys.root_access", value, "1");property_get("ro.build.type", build_type, "");property_get("ro.cm.version", cm_version, "");if (strlen(cm_version) > 0 && strcmp(build_type, "eng") != 0 && (atoi(value) & 2) != 2) {snprintf(buf, sizeof(buf), "root access is disabled by system setting - enable in settings -> development options\n");writex(fd, buf, strlen(buf));adb_close(fd);return;}property_set("service.adb.root", "1");snprintf(buf, sizeof(buf), "restarting adbd as root\n");writex(fd, buf, strlen(buf));adb_close(fd);
}

}

推论出只有ro.debuggable不为1时才打印这个提示,但是default.prop中配置了,猜测是不是没起作用。使用getprop无法获取任何属性,使用的是4.1米2系统的getprop,尝试用4.3的系统的getprop提示需要libselinux.so,此时system是4.1的,4.3挂载到system1,指定export LD_LIBRARY_PATH=/vendor/lib:/system/lib:/system1/lib没效果,必须把system1放到最前面,但是出现段错误并且其他system下可执行程序需要库文件时就去system1找了,不匹配也是错。懒得搞这个了。cat /dev/__properties__查看属性,不过很多乱码,而且记得源码中好像把这个文件打开之后删除了,所以虽然这个文件实际内容还在,但是已经找不到和不能打开了,但是这里是存在的,可能系统关机状态下和开机流程不一样。如果不存在这个文件,可以使用lsof命令查看:
? /dev/properties
charger_a 196 root 9 ??? ??? ??? ??
类似这样,那么说明196还持有该文件,然后cat /proc/196/fd/9这样也可以查看内容。原理就是文件虽然删除,但是其内容还被引用。其中并没有发现ro.debuggable属性和其他在default.prop中定义的属性,推测很可能根本就没加载这个属性配置文件,接下来测试直接在on charger选项开头添加
这个on charger是在init.aries.rc中,要启动adb shell需要sh,那么还是要挂载个system分区。
mount ext4 /dev/block/platform/msm_sdcc.1/by-name/system1 /system wait ro barrier=1
setprop ro.debuggable 1
原文件也没有关机状态下启动adbd守护的配置,默认是不设置usb的。需要自己添加:
setprop sys.usb.config adb
这个属性值改变会启动adbd服务,如下init.usb.rc:
on property:sys.usb.config=adb
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 18d1
write /sys/class/android_usb/android0/idProduct D002
write /sys/class/android_usb/android0/functions ${sys.usb.config}
write /sys/class/android_usb/android0/enable 1
start adbd
setprop sys.usb.state ${sys.usb.config}
setprop ro.debuggable 1
为了保险这里再添加一次debuggable。这样之后虽然adb shell启动不会像米2原boot一样直接就是#,但是可以执行adb root了,之后adb shell就直接#了

4:米2原boot,即自己的4.1中有如下:

Restart adbd so it can run as root

on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1

加到4.4的rc中也没用,貌似版本变化吧,好像测试时用4.1的adbd时执行adb root,手机画面重启了,说明service.adb.root=1触发了,那么也就是adb root就是传递了这个值。
但是4.4的adbd却没反映,说明没有传递该值,呵,看上面的adb的services.c也确实没有。

5:根据adb的services.c看到adb root其实主要就是一条命令:setprop service.adb.root 1
剩下的就是测试和有时间再看init源码看是否跳过了属性文件的加载解析。
把on property:sys.usb.config=adb对debug的设置去掉,保留一个即可,测试把启动adb放在on charger中靠前位置,想尽早的启动adb好调试,不过测试好像没什么差别,为了稳定还是放在cpu设置后面吧。

6:测试发现直接在rc中设置service.adb.root是没有用的。即使在adb shell中设置也没用。不过在adb shell中设置setprop ro.debuggable 1之后adb root是可以的。说明重要的值还是ro.debuggable

7:正确的配置如下:
setprop sys.usb.config adb
setprop ro.debuggable 1
setprop service.adb.root 1

这样启动adb shell默认就是root了。和米2boot一样了。至于三个设置的顺序有没有要求不确定,因为不确定service.adb.root 1的时候触发了那些操作,原来的4.1是直接重启一下adbd和usb口。4.4的是在property_contexts:32:service.adb.root u:object_r:shell_prop:s0定义了,所以把从4.1boot拷贝的触发事件注释或删掉,避免多重置一次usb口。
我想终究还是selinux的原因,因为通过自己的su文件取得root有些操作做不了应该就是selinux的限制,有时间再研究。

貌似以下是临时关闭selinux,默认是Enforcing,setenforce设置,1是Enforcing,0是Permissive。
root@android:/#getenforce
Enforcing
root@android:/ # setenforce 0
root@android:/ # getenforce
Permissive

关机状态下开启adb_root相关推荐

  1. 关机状态下启动微型计算机叫做,湖南省计算机等级考试题库

    2016年计算机等级考试开始了,下面yjbys小编为大家整理了湖南省历年计算机等级考试题,希望能帮助到大家! [1] 对待计算机软件正确的态度是( ). [参考答案C] [A] 计算机软件不需要维护 ...

  2. 虚拟机未关机状态下关闭windows主机导致网络连接不上,虚拟机中无ens33文件的解决办法

    目录 前言 解决步骤 总结 前言 最近在学习mysql高级的过程中,发现一个问题.那就是当vm虚拟机没有关机,就关闭电脑主机,第二天用xshell连接发现连接不上.去虚拟机中使用ifconfig查看发 ...

  3. android 音量键 长按,安卓手机强制恢复出厂设置 一般是关机状态下按住音量键下...

    讲到手机,我们很多人都知道,有人问安卓手机强制解锁里面的信息都还有吗,当然了,还有人问安卓手机忘记锁屏密码怎么办,这到底是咋回事?实际上手机怎么强制恢复出厂设置呢,下面小编就为大家说说安卓手机强制恢复 ...

  4. 关机状态下启动微型计算机叫什么,微机的冷启动方式是什么?

    满意答案 stuv165 2018.01.04 采纳率:50%    等级:11 已帮助:5608人 冷启动,电脑的一种启动方式.就是切断电脑的电源,重新启动,一但冷启动,内存的东西全部丢失,重新检测 ...

  5. 搜狗输入法中文状态下开启和关闭英文自动提示

    中文状态下右键搜狗输入法图标,选择英文输入 也可以使用快捷键 Ctrl+Shift+E 但前提是搜狗输入法的系统快捷键要启用

  6. 关机状态下启动微型计算机叫什么,教你电脑关机后自动重启是什么原因

    很多朋友都想要知道电脑关机后自动重启有什么原因,其实电脑关机后自动重启是非常简单,如果大家想要了解的话,小编当然会告诉大家电脑关机后自动重启的原因!下面就给大家带来电脑关机后自动重启原因的介绍吧. 小 ...

  7. 安卓6.0+关机状态下通电自动开机方案

    用途:手机改造成车载GPS.行车记录仪等等 需要的工具: 已root权限.已解BL锁的安卓机器 [镜像助手]负责提取和刷入boot.img [镜像工厂]负责boot.img的解包和打包 [MT管理器2 ...

  8. 曝新款苹果手机将采用低功耗微处理器,Find My定位在关机状态下也能使用

    MacRumors 论坛上一位消息人士称,苹果 iPhone 15 Pro 和 Pro Max 将使用低能耗微处理器,即使在手机关机时也能保证某些功能的使用,并为新的电容式固态按钮(触感反馈按键)提供 ...

  9. 战神笔记本如何打开/关闭关机状态下USB供电

最新文章

  1. 结构体数组与指针习题
  2. 如何使用华为云的计算资源进行深度学习(ModelArts)
  3. centos7 mysql安装
  4. powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键
  5. jQuery可放大预览的图片滑块
  6. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享
  7. Orchard Core一分钟搭建ASP.NET Core CMS
  8. 访问云服务器储存的mp4_访问云服务器储存的mp4
  9. PDMS Pipeline Tool 教程(一):安装说明
  10. 【位操作笔记】位合并 通过掩码
  11. opencv_python阈值处理
  12. 深眸分享——一文看懂倍频器的原理及其应用
  13. 用SDK包开发K66FX18学习笔记(1)
  14. 神奇相机将照片变文字 超大相册搜图无压力
  15. 关于多项目的资源管理方法[范文学习]
  16. js实现随机头像聊天框无外链
  17. 【多图软文】使用Team@OSC进行团队协作
  18. Ubuntu Linux 锐捷 ruijie 认证成功 校园网 西电 老校区 新校区
  19. git merge和rebase的区别
  20. Java 正则表达式工具类大全

热门文章

  1. .Net工程师面试笔试宝典
  2. 单片机c语言sden,电力系统中多通道同步采样ADC(AD7606)与浮点DSP(ADSP-21479)通信的设计与实现...
  3. 数字化车间数字孪生在线3d地图数据可视化定制
  4. 嵌入式系统工程专业就业方向与前景分析
  5. Linux搭建部署Ldap服务器,亲测可用
  6. C语言督学营 学习笔记 (Day11~12)
  7. 前端框架Layui学习五:弹出层和数据表格
  8. 寒江独钓(2):串口的过滤
  9. RFID Hacking–资源大合集
  10. 动态下载苹果提供的多种中文字体