AOSP预安装应用如何将外部AAR/JAR作为共享库引入
AOSP 预编译AAR作为共享库接入方案
你之前遇到的两类报错核心原因都是配置逻辑错误:
- 把AAR直接配成
LOCAL_PREBUILT_JAVA_LIBRARIES报dex2oat找不到dex,是因为普通Java库预编译规则默认处理纯jar包,不会自动解包AAR提取dex、资源、清单文件,直接把原AAR丢到系统框架目录,dex2oat自然找不到可优化的dex内容。 - 改引用为
LOCAL_JAVA_LIBRARIES后运行报NoClassDefFoundError,是因为预编译的AAR没有被正确注册为系统共享库,应用启动时系统不会把这个库加入应用的类查找路径。
具体配置步骤
1. 重写AAR的预编译规则
删掉原来写的LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += aar-release:libs/aar-release.aar和对应的BUILD_MULTI_PREBUILT块,替换为如下配置:
include $(CLEAR_VARS) LOCAL_MODULE := aar-release LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_SRC_FILES := libs/aar-release.aar LOCAL_UNINSTALLABLE_MODULE := true LOCAL_BUILT_MODULE_STEM := classes.jar # 必须开启AAPT2,处理AAR自带的资源、清单文件 LOCAL_USE_AAPT2 := true LOCAL_DEX_PREOPT := true # 如果AAR自带JNI库,按架构取消对应注释,配置so路径 # LOCAL_PREBUILT_JNI_LIBS_arm := libs/armeabi-v7a/*.so # LOCAL_PREBUILT_JNI_LIBS_arm64 := libs/arm64-v8a/*.so include $(BUILD_PREBUILT)
这个配置会告诉构建系统把AAR作为系统级共享Java库处理,自动解包提取dex、资源,生成符合dex2oat要求的输出文件,不会再报找不到dex的错误。
2. 修改应用模块的引用配置
在你的应用模块配置块里做如下调整:
- 删除原有的
LOCAL_STATIC_JAVA_LIBRARIES += aar-release行 - 在
LOCAL_JAVA_LIBRARIES列表中加入aar-release,注意你原有LOCAL_JAVA_LIBRARIES行末尾的反斜杠不要漏写,避免截断配置LOCAL_JAVA_LIBRARIES += aar-release
3. 注册系统共享库白名单
放到/system/framework下的库需要加入系统权限白名单,才能被应用正常加载:
- 新建权限配置xml文件,内容如下,其中
class字段填你报错中找不到的Runtime类的完整包名路径:<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="aar-release" file="/system/framework/aar-release.aar" class="com.your.aar.package.Runtime"/> </permissions> - 在你产品对应的产品配置mk文件(一般是对应机型的
<product>.mk)中,把AAR模块和权限配置加入编译列表:PRODUCT_PACKAGES += aar-release PRODUCT_COPY_FILES += <你存放权限xml的本地路径>:system/etc/permissions/aar-release.xml
排查要点
- 刷入编译后的镜像后,先通过adb shell检查
/system/framework/下是否存在aar-release.aar,/system/etc/permissions/下是否存在对应的权限配置文件,避免拷贝失败导致的加载问题 - 如果AAR带自定义资源,必须确保预编译阶段开启AAPT2,否则资源ID会和系统资源表不匹配,运行时会报资源找不到错误
- 作为共享库的AAR不要开启代码混淆,否则类名、方法名被混淆后会和应用编译时的引用符号不匹配,依旧会报类找不到错误
Android.mk 官方文档查询渠道
不存在和Soong(Android.bp)在线文档形式完全一致的独立托管Android.mk官方文档,所有配置字段的权威说明都在AOSP源码内:
- 核心配置定义:路径为
build/make/core/,clear_vars.mk文件中列出了所有支持的LOCAL_*变量及默认值,package.mk、java_library.mk等文件对应了应用、Java库等不同模块的构建规则、变量生效逻辑。 - 语法说明文档:AOSP源码
docs/目录下留存了完整的Android.mk语法、配置项说明,本地同步AOSP源码后,在源码根目录执行make doc-comment-check-docs即可生成本地可浏览的完整构建文档,覆盖所有配置字段的用途、取值要求。
内容的提问来源于stack exchange,提问作者abirusabil
相关产品推荐
相关产品推荐

