sharedUid、系统签名、预置应用

1.sharedUid

1.1共享资源

Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者被其他应用程序影响)。

通常,不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的(比如只能访问/data/data/自己包名下面的文件),保障了程序运行的稳定。在有些时候,我们自己开发了多个APK,并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中,可以互相访问任意数据。也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样(使用IPC机制,不同进程之间,比如AIDL)。

Android中不允许相同的uid有不同的签名

1.2通过shareduserid来获取系统权限 


(1)在AndroidManifest.xml中添加android:sharedUserId="android.uid.system"
(2)在Android.mk文件里面添加LOCAL_CERTIFICATE := platform(使用系统签名)
(3)在源码下面进行mm编译
这样生成的apk能够获取system权限,可以在任意system权限目录下面进行目录或者文件的创建,以及访问其他apk资源等(注意创建的文件(夹)只有创建者(比如system,root除外)拥有可读可写权限-rw-------)。

1.3扩展


系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加android:sharedUserId="android.uid.system",然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等;

系统中所有使用android.uid.shared作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.uid.shared",然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等;

系统中所有使用android.media作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.media",然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。
 

2.系统签名

要实现apk静默安装,修改系统声音之类的功能,需要对apk进行系统签名,系统签名跟证书签名是不同的两个概念

系统签名需要系统证书,该系统证书是编译安卓版本的时候产生的文件,用于证明你的apk准许操作系统层级的指令,如果你想获得该证书则需要找到提供安卓系统的厂家

如果要使用系统证书签名,则需要在AndroidManifest.xml中添加  sharedUserId

3.预置应用

  • 位于系统分区的priv-app目录下的应用就是特权应用。普通三方应用只应包含normaldangerous(运行时)级别的权限,特权应用可能会增加signatureprivileged级别的权限。

  • 如果在app的Android.bp文件内定义了privileged: true, 或者在Android.mk内定义了LOCAL_PRIVILEGED_MODULE := true 那么这个apk就会被编译到system/priv-app分区内成为特权应用。

    • 如果在Android.mk内组合了LOCAL_PRODUCT_MODULE := true,那么编译位置变成system/product/priv-app分区
    • 同理在Android.bp内组合了product_specific: true,那么也将编译到system/product/priv-app分区
  • 对于特权应用来说,它的启动时机是不可控的,对于privileged/signature权限,如果不进行预先授予,那么必将导致设备严重bug。因此必须声明在permission白名单内。

  • 不同的Android版本定义的特权分区如下:

    • 小于等于Android 8.1的版本,特权分区为/system。
    • 大于等于Android 9的版本,特权分区为/system, /product和/vendor。
    • 对于安卓11版本,特权分区新增了/system_ext。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowang_lj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值