android 16 如何预置特权App

4 阅读2分钟

完整详细实现步骤(以 vendor/codeaurora/commonsys/packages/apps/ 为例)

假设:

  • 你的实体 APK 名字为:xxx_remote_v1.0.apk
  • 你的 APK 真实包名为:com.remote.control
  • 我们定义的系统模块名为:RemoteControl

步骤 1:创建目录并放入 APK 文件

在终端执行:

# 1. 创建模块目录(目录名建议保持清晰,例如 RemoteControl)
mkdir -p vendor/codeaurora/commonsys/packages/apps/RemoteControl

# 2. 将你的 APK 放入该目录
cp /path/to/xxx_remote_v1.0.apk vendor/codeaurora/commonsys/packages/apps/RemoteControl/

此时目录结构为:

vendor/codeaurora/commonsys/packages/apps/RemoteControl/
└── juwei_remote_v1.0.apk

步骤 2:编写特权白名单 privapp-permissions-remote.xml

vendor/codeaurora/commonsys/packages/apps/RemoteControl/ 目录下新建 privapp-permissions-remote.xml

⚠️ 注意:这里的 package 必须是 APK AndroidManifest.xml 中真实的 package 名字(即 com.remote.control)。

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <!-- 这里的 package 必须匹配 APK 真实包名 -->
    <privapp-permissions package="com.remote.control">
        <!-- 开机自启必要权限 -->
        <permission name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <!-- 跨用户与系统级窗口权限 -->
        <permission name="android.permission.INTERACT_ACROSS_USERS"/>
        <permission name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
    </privapp-permissions>
</permissions>

步骤 3:编写构建规则 Android.bp

vendor/codeaurora/commonsys/packages/apps/RemoteControl/ 目录下新建 Android.bp

android_app_import {
    // 模块名字(后续 Makefile 里面声明的就是这个名字)
    name: "RemoteControl",

    // 指向目录下实际的 APK 物理文件名
    apk: "juwei_remote_v1.0.apk",

    // 关键:声明为特权 APP,编译后放入 /system/priv-app/RemoteControl/
    privileged: true,

    // 签名方式:使用平台系统签名
    certificate: "platform",
    // 禁用预优化,避免 odex/vdex 校验问题
    dex_preopt: {
        enabled: false,
    },

    // 强制绑定权限白名单模块
    required: ["privapp-permissions-remote.xml"],
}

// 预编译白名单 XML 模块(安装到 /system/etc/permissions/)
prebuilt_etc {
    name: "privapp-permissions-remote.xml",
    sub_dir: "permissions",
    src: "privapp-permissions-remote.xml",
    filename_from_src: true,
}

步骤 4:在产品 Makefile 中添加打包依赖

找到高通 QSSI 编译的核心 Makefile,在高通基线中,通常是以下文件之一(任选其一即可,推荐 qssi.mk):

  • device/qcom/qssi/qssi.mk
  • 或者 vendor/qcom/defs/product-defs/system/qssi-system.mk

打开该文件,在末尾添加:

# 引入具微遥控特权 APK 和权限白名单 (这里的名字对应 Android.bp 里的 name)
PRODUCT_PACKAGES += \
    RemoteControl \
    privapp-permissions-remote.xml

步骤 5:单模块快速编译与产物验证

无需每次都全量编译整机,通过以下命令单独验证该模块的编译:

# 1. 载入编译环境
source build/envsetup.sh
lunch qssi-userdebug   # 或者是你们项目的 lunch 目标

# 2. 单模块编译
m RemoteControl privapp-permissions-remote.xml
检查输出产物是否生成成功:
# 检查 APK 是否成功输出到了 system/priv-app/ 且被规范命名
ls -l out/target/product/qssi/system/priv-app/RemoteControl/RemoteControl.apk

# 检查权限白名单是否输出到了 system/etc/permissions/
ls -l out/target/product/qssi/system/etc/permissions/privapp-permissions-remote.xml

只要上述两条路径都正常生成了对应文件,执行全量编译 make systemimage -j$(nproc) 生成的 system.img 就会包含完整的特权应用支持。