Android Gradle 插件中的原生依赖项

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 外部原生构建的mylibrarymyotherlibrary 库将打包到您的构建生成的 AAR 中,并且每个库都将从指定的目录向其依赖项导出头文件。