AAR 库可以包含 Android Gradle 插件可以使用的原生依赖项。AGP 还能够生成向其使用者公开原生库的 AAR。
使用原生依赖项
从 Android Gradle 插件 4.0 开始,可以从 build.gradle
文件中链接的 AAR 导入 C/C++ 依赖项。Gradle 将自动使这些依赖项可用于原生构建系统,但您的构建系统必须配置为使用导入的库和头文件。由于 C/C++ 依赖项以 AAR 的形式分发,以下关于通用 AAR 的链接可能会有所帮助:
- 创建 Android 库,以获取通用 AAR 文档以及如何将其集成到您的项目中,特别是当您想将 AAR 用作本地 C/C++ 依赖项时。
- 添加构建依赖项,以获取将依赖项添加到您的
build.gradle
文件的信息,特别是对于远程依赖项。
本文档重点介绍如何配置您的原生构建系统,并假定您已将 C/C++ 依赖项 AAR 添加到项目的 Gradle 构建环境中。
AAR 中的原生依赖项
您的 Gradle 模块的 AAR 依赖项可以公开原生库供您的应用程序使用。在 AAR 内部,prefab
目录包含一个 Prefab 软件包,其中包含原生依赖项的头文件和库。
每个依赖项最多可以公开一个 Prefab 软件包,该软件包包含一个或多个模块。Prefab 模块是单个库,可以是共享库、静态库或仅头文件库。
必须知道软件包和模块名称才能使用这些库。按照惯例,软件包名称将与 Maven 工件名称匹配,模块名称将与 C/C++ 库名称匹配,但这不是必需的。请查阅依赖项的文档以确定它使用的名称。
构建系统配置
必须为您的 Android Gradle 模块启用 prefab
功能。
为此,请将以下内容添加到模块的 build.gradle
文件的 android
块中
Kotlin
buildFeatures { prefab = true }
Groovy
buildFeatures { prefab true }
(可选)在您项目的 gradle.properties
文件中配置 版本
android.prefabVersion=2.0.0
通常,AGP 选择的默认版本会满足您的需求。只有在需要解决 bug 或需要新功能时才应选择不同的版本。
从 AAR 导入的依赖项通过 CMAKE_FIND_ROOT_PATH 公开给 CMake。当调用 CMake 时,Gradle 将自动设置此值,因此如果您的构建修改了此变量,请务必追加而不是赋值给它。
每个依赖项都会向您的构建公开一个 配置文件包。这些包通过 find_package 命令导入。此命令搜索与给定包名称和版本匹配的配置文件包,并公开其定义的目标以供您的构建使用。例如,如果您的应用程序定义 libapp.so
并且它使用 cURL,则您的 CMakeLists.txt
应包含以下内容:
add_library(app SHARED app.cpp)
# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)
app.cpp
现在可以 #include "curl/curl.h"
,libapp.so
在构建时将自动链接到 libcurl.so
,并且 libcurl.so
将包含在应用程序中。
在 AAR 中发布原生库
创建原生 AAR 的能力首次添加于 AGP 4.1。
要导出您的原生库,请将以下内容添加到您的库项目的 build.gradle.kts
文件的 android
块中
Kotlin
buildFeatures { prefabPublishing = true } prefab { create("mylibrary") { headers = "src/main/cpp/mylibrary/include" } create("myotherlibrary") { headers = "src/main/cpp/myotherlibrary/include" } }
Groovy
buildFeatures { prefabPublishing true } prefab { mylibrary { headers "src/main/cpp/mylibrary/include" } myotherlibrary { headers "src/main/cpp/myotherlibrary/include" } }
在此示例中,来自 ndk-build 或 CMake 外部原生构建的 mylibrary
和 myotherlibrary
库将被打包到您的构建生成的 AAR 中,并且每个库都会将其指定目录中的头文件导出给它们的依赖项。