Android Gradle プラグインのネイティブ依存関係

AAR ライブラリには、Android Gradle プラグインが使用できるネイティブ依存関係を含めることができます。AGP では、ネイティブ ライブラリをユーザーに公開する AAR を生成することもできます。

ネイティブ依存関係を使用する

Android Gradle プラグイン 4.0 以降では、build.gradle ファイルでリンクされている AAR から C / C++ 依存関係をインポートできます。ネイティブ ビルドシステムは Gradle で自動的にこれらを利用できるようになりますが、固有のビルドシステムは、インポートされたライブラリとヘッダーを使用するように構成する必要があります。C / C++ 依存関係は AAR として配信されるため、一般的な AAR に関する以下のリンクが参考になります。

  • 一般的な AAR のドキュメントと AAR をプロジェクトに統合する方法については(特に AAR をローカルの C / C++ 依存関係として使用する場合は)、Android ライブラリの作成をご覧ください。
  • build.gradle ファイルに依存関係を追加する方法については(リモートの依存関係の場合は特に)ビルド依存関係の追加をご覧ください。

このドキュメントでは、ネイティブ ビルドシステムの構成方法を中心にして説明します。C / C++ 依存関係の AAR をプロジェクトの Gradle ビルド環境にすでに追加していることを前提とします。

AAR のネイティブ依存関係

Gradle モジュールの AAR 依存関係によって、アプリケーションで使用するネイティブ ライブラリを公開できます。AAR 内の prefab ディレクトリには、ネイティブ依存関係のヘッダーとライブラリを含む Prefab パッケージが含まれます。

Prefab パッケージは 1 つ以上のモジュールで構成され、各依存関係は最大 1 つのパッケージを公開できます。Prefab モジュールは単一のライブラリで、共有ライブラリ、静的ライブラリ、ヘッダーのみのライブラリのいずれかになります。

ライブラリを使用するには、パッケージ名とモジュール名を公開する必要があります。通常、パッケージ名は Maven アーティファクト名と同じで、モジュール名はライブラリ名と同じにしますが、これは必須ではありません。依存関係のドキュメントを参照して、使用する名前を決定します。

ビルドシステムの構成

Android Gradle モジュールで prefab 機能を有効にする必要があります。

それには、モジュールの build.gradle ファイルの android ブロックに次のコードを追加します。

Kotlin

buildFeatures {
  prefab = true
}

Groovy

buildFeatures {
  prefab true
}

必要に応じて、プロジェクトの gradle.properties ファイルでバージョンを構成します。

android.prefabVersion=2.0.0

通常は、選択した AGP のデフォルト バージョンがニーズに合致します。修正が必要なバグがある場合や追加したい新機能がある場合にのみ、別のバージョンを選択してください。

各依存関係は、Android.mk ファイルをビルドに公開します。これらは import-module コマンドでインポートされます。このコマンドは、ビルドのインポート ディレクトリ内で指定したパス(import-add-path で設定)を使用して Android.mk ファイルを検索し、ビルドで使用するために定義したモジュールを公開します。たとえば、アプリケーションで libapp.so を定義し、cURL を使用する場合、Android.mk ファイルに以下を含める必要があります。

include $(CLEAR_VARS)
LOCAL_MODULE := libapp
LOCAL_SRC_FILES := app.cpp
LOCAL_SHARED_LIBRARIES := curl
include $(BUILD_SHARED_LIBRARY)

# If you don't need your project to build with NDKs older than r21, you can omit
# this block.
ifneq ($(call ndk-major-at-least,21),true)
    $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH))
endif

$(call import-module,prefab/curl)

明示的な import-add-path は、r21 より前の NDK を使用する場合にのみ必要です。r21 では、NDK_GRADLE_INJECTED_IMPORT_PATH が自動的にインポートパスに追加されます。

これで 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 にパッケージ化され、それぞれが指定されたディレクトリから依存先にヘッダーをエクスポートします。