完整详细实现步骤(以 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必须是 APKAndroidManifest.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 就会包含完整的特权应用支持。