为了实现Android永久性开启ADB的root权限,我们需要了解Android系统中adb服务的运行原理以及root权限的管理机制。本知识点将详细解析这一过程,包括对adb权限管理的相关文件和属性进行修改,以及如何在不同版本的Android系统中实现永久开启root权限。
要了解adb的root权限是如何被控制的,关键在于分析`system/core/adb/adb.c`文件。这里控制着adb是否以root权限运行的逻辑是基于系统属性`ro.secure`以及`ro.debuggable`等的值。当`ro.secure`的值为0时,adb默认以root权限运行;当为1时,则需要进一步根据`ro.debuggable`等属性判断是否可以启用root权限。
接下来,根据描述,永久性开启adb的root权限的两种修改方式如下:
第一种修改方式是直接修改系统属性`ro.secure`。具体操作是在`alps/build/core/main.mk`文件中找到以下代码段:
```makefile
ifneq (,$(user_variant))
# Target is secure in user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
```
将`ro.secure=1`更改为`ro.secure=0`,这通常意味着你需要修改Android.mk文件中的第126行,将其中的条件判断由:
```makefile
ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
```
改为:
```makefile
ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT)))
```
这样做的效果是改变系统构建时的默认安全策略,允许root权限的使用。
第二种修改方式适用于Android JB版本(4.1)之后,这时Google从编译层面移除了对adbd的user版本root权限的支持。为了重获root权限,需要对`system/core/adb/Android.mk`中的编译选项`ALLOW_ADBD_ROOT`进行设置。如果此选项未打开,则adb.c文件中将不会根据`ro.secure`去选择root还是shell权限,而是直接返回shell权限。因此,要修改adb.c中的代码,根据不同的Android版本(4.1之后和4.1之前),采取不同的操作。对于Android 4.1以后的版本,需要直接修改`should_drop_privileges()`函数,将其清空并直接返回0,表示开启root权限。完成修改后,需要重新编译boot镜像,通过download命令下载到设备上,接着在设置中开启debug选项,然后使用adb连接设备,如果显示`#`符号,那么就表示root成功。
补充知识方面,为了判断adb是否已经拥有root权限,可以使用`adb root`命令。如果返回`restarting adbd as root`信息,则说明拥有root权限;如果返回`adb cannot run as root in production builds`,则说明没有root权限。
此外,如果需要更改`system/app`中的内容,通常情况下这些分区是只读的,需要使用`adb remount`命令来重新挂载分区,使其可读写。这一步骤也需要先通过`adb root`来获取root权限。若要将应用预置为系统应用,仅仅将apk文件拷贝到`/system/app`目录下是不够的,还需要修改权限为777,使用`chmod 777 target.apk`命令。完整的操作步骤包括:`adb root`、`adb remount`、`adb push target.apk /system/app`,然后通过`adb shell`进入到系统目录进行修改或替换。
还涉及一些其他命令的使用,比如`adb push`用于上传文件到设备,`adb shell`用于执行shell命令,`mount`用于查看当前的挂载情况,以及`mount -o remount,rw`用于重新挂载系统分区为可读写模式,`su`命令用于切换到root用户执行操作。不过,需要注意的是,并不是所有设备上都有`cp`和`mv`命令,某些设备上这些操作可能需要特殊方式处理。
总结来说,要实现永久开启Android的adb root权限,通常需要对系统的编译文件或运行时参数进行修改。不过,这些操作通常需要对Android系统有深入的了解,而且可能会带来安全风险,可能使设备失去保修或者造成系统不稳定。因此,在进行这类操作之前,请确保你已经完全了解所做修改的后果,并确保在安全的环境中进行实验。