添加系统级权限 android:sharedUserId=“android.uid.system“

当我们在项目中添加系统级权限时,运行时会有错误提示如下:

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.手机重启后生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值