Android 必知必会 - 获取手机系统的构建模式
关键词:Android
、Make
、 user mode
、user
、userdebug
、eng
判定手机系统的构建模式、用户模式
编译 Rom 时,需要指定目标构建模式,构建模式有三种:用户模式 user、用户调试模式 userdebug 和工程模式 eng
- 用户模式 user
- 仅安装标签为 user 的模块
- 设定属性 ro.secure=1,打开安全检查功能
- 设定属性 ro.debuggable=0,关闭应用调试功能
- 默认关闭 adb 功能
- 打开 Proguard 混淆器
- 打开 DEXPREOPT 预先编译优化
- 用户调试模式 userdebug
- 安装标签为 user、debug 的模块
- 设定属性 ro.secure=1,打开安全检查功能
- 设定属性 ro.debuggable=1,启用应用调试功能
- 默认打开 adb 功能
- 打开 Proguard 混淆器
- 打开 DEXPREOPT 预先编译优化
- 工程模式 eng
- 安装标签为 user、debug、eng 的模块
- 设定属性 ro.secure=0,关闭安全检查功能
- 设定属性 ro.debuggable=1,启用应用调试功能
- 设定属性 ro.kernel.android.checkjni=1,启用 JNI 调用检查
- 默认打开 adb 功能
- 关闭 Proguard 混淆器
- 关闭 DEXPREOPT 预先编译优化
指定目标构建模式:在
make
命令中加入参数
1
2
3 $ sudo make -j8 PRODUCT-rk312x-user
$ sudo make -j8 PRODUCT-rk312x-userdebug
$ sudo make -j8 PRODUCT-rk312x-eng来源:https://www.kancloud.cn/amoy0226/fireprime_android_compile/105885
判断构建模式
思路:通过观察以上三个模式的属性,这里使用安全检查功能(ro.securero)和应用调试功能(ro.debuggable)两个属性来区分这三个模式:
- user:
- ro.securero = 1
- ro.debuggable = 0
- userdebug
- ro.securero = 1
- ro.debuggable = 1
- eng
- ro.securero = 0
- ro.debuggable = 1
其中,如果只需判断是否为 user 模式,使用 ro.debuggable 一个属性即可。
寻找源码
在 android.os.Build
的源码中我发现一个静态变量:
1 | /** |
但是没有 ro.securero
这个属性,进一步发现其调用的是 android.os.SystemProperties
的 getInt()
函数,那可以直接使用它来获取 ro.securero
的值。
由于是 android.os.SystemProperties
是隐藏类,我们可以使用两种方式来调用其方法:
方法一:使用修改过增加了这些隐藏类的 android.jar 来编译 APK,此方式问题较多,配置繁琐,不推荐;
方法二:使用反射调用,普通 App 即可使用,无限制,推荐使用此方法。
代码实现
先说下方法一下的实现:
1 | /** |
那么方法二只是和方法一的属性获取方式不一样:
1 | /** |
这里未对反射时可能产生的异常做处理,只是简单的返回 0,有需要请自行处理。
总结
android.os.Build
和 android.os.SystemProperties
的源码在 Android SDK 中,很方便寻找,比较困难的一步就是了解到所需的属性和这两个类有关,这就需要对 Android Rom 的编译有一点了解。
PS:如果有什么建议或者问题,可以通过下面的方式和我联系