预装系统特权App

530 阅读3分钟

1. 特权App

🎡 特权应用是位于系统映像某个分区上 priv-app 目录下的系统应用

[!tip] 特许权限

  1. 特许权限许可名单
  2. Android 权限
  •  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.mkDeviceCommon.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, 但我们也可以自己单独新建一个白名单文件:

  1. 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>
    
  2. 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/permissions
  • product_specific: true编译到 编译到/product分区
  • proprietary: true 编译到 vendor 分区

  1. Android系统开发的特权白名单
  2. 特许权限许可名单与SystemApp
  3. Android 13 内置三方应用app
  4. Android 13内置可卸载应用
  5. 使用 Android Studio 开发系统 App