Dipendenze native con il plug-in Android per Gradle

Le librerie AAR possono contenere dipendenze native utilizzabili dal plug-in Android Gradle. AGP è anche in grado di produrre AAR che espongono le librerie native ai consumatori.

Utilizzo delle dipendenze native

A partire dal plug-in Android per Gradle 4.0, le dipendenze C/C++ possono essere importate dagli AAR collegati nel file build.gradle. Gradle li renderà automaticamente disponibili nel sistema di build nativo, ma il tuo sistema di build deve essere configurato in modo da utilizzare le librerie e le intestazioni importate. Poiché le dipendenze C/C++ sono distribuite come AAR, i seguenti link sugli AAR generici potrebbero essere utili:

  • Creazione di una libreria Android per la documentazione generica AAR e come integrarla nel progetto, soprattutto se vuoi utilizzare l'AAR come dipendenza C/C++ locale.
  • Aggiungi dipendenze di build per informazioni sull'aggiunta di dipendenze al file build.gradle, in particolare per le dipendenze remote.

Questo documento è incentrato sulla configurazione del sistema di compilazione nativo e presuppone che tu abbia già aggiunto un AAR delle dipendenze C/C++ nell'ambiente di build Gradle del tuo progetto.

Dipendenze native nei AAR

Le dipendenze AAR dei moduli Gradle possono esporre librerie native per l'uso da parte dell'applicazione. All'interno dell'AAR, la directory prefab contiene un pacchetto Prefab, che include le intestazioni e le librerie della dipendenza nativa.

Ogni dipendenza può esporre al massimo un pacchetto prefabbricato, che comprende uno o più moduli. Un modulo prefabbricato è una singola libreria, che può essere condivisa, statica o solo con intestazione.

Per utilizzare le librerie, è necessario conoscere i nomi dei pacchetti e dei moduli. Per convenzione, il nome del pacchetto corrisponderà al nome dell'artefatto Maven e il nome del modulo corrisponderà al nome della libreria C/C++, ma questo non è obbligatorio. Consulta la documentazione della dipendenza per determinare quali nomi utilizza.

Crea configurazione di sistema

La funzionalità prefab deve essere attivata per il tuo modulo Android Gradle.

Per farlo, aggiungi quanto segue al blocco android del file build.gradle del tuo modulo:

Kotlin

buildFeatures {
  prefab = true
}

trendy

buildFeatures {
  prefab true
}

Se vuoi, configura una versione nel file gradle.properties del tuo progetto:

android.prefabVersion=2.0.0

In genere, la versione AGP predefinita selezionata soddisfa le tue esigenze. Dovresti selezionare una versione diversa solo se c'è un bug da risolvere o se ti interessa una nuova funzionalità.

Le dipendenze importate da un AAR sono esposte a CMake tramite CMake_FIND_ROOT_PATH. Questo valore verrà impostato automaticamente da Gradle quando viene richiamato CMake, quindi se la tua build modifica questa variabile, assicurati di aggiungerla anziché assegnarla.

Ogni dipendenza espone un pacchetto di config-file alla tua build. Questi vengono importati con il comando find_package. Questo comando cerca i pacchetti file config corrispondenti al nome e alla versione del pacchetto specificati ed espone le destinazioni che deve essere utilizzato nella build. Ad esempio, se l'applicazione definisce libapp.so e utilizza cURL, CMakeLists.txt deve includere quanto segue:

add_library(app SHARED app.cpp)

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

app.cpp ora può #include "curl/curl.h", libapp.so verrà collegato automaticamente a libcurl.so durante la creazione e libcurl.so verrà incluso nell'app.

Pubblicare librerie native in AAR

La possibilità di creare AAR nativi è stata aggiunta per la prima volta in AGP 4.1.

Per esportare le librerie native, aggiungi quanto segue al blocco android del file build.gradle.kts del tuo progetto di libreria:

Kotlin


buildFeatures {
    prefabPublishing = true
}

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

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

trendy


buildFeatures {
    prefabPublishing true
}

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

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

In questo esempio, le librerie mylibrary e myotherlibrary di ndk-build o di build nativa esterna CMake verranno pacchettizzate nell'AAR prodotto dalla tua build e ciascuna esporterà le intestazioni dalla directory specificata ai rispettivi dipendenti.