如何在不使用android:sharedUserId="android.uid.system"的情况下开发Android特权系统应用
核心问题明确答复
- 存在无需使用
android:sharedUserId的特权系统应用开发方案,完全符合Android 10(API 29)及以上版本的官方规范 - 仅使用平台密钥签名即可开发运行特权应用,不需要声明
android:sharedUserId="android.uid.system"属性
具体实现步骤
1. 基础配置要求
- 应用安装路径:将编译好的APK放入系统分区的
/system/priv-app/目录下,该目录下的应用默认具备特权权限申请资格 - 签名配置:使用ROM对应的平台签名密钥对APK进行签名,Android Studio的签名配置示例如下:
// 模块级build.gradle配置 android { signingConfigs { platformSign { // 替换为你自己的平台密钥文件路径和密码 storeFile file("./platform.jks") storePassword "123456" keyAlias "platform" keyPassword "123456" } } buildTypes { debug { signingConfig signingConfigs.platformSign } release { signingConfig signingConfigs.platformSign minifyEnabled false } } }
如果手中只有官方的platform.pk8和platform.x509.pem密钥文件,可通过以下命令转换为JKS格式密钥库:
# 第一步:提取私钥 openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform_private.pem # 第二步:生成p12格式证书 openssl pkcs12 -export -in platform.x509.pem -inkey platform_private.pem -out platform.p12 -name platform # 第三步:转换为JKS格式 keytool -importkeystore -deststorepass 123456 -destkeystore platform.jks -srckeystore platform.p12 -srcstoretype PKCS12 -srcstorepass 123456
2. 权限声明配置
在AndroidManifest.xml中直接声明应用所需的系统权限即可,只要是系统允许特权应用获取的权限,签名匹配的情况下系统会自动授予,无需额外配置。
如果部分特殊权限无法正常获取,可以在定制ROM的frameworks/base/core/res/res/xml/privapp-permissions-platform.xml文件中添加你的应用包名和对应权限的白名单规则。
3. 系统能力访问适配
如果之前依赖共享system UID来访问只有system进程才能操作的系统资源,可以通过以下方式替代:
- 调用系统服务暴露的公开API完成操作,大部分系统能力都有对应的公开接口可以直接调用
- 定制ROM场景下可以自定义AIDL接口,在system服务中实现对应能力后供你的应用跨进程调用
注意事项
android:sharedUserId的设计初衷是让多个同签名应用共享进程和数据空间,并非为了获取系统权限设计,因此废弃后不要继续使用该属性。新的特权应用权限授予逻辑更安全,也更符合系统权限管控的设计思路。
内容的提问来源于stack exchange,提问作者Hyun Chin
相关产品推荐
相关产品推荐

