Dependensi native dengan plugin Android Gradle

Library AAR dapat berisi dependensi native yang dapat digunakan Plugin Android Gradle. AGP juga mampu menghasilkan AAR yang mengekspos library native kepada konsumennya.

Menggunakan dependensi native

Mulai dari plugin Android Gradle 4.0, dependensi C/C++ dapat diimpor dari AAR yang ditautkan dalam file build.gradle Anda. Gradle akan otomatis menyediakannya untuk sistem build native, tetapi sistem build Anda harus dikonfigurasi untuk menggunakan library dan header yang diimpor. Karena dependensi C/C++ didistribusikan sebagai AAR, link terkait AAR umum berikut mungkin berguna:

  • Membuat Library Android untuk dokumentasi AAR umum dan cara mengintegrasikannya ke dalam project, terutama saat Anda ingin menggunakan AAR sebagai dependensi C/C++ lokal.
  • Menambahkan dependensi build untuk informasi tentang cara menambahkan dependensi ke file build.gradle, terutama untuk dependensi jarak jauh.

Dokumen ini berfokus pada cara mengonfigurasi sistem build native dan berasumsi bahwa Anda telah menambahkan AAR dependensi C/C++ ke lingkungan build Gradle project.

Dependensi native di AAR

Dependensi AAR dari modul Gradle dapat menampilkan library native untuk digunakan oleh aplikasi Anda. Di dalam AAR, direktori prefab berisi paket Prefab, yang mencakup header dan library dependensi native.

Setiap dependensi dapat menampilkan maksimal satu paket Prefab, yang terdiri dari satu atau beberapa modul. Modul Prefab adalah library tunggal, yang dapat berupa library bersama, statis, atau hanya header.

Nama paket dan modul perlu diketahui untuk menggunakan library. Berdasarkan konvensi, nama paket akan cocok dengan nama artefak Maven dan nama modul akan cocok dengan nama library C/C++, namun hal ini tidak diperlukan. Lihat dokumentasi dependensi untuk menentukan nama yang digunakan.

Konfigurasi sistem build

Fitur prefab harus diaktifkan untuk modul Android Gradle.

Untuk melakukannya, tambahkan kode berikut ke blok android file build.gradle modul:

Kotlin

buildFeatures {
  prefab = true
}

Groovy

buildFeatures {
  prefab true
}

Cara lain ialah dengan mengonfigurasikan versi dalam file gradle.properties project Anda:

android.prefabVersion=2.0.0

Biasanya, versi default AGP yang dipilih akan sesuai dengan kebutuhan Anda. Anda hanya perlu memilih versi lain jika ada bug yang perlu diperbaiki atau fitur baru yang Anda inginkan.

Setiap dependensi menampilkan file Android.mk untuk build Anda. Keduanya diimpor dengan perintah import-module. Perintah ini menelusuri file Android.mk dengan jalur yang ditentukan dalam direktori impor build (seperti yang dikonfigurasi oleh import-add-path) dan menampilkan modul yang ditetapkan untuk digunakan dalam build Anda. Misalnya, jika aplikasi Anda menentukan libapp.so dan menggunakan cURL, file Android.mk Anda harus menyertakan hal berikut:

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)

Perlu diperhatikan bahwa import-add-path eksplisit hanya diperlukan saat menggunakan NDK sebelum r21. Mulai r21, NDK_GRADLE_INJECTED_IMPORT_PATH akan otomatis ditambahkan ke jalur impor.

Sekarang app.cpp dapat #include "curl/curl.h", libapp.so akan otomatis ditautkan ke libcurl.so saat melakukan build, dan libcurl.so akan disertakan dengan aplikasi.

Memublikasikan library native di AAR

Kemampuan untuk membuat AAR native pertama kali ditambahkan di AGP 4.1.

Untuk mengekspor library native, tambahkan hal berikut ke blok android dari file build.gradle.kts project library Anda:

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"
    }
}

Dalam contoh ini, library mylibrary dan myotherlibrary dari ndk-build atau build native eksternal CMake akan dipaketkan dalam AAR yang dihasilkan oleh build Anda, dan masing-masing akan mengekspor header dari direktori yang ditentukan ke turunannya.