如何在AOSP中添加aar库并在自研ROM的系统服务内使用?
定制ROM系统服务引入AAR库的实现方案
方案1:解压AAR单独集成内部资源
- 将目标AAR文件后缀修改为
.zip后解压,提取内部的classes.jar、res资源目录、jni目录下的.so文件(如有) - 把
classes.jar重命名为自定义名称(如custom_sdk.jar)放到系统服务模块的libs目录下 - AAR内的res资源直接合并到系统服务的res目录,建议提前给所有AAR资源添加统一前缀,避免和系统资源ID冲突
- 若使用Android.bp构建,在系统服务模块配置的
static_libs字段中添加对应jar包名称,有.so依赖的话额外添加到jni_libs字段即可 - 若使用旧版Android.mk构建,添加
LOCAL_STATIC_JAVA_LIBRARIES += custom_sdk.jar、LOCAL_JNI_SHARED_LIBRARIES += 对应so库名即可
方案2:通过AOSP构建规则直接导入AAR
不需要手动解压AAR,直接用构建系统的原生规则导入:
- 将AAR文件放到系统服务模块的子目录下,比如命名为
my_dependency.aar - 编写AAR导入的构建配置:
- Android.bp写法:
aar_import { name: "imported_my_dependency", aars: ["my_dependency.aar"], sdk_version: "current", static_libs: [ // 若AAR有额外依赖,在此处声明 ], }- Android.mk写法:
include $(CLEAR_VARS) LOCAL_MODULE := imported_my_dependency LOCAL_AAR_FILE := my_dependency.aar LOCAL_MODULE_TAGS := optional include $(BUILD_STATIC_JAVA_AAR_LIBRARY) - 在系统服务的构建配置中,将
imported_my_dependency添加到静态依赖列表即可:- Android.bp加到
static_libs数组 - Android.mk添加
LOCAL_STATIC_JAVA_AAR_LIBRARIES += imported_my_dependency
- Android.bp加到
注意事项
- 大部分系统服务运行在system_server进程,若AAR有上下文相关调用,注意适配系统服务的Context,不要引用应用端私有API
- 如果AAR声明了自定义权限,需要提前将权限定义写入
frameworks/base/core/res/AndroidManifest.xml,避免运行时权限找不到的错误 - 调整依赖后首次编译建议先执行
make clean清除缓存,避免旧构建产物导致的编译异常
内容的提问来源于stack exchange,提问作者Markus Haas
相关产品推荐
相关产品推荐

