Android 源码环境下用Android.mk 导入aar

本文介绍了如何在Android源码环境中使用Android.mk导入aar包,并解决编译后apk缺少so文件的问题。通过预置so到系统目录或尝试将so打包进apk,探讨了两种解决方案,但后者未能成功。提供了Android.mk的相关配置示例。

本文讨论两个问题:

  1. 如何在Android 源码环境下使用Android.mk 的方式把aar 导入apk(apk 引用aar 的内容);
  2. 含有so 文件的aar 在源码环境下编译后so 文件不会被打包进apk,如何解决app 运行时找不到so 的问题。

现在新的源码中很多app 已经切换到了Android.bp,不过目前Android.mk 还是兼容的。下面介绍在Android.mk 中导入aar 包。

源码环境是qcom SM8450

在Android.mk 中导入aar 包

第一步:先声明 aar 包的位置

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += aar_alias:libs/aar-release_1.0.aar
include $(BUILD_MULTI_PREBUILT)

注意上面的代码整段都需要,而不只是中间那一行。

第二步:引用我们声明的 aar 变量

LOCAL_STATIC_JAVA_AAR_LIBRARIES := aar_alias

第三步:添加引用的 aar 包里面的资源

LOCAL_AAPT_FLAGS += \
         --auto-add-overlay \
         --extra-packages com.example.aar

com.example.aar 为aar 的包名。

第二步和第三步是添加到apk 的 include $(CLEAR_VARS) 和include $(CLEAR_VARS) 中间。


运行时找不到so(aar 里的so)

如果aar 中含有so 文件的话,通常使用Android Studio 构建apk 的话,so 会打包到apk的lib 目录下(解压后可以查看到),而在源码下使用Android.mk 的方式编译的话,编译出的apk 是不含so 文件的,也就意味着如果你adb install 编译出来的apk,它是不能按预期运行的。

两种方法解决这个问题

方案一 预置apk + 预置aar 里的so 到/system/lib64/ 目录

使用Android.mk 的方式在源码下编译,大概率也是要预置这个apk 了,可以在编译apk 的mk 文件中增加预置so 文件的代码。当然,首先要把aar 里的so 文件解压出来(集成交付可能不太友好,除了更新aar 还要再一次把aar 里的so 解压出来)。

#  jni so
include $(CLEAR_VARS)
LOCAL_MODULE := libGet_Point-jni
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := libs/$(LOCAL_MODULE).so
LOCAL_MODULE_STEM := $(LOCAL_MODULE)
LOCAL_MODULE_SUFFIX := $(suffix $(LOCAL_SRC_FILES))
LOCAL_SHARED_LIBRARIES := liblog libxt_get_point
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MULTILIB := 64
include $(BUILD_PREBUILT)

不要忘了app 依赖的代码

# jni so
LOCAL_JNI_SHARED_LIBRARIES := libGet_Point-jni

so 文件将会被编译预置到/system/lib64/ 目录下,将apk push 到/system/app/AarTest/ 目录下验证可以运行。

注意,so 放到 /vendor/lib64/ 下面访问不到(估计需要app 编译声明为VENDOR app),如果app 是install 安装的,那也没有权限访问/system/lib64/ 下面的so

方案二 将aar 中的so 打包进apk?(未成功)

按照网上文章说的,添加 LOCAL_JNI_SHARED_LIBRARIES := libGet_Point-jni 后so 会自动打包进so,然而实测并没有;

预置so 文件的make 代码写法出了上面列出的一种以外,还搜到一个

LOCAL_PREBUILT_LIBS := libGet_Point-jni:libs/libGet_Point-jni.so

但是假如这个so 还依赖其他so 的话就会编译不过(回头看上面第一种,LOCAL_SHARED_LIBRARIES := liblog 还依赖了liblog)。同样的,假如上面的代码不会导致编译错误,也还需要

# jni so
LOCAL_JNI_SHARED_LIBRARIES := libGet_Point-jni

不写这一行也能push apk 成功运行,但是编译出来apk 目录下没有 lib 软链
添加了 LOCAL_JNI_SHARED_LIBRARIES 之后编译出出的apk 目录下有lib 软链,apk 本身是不含so 文件的

so 打包进apk 失败
如有大佬打包so 到apk 成功,恳请赐教!

参考链接

  1. Android 程序开发 总结一: 源码编译引用包含so文件的AAR文件_alexchen840131的博客-优快云博客
  2. 【安卓开发系列 – 系统开发】AOSP 源码环境开发系统 APP 预置带有 SO 的 AAR 包_奋斗企鹅CopperSun的博客-优快云博客_libpl_droidsonroids_gif.so
  3. Android源码 app预制带so和assets文件的aar包(sdk)_wd623894174的博客-优快云博客
  4. Android打包so文件到apk_IT先森的博客-优快云博客
  5. 在Android源码中如何吧so库打包编译进入apk, 集成第三方库(jar和so库)_WangMark的博客-优快云博客
  6. Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)_cczhengv的博客-优快云博客_android.bp 编译jar
<think>嗯,用户的问题是关于在Android.mk中进行源码编译时,能否不导包直接使用androidx.media:media:1.6.0。首先,我需要回忆一下Android构建系统中Android.mk和Gradle的区别。Android.mk是传统的基于Make的构建系统,而Gradle使用依赖管理,比如通过implementation语句添加库。 用户提到“不导包”,可能是指不在Android.mk中显式添加依赖,而是希望系统已经包含该库。但通常,Androidx库需要作为外部依赖引入。我需要确认AOSP源码是否默认包含androidx.media:media:1.6.0。AOSP可能包含部分Androidx库,但版本可能较旧,比如1.6.0可能不在其中。用户需要检查源码目录下是否有对应的模块,例如external/androidx。 如果源码中没有该库,用户必须手动导入。在Android.mk中,通常通过LOCAL_STATIC_ANDROID_LIBRARIES或LOCAL_JAVA_LIBRARIES来引用。但如果是预编译的aar或jar,可能需要使用LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES。另外,用户可能需要将库的模块添加到PRODUCT_PACKAGES中,确保打包进系统。 还要考虑兼容性问题,比如API变化和依赖冲突。如果用户的代码依赖于特定版本,而源码中的版本不一致,可能导致编译错误或运行时问题。需要建议用户检查依赖关系,必要时手动集成该库。 总结可能的解决步骤:检查AOSP是否包含所需库的模块;若无,下载源码或预编译文件,修改Android.mk引入依赖,处理可能的冲突。同时,参考用户提供的引用,比如引用[2]中提到的处理缺失Makefile的方法,可能需要调整构建配置。</think>在Android.mk中进行源码编译时,能否直接使用$androidx.media:media:1.6.0$需要根据具体编译环境和依赖关系来判断。以下是关键分析点: ### 一、Android.mk与Gradle依赖机制差异 1. **原生编译限制** Android.mk属于AOSP传统编译系统,默认不集成Gradle管理的依赖库。$androidx.media$库需要通过以下两种方式集成: - 将源码作为模块添加到AOSP工程 - 预编译成jar/aar并声明依赖 2. **依赖树隔离问题** 若未显式声明依赖,编译时会报错:`package androidx.media does not exist`[^2] ### 二、可行解决方案 #### 方案1:源码级集成(推荐) 1. 在AOSP源码目录下查找是否存在该模块路径: ```makefile external/androidx/media/media/1.6.0/ ``` 若不存在,需手动下载对应版本源码并放置到相应位置 2.Android.mk中添加模块声明: ```makefile LOCAL_STATIC_ANDROID_LIBRARIES += androidx.media_media-1.6.0 ``` #### 方案2:预编译库集成 1. 下载预编译的aar文件并解压到项目目录 2. 声明预编译依赖: ```makefile include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := media-1.6.0:libs/media-1.6.0.aar include $(BUILD_MULTI_PREBUILT) ``` ### 三、兼容性验证 需检查目标平台的API级别是否满足$androidx.media:media:1.6.0$的最低要求(Android 5.0+)。可通过在Android.mk中添加: ```makefile LOCAL_MIN_SDK_VERSION := 21 ``` ### 四、错误处理参考 若遇到`No rule to make target`错误,可参考引用[2]的做法,检查模块路径有效性或临时禁用冲突模块[^2]
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值