使用Android.bp构建Android应用遇依赖错误,求解决方案
解决Android.bp构建Android应用的问题
当然可以用Android.bp构建Android应用!你遇到的问题主要来自androidmk转换工具的局限性,以及转换后BP文件的配置错误和依赖问题。咱们一步步来修复:
1. 修复Android.bp中的转换错误项
androidmk工具无法自动转换所有Android.mk语法,需要手动补全这些未支持的配置:
修正后的完整Android.bp
android_app { name: "ResourceDemo", srcs: ["src/**/*.java"], // 替换LOCAL_RESOURCE_DIR resource_dirs: [ "res", "frameworks/support/v7/appcompat/res", "frameworks/support/design/res" ], // 替换LOCAL_PRIVILEGED_MODULE privileged: true, // 替换LOCAL_DEX_PREOPT dex_preopt: true, // 替换ProGuard相关配置 proguard_enabled: "nosystem", proguard_flags: ["-include $(LOCAL_PATH)/proguard.flags"], static_libs: [ "android-support-v4", "android-support-v7-appcompat" ], certificate: "platform", aaptflags: ["--auto-add-overlay"], // 正确设置ABI编译选项(替换错误的TARGET_ABI赋值) compile_multilib: "x86_64", product_variables: { pdk: { enabled: false, }, }, }
关键修改说明:
resource_dirs:替代LOCAL_RESOURCE_DIR,用于指定资源文件目录,需用数组形式列出所有路径privileged: true:替代LOCAL_PRIVILEGED_MODULE := true,标记应用为特权模块dex_preopt: true:替代LOCAL_DEX_PREOPT := true,启用Dex预优化- ProGuard配置:用
proguard_enabled和proguard_flags替代原有的LOCAL_PROGUARD_*字段,注意proguard_flags需要用-include指定规则文件路径 compile_multilib:替换错误的TARGET_ABI = ["x86_64"],这是Soong构建系统指定目标ABI的正确方式
2. 解决依赖缺失错误
构建时出现的undefined module错误,通常有两个原因:
- 构建环境未配置完整:你需要在完整的Android源码树(AOSP)中进行构建,
core-libart、framework、android-support-v*这些模块都是AOSP源码的一部分,单独构建单个应用无法找到这些依赖。 - 静态库名称过时:如果你的AOSP版本已经迁移到AndroidX,那么
android-support-v4和android-support-v7-appcompat应该替换为对应的AndroidX模块名称,比如:
请根据你的AOSP版本确认正确的模块名称。static_libs: [ "androidx.core:core", "androidx.appcompat:appcompat" ]
3. 额外注意事项
- AAPT2是Soong构建系统的默认选项,不需要额外设置
LOCAL_USE_AAPT2,如果强制关闭可以添加aapt2_enabled: false(不推荐) - 确保你的
proguard.flags文件存在于应用目录下,否则ProGuard会报错 - 构建前可以先执行
lunch命令选择对应的目标设备(比如lunch aosp_x86_64-eng),确保ABI和构建环境匹配
内容的提问来源于stack exchange,提问作者Midhun PM
相关产品推荐
相关产品推荐

