Android系统应用开发

android:sharedUserId=“android.uid.system”

AndroidMainfest.xml中添加 android:sharedUserId="android.uid.system" 。通过sharedUserId属性,相同User id的apk配置运行在同一进程中,把程序的User id配置成android.uid.system,也就是让程序运行在系统进程中,这样程序就有权限来读写系统配置。

每个apk或文件,系统都会分配属于自己的统一的用户ID(UID),创建沙箱保证其他应用的影响或影响其他应用。如:一般应用只能访问自己包名下的文件(/data/data/pkgname),不能反问其他包名下的,其他应用也访问不了自己包名下的文件。
sharedUserId,拥有同一user id的应用 之间就可以共享数据库和文件,相互访问。这些应用可以运行在同一进程,也可以运行不同进程。

有拥有相同sharedUserId标签的,且拥有相同签名的应用才能分配相同的用户ID,实现数据共享。如果仅仅拥有相同sharedUserId标签,是无法确保安全的,也很容易被非法利用。

Android push apk to /system/app/ or /system/priv-app

将安卓apk包安装到系统目录下

1.首先需要root权限 adb root 2.adb remount

adb remount put /system partition in writable mode. By default /system is only readable. It could only be done on rooted device.
adb remount 将 /system 分区置于可写模式。 默认情况下 /system 仅可读。 它只能在root设备上完成。
adb remount相当于adb shell mount -o rw,remount,rw /system

如果之前有安装过,或者run过,可先清除安装包,切换到对应的路径下
1.例如/system/priv-app下的apk,如adb shell rm -rf xxxx 2./data/data/对应包名的文件
或者直接在Android Studio中的Device FireExplorer中删除

3.将安装包push到/system/priv-app

adb push xxxx/path/debug.apk /system/priv-app

或者在或者直接在Android Studio中的Device FireExplorer中upload对应的apk

4.reboot

/system/app 和 /system/priv-app 的区别

什么是system app?

  • 特定的shared uid的app都属于system app,例如:android.uid.systemandroid.uid.phoneandroid.uid.logandroid.uid.nfcandroid.uid.bluetoothandroid.uid.shell等,这些app都被赋予了ApplicationInfo.FLAG_SYSTEM标志,在PackageManagerService
  • 特定目录下的app,例如/vendor/overlay/system/framework/system/priv-app/system/app/vendor/app/oem/app下面的应用,这个在PackageManagerService中也有相关的定义

什么是特权app?

特权app 也叫privileged app,能够使用特许权限的应用
特权应用是位于系统映像某个分区上 priv-app 目录下的系统应用。各 Android 版本中,该分区为:

  • Android 8.1 及更低版本 - /system
  • Android 9 及更高版本 - /system, /product, /vendor

从这个路径可以知道,特权app首先必须是System app。也就是说 System app分为普通的system app和特权的system app。/system/app/system/priv-app区别就是,/system/app下面的是普通的system app,而/system/priv-app下面是特权app,他能够声明获得更多的权限。

从Android 8.0开始,特权应用如果使用系统的特许权限,那么需要把这个特许权限加入到白名单中,这个就叫特许权限许可名单

如何配置特许权限许可名单?

如何配置特许权限许可名单呢,这个在官方指导文档里面也说明了:

  • 对于已包含在 Android 开源项目 (AOSP) 树中的应用,请将其权限列在 /etc/permissions/privapp-permissions-platform.xml 中。
  • 对于 Google 应用,请将其权限列在 /etc/permissions/privapp-permissions-google.xml 中。
  • 对于其他应用,请使用以下格式的文件:/etc/permissions/privapp-permissions-DEVICE_NAME.xml

privapp-permissions.xml 文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。例如,如果 /vendor 分区上的应用请求特许权限,则只能由同样位于 /vendor 上的 privapp-permissions.xml 文件来同意或拒绝该请求。

而像我们将应用预置到system下面的话,就要将privapp-permissions.xml文件放到system分区下面。

遇到的问题

1.Android Stuido不能直接运行项目,install apk到整机设备上
可能会有如下的提示:

Couldn't terminate the existing process for

可以先root后,通过

adb shell ps 查看进程信息

adb shell ps | grep 包名 过滤某个进程的信息,可查看进程id

获取进程名,查找不能terminate的进程adb remount后,删除/system/priv-app 或者 data/data下的包,然后重启即可