1. 特权App
🎡 特权应用是位于系统映像某个分区上 priv-app 目录下的系统应用
[!tip] 特许权限
-
Android 8.0开始,制造商必须在/etc/permissions目录下的系统配置 XML 文件中明确授予特许权限 Android 9开始,实现人员必须明确授予或拒绝授予所有特许权限,否则设备将无法启动
1.1 特许权限许可白名单
1.1.1 特许权限
🧨 什么是系统的特许权限?
系统的特许权限必须在frameworks/base/core/res/AndroidManifest.xml定义,并且等级为signature|privileged
🧨 如果一个 特权应用 使用了系统的特许权限,那么我们要把这个特许权限加入到白名单中
🧨 包含在 AOSP 中的应用 其权限已在 /etc/permissions/privapp-permissions-platform.xml 中列入许可名单
1.1.2 自定义白名单
白名单文件:
- 如果特权应用 安装在
/vendor分区,白名单文件就必须在/vendor/etc/permissions/目录下
2. AOSP 源码中 预置App
1.1 配置app编译脚本 Android.mk
🎃 千万注意: 每一行结尾不能有任何空格,否则有可能造成无缘无故的编译失败
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# APP的名字
LOCAL_MODULE := MySystemApp
LOCAL_MODULE_CLASS := APPS
# 在什么包下编译,可以为user、eng、tests、optional,optional代表在任何版本下都编译
LOCAL_MODULE_TAGS := optional
# 可以为testkey、platform、shared、media、PRESIGNED(使用原签名),platform代表为系统应用
# 此处必须写plantform
LOCAL_CERTIFICATE := platform
# 不设置或者设置为false,安装位置为system/app,如果设置为true,则安装位置为system/priv-app
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# APK文件名
LOCAL_SRC_FILES := MySystemApp.apk
# 共享库
LOCAL_PREBUILT_JNI_LIBS := \
lib/arm/libc++_shared.so \
lib/arm/libvir-input.so
include $(BUILD_PREBUILT)
LOCAL_PRIVILEGED_MODULE := true编译到system/priv-app分区内成为特权应用LOCAL_PRODUCT_MODULE := true编译到system/product/priv-app分区
1.2 配置device编译脚本
aosp下找到device/厂商名称/设备名称目录下找到BoardConfig.mk或DeviceCommon.mk文件
PRODUCT_PACKAGES += APP目录名称
1.3 配置特许权限白名单
aosp 中找到 frameworks/base/data/etc/privapp-permissions-platform.xml,在<permissions>标签的内部添加需要的权限,
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<!-- 原系统App特许权限 -->
<privapp-permissions package="com.android.settings">
<permission name="android.permission.INSTALL_DYNAMIC_SYSTEM"/>
<permission name="android.permission.BIND_CELL_BROADCAST_SERVICE"/>
</privapp-permissions>
<!-- 自定义预置App的特许权限 -->
<privapp-permissions package="com.xxxx.xxx">
<permission name="android.permission.ACCESS_NETWORK_STATE" />
<permission name="android.permission.CHANGE_NETWORK_STATE"/>
<permission name="android.permission.BLUETOOTH_CONNECT"/>
<permission name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<permission name="android.permission.REBOOT"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.INJECT_EVENTS"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
<permission name="android.permission.WRITE_SETTINGS" />
<permission name="android.permission.SYSTEM_ALERT_WINDOW" />
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<permission name="android.permission.READ_EXTERNAL_STORAGE" />
<permission name="android.permission.FOREGROUND_SERVICE" />
<permission name="android.permission.POST_NOTIFICATIONS" />
</privapp-permissions>
</permissions>
1.4 自定义白名单文件
一般会把白名单添加到文件frameworks/base/data/etc/privapp-permissions-platform.xml, 但我们也可以自己单独新建一个白名单文件:
- 在
frameworks/base/data/etc/目录下,新建xml文件,如:com.android.systemui.xml<permissions> <privapp-permissions package="com.android.systemui"> <permission name="android.permission.CAPTURE_AUDIO_OUTPUT"/> <permission name="android.permission.BATTERY_STATS"/> </privapp-permissions> </permissions> - 在
Android.bp文件中,仿照已有定义,配置我们自定义的白名单文件prebuilt_etc { name: "privapp_whitelist_com.android.systemui", system_ext_specific: true, sub_dir: "permissions", src: "com.android.systemui.xml", filename_from_src: true, }
specific: 未指定编译位置,默认编译到/system分区下的/system/etc/permissions目录
system_ext_specific: true编译到system_ext分区下的/system_ext/etc/permissionsproduct_specific: true编译到 编译到/product分区proprietary: true编译到vendor分区