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 依赖项,了解有关如何将依赖项(尤其是远程依赖项)添加到您的 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 会自动设置此值,因此如果您的 build 修改了此变量,请务必确保对其附加相应值而不是直接赋值。

每个依赖项都会向您的 build 公开 config-file 软件包。这些软件包是通过 find_package 命令导入的。此命令会搜索与给定软件包名称和版本匹配的 config-file 软件包,并公开为您的 build 指定的目标。例如,如果您的应用定义了 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.solibcurl.so 相关联,并将 libcurl.so 包含在应用中。

在 AAR 中发布原生库

在 AGP 4.1 中首次添加了创建原生 AAR 的功能。

如需导出原生库,请将以下代码添加到库项目的 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 外部原生 build 的 mylibrarymyotherlibrary 库会打包到您的 build 生成的 AAR 中,并分别将标头从指定目录导出到其依赖项。