添加系统级权限
当我们在项目中添加系统级权限时,运行时会有错误提示如下:
Installation did not succeed.
The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
之所以报错,是添加系统级权限之后还需要在目标系统的platform密钥来重新给apk文件签名。我这里用的签名文件是从目标系统中找到的,不是自己生成的。(目标系统是你的apk要安装的Android设备使用的Android系统)
这里以android.uid.system权限为例来说明我们开发的Android应用是怎么获取到该权限的
一、Android项目中添加系统级权限
1. 添加系统级权限
AndroidManifest.xml中添加sharedUserId属性
android:sharedUserId="android.uid.system"
2. 添加已有的签名到build.gradle
添加签名文件的storePassword(密钥库密钥)、keyAlias(密钥标识名)、keyPassword(密钥密码)
android {
signingConfigs {
platform {
storeFile file('D:\\aaa.keystore')
storePassword '123456'
keyAlias 'aaa'
keyPassword '123456'
}
}
}
3. Android Studio选择File->Project Structure->Modules
在Signing Configs里可以看到platform已经添加到了Modules中。确认添加成功即可,不做任何变动
Build Variants这一栏是生成apk的配置,内置了有两种生成apk的方式,分别是debug和release
debug用于调试,平时我们把项目代码写好编译完成后默认用的是debug生成的apk;
release用于正式发布供用于下载安装,这种方式需要先创建密钥库(密钥库是apk的证书,当apk有更新时,是需要证书匹配才能更新的),填写了一串信息后通过Build->Build Bundles/APKS->Build APKs生成apk
回到正题,Build Variants中选择生成方式后,在Signing Config中添加要用到的签名,保存并退出窗口
最后,修改发布版本,在android studio界面的左下角,修改build variant,接着,run即可运行项目,可以发现IDE不再报错了,android:sharedUserId=“android.uid.system“权限已经添加到应用中了
二、sharedUserId属性介绍
一般的,每一个apk都具有一个userid,对于安装在设备中的apk文件,Android会根据userid来给它分配一个Linux用户ID进行管理,并且为它创建一个沙箱,以防止影响其他应用程序(或被其它应用程序影响),即属于不同Linux用户ID的apk之间是不能进行通讯的。
但是,某些时候我们开发了多个apk并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现,只需要保证这些apk的shareUserId相同即可,值可自定义,如android:sharedUserId=“my_id“
三、不同sharedUserId权限
系统中所有使用android.uid.system作为共享UID的APK,都会首先在AndroidManifest.xml节点中增加android:sharedUserId=”android.uid.system”,然后在Android.mk中增加LOCAL_CERTIFICATE := platform
系统中所有使用android.uid.nfc作为共享UID的APK,都会首先在AndroidManifest.xml节点中增加android:sharedUserId=”android.uid.nfc”,然后在Android.mk中增加LOCAL_CERTIFICATE := platform
系统中所有使用android.uid.se作为共享UID的APK,都会首先在AndroidManifest.xml节点中增加android:sharedUserId=”android.uid.se”,然后在Android.mk中增加LOCAL_CERTIFICATE := platform
系统中所有使用android.uid.shared作为共享UID的APK,都会在AndroidManifest.xml节点中增加android:sharedUserId=”android.uid.shared”,然后在Android.mk中增加LOCAL_CERTIFICATE := shared
系统中所有使用android.media作为共享UID的APK,都会在AndroidManifest.xml节点中增加android:sharedUserId=”android.media”,然后在Android.mk中增加LOCAL_CERTIFICATE := media
四、替换系统签名的方法
当我们无法获取平台系统签名时,就不能对app进行签名。
这时,可以在“平台特权应用程序签名特权文件”里给想要的权限添加白名单即可,文件路径为 /system/etc/permissions/privapp-permissions-platform.xml
【注】需要保证手机已经root成功后,才能修改后push到手机中,以下给出示例
1.在app的AndroidManifest.xml中添加 系统特权权限
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION" />
2.Build APK(s)生成apk,然后将apk push到 /system/priv-app/目录
3.在 /system/etc/permissions/privapp-permissions-platform.xml 里添加权限
<privapp-permissions package="com.example.test">
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
</privapp-permissions>
<privapp-permissions package="com.example.test">
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
</privapp-permissions>
<privapp-permissions package="com.example.test">
<permission name="android.permission.SECURE_ELEMENT_PRIVILEGED_OPERATION"/>
</privapp-permissions>
4.手机重启后生效