如何在Android AOSP 13模拟器中构建/system目录下的系统应用
问题背景
需要构建部署在/system/app的示例系统应用,基于goldfish设备为sdk_phone64_x86_64构建AOSP模拟器。按标准流程用Android.bp编译后,在device/generic/goldfish/64bitonly/product/vendor.mk的PRODUCT_PACKAGES中添加应用名称,编译systemimage时触发错误:
build/make/core/artifact_path_requirements.mk:30: warning: device/generic/goldfish/64bitonly/product/sdk_phone64_x86_64.mk produces files inside build/make/target/product/generic_system.mks artifact path requirement.
Offending entries:
system/app/SampleSystemApp/SampleSystemApp.apk
In file included from build/make/core/main.mk:1352:
build/make/core/artifact_path_requirements.mk:30: error: Build failed.
16:08:03 ckati failed with: exit status 1
尝试官方产品分区接口强制方案无效,需找到不修改build/make/target/product/handheld_system.mk的可行方案(Android 10中直接在vendor.mk添加模块名即可正常工作)。
解决方案
1. 配置模块的分区属性
在应用的Android.bp中明确声明模块归属system分区,添加关键配置:
android_app { name: "SampleSystemApp", srcs: ["src/**/*.java"], // 其他编译配置(如资源、依赖等) product_specific: false, // 禁止将模块归类到product分区 certificate: "platform", // 系统应用必须使用平台签名 install_location: "system", // 明确指定安装路径为system分区 }
2. 在设备级system相关mk中添加模块
不要在vendor.mk中添加应用模块,而是修改device/generic/goldfish/64bitonly/product/sdk_phone64_x86_64.mk,将模块添加到PRODUCT_PACKAGES或PRODUCT_SYSTEM_PACKAGES:
# 方式1:通用添加 PRODUCT_PACKAGES += SampleSystemApp # 方式2:更规范的system分区包声明(推荐) PRODUCT_SYSTEM_PACKAGES += SampleSystemApp
3. 临时路径检查绕过(应急用)
如果上述配置仍触发错误,可在设备mk中添加白名单关闭对应路径检查(不推荐长期使用):
ARTIFACT_PATH_REQUIREMENT_WHITELIST += system/app/SampleSystemApp/SampleSystemApp.apk
4. 参考原生系统应用的配置逻辑
HTMLViewer、Keychain这类原生系统应用,均在Android.bp中设置product_specific: false,并通过设备级system mk或目标产品的system类mk引入,而非vendor mk。同时确保模块使用platform证书签名,这是系统应用的必要条件。
内容的提问来源于stack exchange,提问作者Rajat Gupta

