AOSP 打包实战:如何新增预装系统应用
在 Android 系统定制开发中,预装应用是常见需求。本文基于 Android 4.4 源码环境,详细讲解如何将第三方 APK 打包进系统固件。
一、前言
在 AOSP(Android 开源项目)开发中,我们经常需要将特定的应用预装到系统中,使其成为不可卸载的系统级应用。这种需求常见于:
- 设备厂商预装自家应用
- 运营商定制应用
- 企业设备管理应用
- 系统核心服务应用
本文将手把手教你如何完成这一过程。
二、准备工作
2.1 环境要求
- AOSP 源码环境(本文基于 Android 4.4)
- 已成功编译过完整固件
- 需要预装的 APK 文件
2.2 重要概念
- 系统应用:位于
/system/app或/system/priv-app,具有系统签名 - 预编译应用:直接使用编译好的 APK,无需源码
- 平台签名:使用系统平台证书签名,获取系统权限
三、详细步骤
3.1 创建应用目录
首先在 AOSP 源码的 packages/apps/ 目录下创建应用目录:
cd packages/apps/
mkdir TestApp
cd TestApp
将你的 APK 文件复制到该目录,并重命名为与模块名一致:
3.2 编写 Android.mk
创建 Android.mk 文件,这是构建系统的核心配置文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)# 模块名称,必须与APK文件名一致(不含.apk后缀)
LOCAL_MODULE := TestApp# 模块标签,optional表示需要显式声明才会编译
LOCAL_MODULE_TAGS := optional# 源文件,即APK文件
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk# 模块类别为应用
LOCAL_MODULE_CLASS := APPS# 模块后缀
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)# 使用平台签名,这是成为系统应用的关键
LOCAL_CERTIFICATE := platform# 可选:声明为特权应用(将安装到system/priv-app)
# LOCAL_PRIVILEGED_MODULE := true# 可选:禁用dex预优化
# LOCAL_DEX_PREOPT := falseinclude $(BUILD_PREBUILT)
3.3 关键配置说明
3.3.1 LOCAL_MODULE_TAGS
optional:需要显式声明才会编译(最常用)user:用户版本自动包含eng:工程师版本自动包含debug:调试版本自动包含
建议使用 optional,以便在不同产品中灵活控制。
3.3.2 LOCAL_CERTIFICATE
platform:平台签名,系统级权限shared:共享签名media:媒体签名PRESIGNED:使用APK原有签名
系统应用必须使用 platform。
3.3.3 特权应用配置
如果要获得更高权限,可以取消注释:
LOCAL_PRIVILEGED_MODULE := true
这样应用将安装到 /system/priv-app/ 而非 /system/app/。
3.4 产品配置
在设备的产品配置文件中添加模块声明,这是很多人容易遗漏的关键步骤!
找到你的设备配置文件,通常位于:
device/<厂商>/<产品名>/device.mk
或
device/<厂商>/<产品名>/product.mk
添加一行:
PRODUCT_PACKAGES += XunMigration
3.5 处理APK签名
重要提醒:预装的APK应该:
- 使用测试签名
- 或者完全不签名
如果APK已有正式签名,需要先去除签名:
# 移除APK中的签名信息
zip -d XunMigration.apk META-INF/\*
系统会在编译时用平台证书重新签名。
3.6 编译验证
3.6.1 开始编译
# 设置环境
source build/envsetup.sh
lunch *****make -j8#### 3.6.2 验证是否打包成功编译完成后,检查输出目录:# 直接查看system目录
ls -la out/target/product/sw773/system/app/
看是否有放置的 app