Natywne zależności z wtyczką Androida do obsługi Gradle

Biblioteki AAR mogą zawierać zależności natywne, które mogą być używane przez wtyczkę Androida do obsługi Gradle. AGP może też generować pliki AAR, które udostępniają biblioteki natywne swoim konsumentom.

Korzystanie z zależności natywnych

Od wersji 4.0 wtyczki Androida do obsługi Gradle zależności C/C++ można importować z plików AAR połączonych w pliku build.gradle. Gradle automatycznie udostępni je natywnemu systemowi kompilacji, ale musisz go skonfigurować, aby korzystał z zaimportowanych bibliotek i nagłówków. Zależności C/C++ są rozpowszechniane jako pliki AAR, dlatego mogą Ci się przydać te linki dotyczące ogólnych plików AAR:

  • Tworzenie biblioteki Androida – ogólna dokumentacja dotycząca plików AAR i sposobu ich integracji z projektem, zwłaszcza gdy chcesz używać pliku AAR jako lokalnej zależności C/C++.
  • Dodawanie zależności kompilacji, aby dowiedzieć się, jak dodawać zależności do pliku build.gradle, zwłaszcza w przypadku zależności zdalnych.

W tym dokumencie skupiamy się na konfigurowaniu natywnego systemu kompilacji i zakładamy, że do środowiska kompilacji Gradle projektu dodano już zależność C/C++ w formacie AAR.

Zależności natywne w plikach AAR

Zależności AAR modułów Gradle mogą udostępniać biblioteki natywne do użycia przez aplikację. W pliku AAR katalog prefab zawiera pakiet Prefab, który obejmuje nagłówki i biblioteki zależności natywnej.

Każda zależność może udostępniać maksymalnie 1 pakiet Prefab, który składa się z co najmniej 1 modułu. Moduł Prefab to pojedyncza biblioteka, która może być biblioteką udostępnioną, statyczną lub zawierającą tylko nagłówki.

Aby korzystać z bibliotek, musisz znać nazwy pakietów i modułów. Zgodnie z konwencją nazwa pakietu będzie odpowiadać nazwie artefaktu Maven, a nazwa modułu będzie odpowiadać nazwie biblioteki C/C++, ale nie jest to wymagane. Aby dowiedzieć się, jakich nazw używa, zapoznaj się z dokumentacją zależności.

Konfiguracja systemu kompilacji

Funkcja prefab musi być włączona w module Androida do obsługi Gradle.

Aby to zrobić, dodaj do bloku android w pliku build.gradle modułu te informacje:

Kotlin

buildFeatures {
  prefab = true
}

Dynamiczny

buildFeatures {
  prefab true
}

Opcjonalnie możesz skonfigurować wersję w pliku gradle.properties projektu:

android.prefabVersion=2.0.0

Zwykle domyślna wersja AGP będzie odpowiadać Twoim potrzebom. Inną wersję należy wybrać tylko wtedy, gdy chcesz obejść błąd lub skorzystać z nowej funkcji.

Zależności zaimportowane z pliku AAR są udostępniane CMake za pomocą CMAKE_FIND_ROOT_PATH. Ta wartość zostanie ustawiona automatycznie przez Gradle po wywołaniu CMake, więc jeśli kompilacja modyfikuje tę zmienną, pamiętaj, aby ją dołączyć, a nie przypisać.

Każda zależność udostępnia kompilacji pakiet plików konfiguracji. Są one importowane za pomocą polecenia find_package. To polecenie wyszukuje pakiety config-file pasujące do podanej nazwy i wersji pakietu oraz udostępnia zdefiniowane w nich cele do użycia w kompilacji. Jeśli na przykład aplikacja definiuje libapp.so i używa curl, CMakeLists.txt powinien zawierać te informacje:

add_library(app SHARED app.cpp)

# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)

app.cpp może teraz #include "curl/curl.h", libapp.so będzie automatycznie połączony z libcurl.so podczas kompilacji, a libcurl.so będzie dołączony do aplikacji.

Publikowanie bibliotek natywnych w plikach AAR

Możliwość tworzenia natywnych plików AAR została po raz pierwszy dodana we wtyczce Androida do obsługi Gradle 4.1.

Aby wyeksportować biblioteki natywne, dodaj do bloku android w pliku build.gradle.kts projektu biblioteki ten kod:

Kotlin

buildFeatures {
    prefabPublishing = true
}

prefab {
    create("mylibrary") {
      headers = "src/main/cpp/mylibrary/include"
    }

    create("myotherlibrary") {
        headers = "src/main/cpp/myotherlibrary/include"
    }
}

Dynamiczny

buildFeatures {
    prefabPublishing true
}

prefab {
    mylibrary {
      headers "src/main/cpp/mylibrary/include"
    }

    myotherlibrary {
        headers "src/main/cpp/myotherlibrary/include"
    }
}

W tym przykładzie biblioteki mylibrary i myotherlibrary z zewnętrznej kompilacji natywnej ndk-build lub CMake zostaną spakowane w pliku AAR utworzonym przez kompilację, a każda z nich wyeksportuje nagłówki z określonego katalogu do zależnych od nich elementów.