Android.mk 增加aar依赖

本文详述了在Android.mk中整合AAR库的具体步骤,包括如何在Android.mk文件中正确引用AAR库,调整清单文件以兼容库的最低SDK版本,避免R文件合并冲突,以及添加必要的资源目录。

1. Android.mk中增加两处

LOCAL_STATIC_JAVA_AAR_LIBRARIES:= <aar alias> //这里是一处
.
.
.
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

//这里是第二处
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := <aar alias>:libs/<lib file>.aar

include $(BUILD_MULTI_PREBUILT)

2.  清单文件中设置 minSdkVersion required by library into your manifest file.,否则编译不过

 

3.  避免编译时将R文件合并,可以使用  LOCAL_AAPT_FLAGS

after compile, the resources in the aar will be added to my main package's R file, but not in the aar package's R file. For example, the aar's package name is my.aar, the main project's package name is my.main. The aar has a string named "string_in_aar". After compile, the strings id is my.main.R.string_in_aar rather than my.aar.R.string_in_aar. This makes the apk crash, because the code in the aar uses my.aar.R.string_in_aar.

The solution is use:

LOCAL_AAPT_FLAGS += --extra-packages {aar package name}.

You will get two R file. They has the some content. One's package is the main package, the other is the aar package.

 

4. 此后还要添加objaar展开的res文件目录,比如

# RES files
#=====================================================================
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_RESOURCE_DIR +=prebuilts/sdk/current/extras/constraint-layout/res
LOCAL_RESOURCE_DIR +=frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR +=frameworks/support/design/res
LOCAL_RESOURCE_DIR +=frameworks/support-v4/res

 

 

如果报错:

android.mk error: commands commence before first target 

, 则很可能是上一句的换行连接符 \ 之后多了个空格;

<think> 我们正在处理一个关于在Android.mk中添加retrofit2依赖的问题。根据引用[3],我们看到有提到在Android.mk中引用so库的方法,但retrofit2是一个Java库,通常以jar或aar形式提供,而不是so库。因此,我们需要采用不同的方法。 在Android NDK开发中,Android.mk主要用于编译本地代码(C/C++)和指定预构建的本地库(.so文件)。对于Java库(如retrofit2),我们通常是在Gradle构建文件中添加依赖,而不是在Android.mk中。 但是,如果项目确实需要在Android.mk中引用一个Java库(例如,在一个不使用Gradle的老旧项目或者需要将Java库打包进系统镜像的情况),我们可以考虑以下步骤: 1. 将retrofit2的jar包(或aar解压后的classes.jar)放到项目的某个目录中,比如libs/。 2.Android.mk中,我们可以使用`LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES`(对于静态库)或`LOCAL_PREBUILT_JAVA_LIBRARIES`(对于共享库)来包含这些jar包。 3. 然后通过`LOCAL_STATIC_JAVA_LIBRARIES`或`LOCAL_JAVA_LIBRARIES`将库链接到我们的模块。 然而,retrofit2本身还依赖其他库(如okhttp, okio等),所以我们需要同时包含这些传递依赖。 但是,请注意,在Android.mk中管理多个Java库的依赖关系非常繁琐,尤其是当库有多个传递依赖时。因此,强烈建议使用Gradle来管理Java依赖。 如果项目必须使用Android.mk,那么我们需要手动下载retrofit2及其所有传递依赖的jar包,并按照上述方法逐个包含。 参考引用[3]中关于在Android.mk中引用so库的方法,我们可以类比处理jar包: 例如,假设我们将retrofit2的jar包放在libs/retrofit-2.x.x.jar,然后创建一个Android.mk片段来声明预构建的Java库。 具体步骤: 步骤1:在项目目录下创建一个目录,比如prebuilt_libs,用于存放所有预构建的Java库(jar文件)。 步骤2:在Android.mk中,我们需要为每个jar包编写模块定义。例如: ``` include $(CLEAR_VARS) LOCAL_MODULE := retrofit2 LOCAL_SRC_FILES := libs/retrofit-2.9.0.jar LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE_SUFFIX := .jar include $(BUILD_PREBUILT) ``` 步骤3:然后在我们的应用程序模块的Android.mk中,通过`LOCAL_STATIC_JAVA_LIBRARIES`来引用这些模块: ``` include $(CLEAR_VARS) LOCAL_PACKAGE_NAME := MyApp ... # 其他配置 LOCAL_STATIC_JAVA_LIBRARIES := retrofit2 include $(BUILD_PACKAGE) ``` 但是,由于retrofit2有多个依赖,我们还需要为每个传递依赖的jar包做同样的操作,并添加到`LOCAL_STATIC_JAVA_LIBRARIES`中。 另外,我们也可以使用`LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES`来一次声明多个jar包,例如: ``` LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ retrofit2:libs/retrofit-2.9.0.jar \ okhttp3:libs/okhttp-4.9.0.jar \ okio:libs/okio-2.8.0.jar include $(BUILD_MULTI_PREBUILT) ``` 然后在应用程序模块的Android.mk中: ``` LOCAL_STATIC_JAVA_LIBRARIES := retrofit2 okhttp3 okio ``` 注意:依赖的传递性需要我们自己分析,确保所有必要的依赖都被包含。 然而,这种方法非常麻烦,而且retrofit2还可能依赖其他库,因此在实际操作中,我们可能需要查看retrofit2的pom文件来确定所有传递依赖。 考虑到以上复杂性,如果项目允许,强烈建议迁移到Android Studio和Gradle,这样我们可以简单地添加: ``` dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' } ``` 但是,如果必须使用Android.mk,那么我们需要手动管理所有依赖。 另外,引用[4]中提到了混淆和D8、R8,这也提醒我们在使用这些库时可能需要配置混淆规则。但这是另一个话题。 总结:在Android.mk中添加retrofit2依赖,需要手动下载retrofit2及其所有传递依赖的jar包,然后通过`LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES`和`LOCAL_STATIC_JAVA_LIBRARIES`来包含它们。 由于这个过程非常繁琐,且容易出错,我们再次建议使用Gradle来管理依赖。 如果用户的项目确实无法使用Gradle,那么请务必确保所有传递依赖都被正确包含。 最后,生成相关问题: </think> 在 Android.mk 文件中添加 Retrofit2 依赖需要手动管理 JAR/AAR 文件和依赖关系,因为 Android.mk 主要用于 NDK 开发而非 Java 库管理。以下是具体步骤: ### 添加 Retrofit2 依赖的方法 1. **下载依赖** - 从 [Maven Central](https://search.maven.org/) 下载: - Retrofit2: `retrofit-2.x.x.jar` - 必需依赖:`okhttp-4.x.x.jar` 和 `okio-3.x.x.jar` - Gson 转换器 (可选):`converter-gson-2.x.x.jar` 2. **放置库文件** ```makefile # 在项目目录创建 libs 文件夹 mkdir libs # 将下载的 JAR 文件放入 libs cp *.jar libs/ ``` 3. **配置 Android.mk** ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 指定模块名 LOCAL_MODULE := YourAppName # 添加 Retrofit 及依赖库 LOCAL_STATIC_JAVA_LIBRARIES := \ retrofit2 \ okhttp \ okio \ converter-gson # 按需添加 # 包含 Java 源码 LOCAL_SRC_FILES := $(call all-java-files-under, src) # 链接预构建库 include $(BUILD_PACKAGE) # 声明预构建库模块 include $(CLEAR_VARS) LOCAL_MODULE := retrofit2 LOCAL_SRC_FILES := libs/retrofit-2.9.0.jar include $(PREBUILT_STATIC_JAVA_LIBRARY) # 重复添加其他依赖 include $(CLEAR_VARS) LOCAL_MODULE := okhttp LOCAL_SRC_FILES := libs/okhttp-4.10.0.jar include $(PREBUILT_STATIC_JAVA_LIBRARY) ``` 4. **处理 Proguard 混淆(可选)** 在 `proguard-rules.pro` 中添加: ```proguard -keep class retrofit2.** { *; } -dontwarn retrofit2.** -keepclasseswithmembers class * { @retrofit2.http.* <methods>; } ``` ### 注意事项 1. **版本兼容性** - Retrofit2 要求最低 API 级别 21(Android 5.0+) - 确保所有依赖版本匹配(如 Retrofit 2.9.0 + OkHttp 4.10.0) 2. **依赖传递** Retrofit2 依赖 OkHttp,而 OkHttp 依赖 Okio,需手动包含完整链: $$ \text{Retrofit2} \rightarrow \text{OkHttp} \rightarrow \text{Okio} $$ 3. **替代方案建议** - 推荐使用 Gradle 管理依赖(现代 Android 开发标准): ```gradle dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' } ``` - 若必须用 NDK 编译,考虑将 Java 库部分移至 Gradle 管理[^3][^4] ### 常见问题解决 - **`ClassNotFoundException`**: 检查是否遗漏传递依赖 - **网络权限**: 在 `AndroidManifest.xml` 添加: ```xml <uses-permission android:name="android.permission.INTERNET"/> ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值