具有 Android Gradle 外掛程式的原生依附元件

AAR 程式庫可能包含 Android Gradle 外掛程式可使用的原生依附元件。AGP 也能產生 AAR,藉此向消費者顯示原生程式庫。

使用原生依附元件

從 Android Gradle 外掛程式 4.0 開始,C/C++ 依附元件可以從 build.gradle 檔案中的已連結 AAR 匯入。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 能符合您的需求。除非您需要修正錯誤或想使用的新功能,否則應選取其他版本。

從 AAR 匯入的依附元件會透過 CC_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 中發布原生程式庫

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 外部原生建構作業的 mylibrarymyotherlibrary 程式庫會封裝在建構產生的 AAR 中,並且每個都會將標頭從指定目錄匯出到他們的依附元件。