You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于AOSP主分支定制ROM时添加系统应用编译失败求助

解决AOSP集成Android Studio开发应用为系统应用的编译问题

我之前帮不少开发者解决过类似的AOSP系统应用集成问题,你当前的步骤确实遗漏了几个关键的适配环节,这正是编译失败的核心原因。下面一步步帮你修正:

1. 先适配Android Studio项目到AOSP结构

Android Studio用Gradle构建,而AOSP依赖Makefile/BP文件,直接复制原项目目录会导致结构不兼容:

  • 删掉原项目里的.gradle.ideabuild这些Gradle相关文件夹,只保留核心代码和资源
  • src/main/java下的所有代码直接移动到src目录(或者保持原有层级,但要在后续的构建文件里正确指定路径)
  • res目录、AndroidManifest.xml直接移到App_name的根目录
  • 修改AndroidManifest.xml:添加系统应用必须的属性
    <!-- 增加系统用户ID,获取系统应用权限 -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.your.app.package"
        android:sharedUserId="android.uid.system">
    
        <!-- 如果应用需要特权权限,还要给对应权限加上protectionLevel -->
        <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
            android:protectionLevel="signature|privileged" />
    </manifest>
    

2. 编写正确的Android.mk文件

AOSP下的构建文件和Gradle完全不同,给你一个适配系统应用的示例Android.mk(放在App_name根目录):

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# 标记为可选模块,方便编译控制
LOCAL_MODULE_TAGS := optional
# 模块名称,要和PRODUCT_PACKAGES里的条目完全一致
LOCAL_MODULE := App_name
# 指定Java源码路径,如果你保留了main/java层级,这里改成 $(call all-java-files-under, src/main/java)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
# 指定资源目录
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
# 应用包名,要和Manifest里的package一致
LOCAL_PACKAGE_NAME := App_name
# 系统应用必须用平台签名
LOCAL_CERTIFICATE := platform
# 如果需要将应用放到system/priv-app目录(获取更高特权),打开这行
# LOCAL_PRIVILEGED_MODULE := true
# 调试阶段关闭DEX预编译,避免不必要的错误
LOCAL_DEX_PREOPT := false

# 如果你的应用依赖AndroidX或其他AOSP内置库,需要在这里添加依赖,比如:
# LOCAL_STATIC_ANDROID_LIBRARIES := androidx.core_core

include $(BUILD_PACKAGE)

注:如果你的AOSP版本较新,也可以用更简洁的Android.bp替代Android.mk,语法类似但更轻量化。

3. 调整目录与编译顺序

  • 确保App_name文件夹完全复制到AOSP的/packages/apps/目录下(如果是特权应用,也可以放到/packages/priv-app/
  • 不要直接全编,先单独编译这个应用排查错误:
    1. 进入AOSP根目录,执行source build/envsetup.shlunch选择你的模拟器目标(比如aosp_x86_64-eng
    2. 执行mmma packages/apps/App_name/单独编译应用,查看终端输出的具体错误信息(比如资源缺失、依赖找不到、签名问题等)

4. 修正PRODUCT_PACKAGES的添加

你在core.mk里添加条目是可行的,但更推荐在自己的定制产品配置文件里添加(比如device/<your-vendor>/<your-product>/device.mk),避免修改AOSP原生文件。同时要确保App_name的拼写和Android.mk里的LOCAL_MODULE完全一致。

常见排查点

如果还是编译失败,重点看终端错误信息:

  • 若提示“资源找不到”:检查LOCAL_RESOURCE_DIR路径是否正确,res目录下的资源是否符合AOSP规范(比如不要用Gradle特有的资源语法)
  • 若提示“签名不匹配”:确认LOCAL_CERTIFICATE := platform已添加,AOSP的平台签名文件在build/target/product/security/
  • 若提示“依赖库缺失”:在Android.mk里添加对应的AOSP内置库依赖,比如AndroidX需要确保AOSP源码里已经包含这些库(可以通过repo list | grep androidx确认)

内容的提问来源于stack exchange,提问作者Komal Deolalkar

火山引擎 最新活动