Creare una raccolta Android

Una libreria Android è strutturalmente uguale a un modulo di app per Android. Include tutto il necessario per creare un'app, compresi codice sorgente, file di risorse e un file manifest Android.

Tuttavia, anziché compilare un APK eseguito su un dispositivo, una libreria Android viene compilata in un file Android Archive (AAR) che puoi utilizzare come dipendenza per un modulo di app Android. A differenza dei file JAR, i file AAR offrono le seguenti funzionalità per le app per Android:

  • I file AAR possono contenere risorse Android e un file manifest, che consente di raggruppare risorse condivise come layout e disegnabili, oltre a classi e metodi Kotlin o Java.
  • I file AAR possono contenere librerie C/C++ che vengono utilizzate dal codice C/C++ del modulo dell'app.

Un modulo libreria è utile nelle seguenti situazioni:

  • Quando si creano più app che usano alcuni degli stessi componenti, come attività, servizi o layout
  • Quando crei un'app presente in più varianti dell'APK, ad esempio una versione senza costi e a pagamento, che condividono componenti principali

In entrambi i casi, sposta i file che vuoi riutilizzare in un modulo della libreria, quindi aggiungi la libreria come dipendenza per ogni modulo dell'app.

Questa pagina spiega come creare e utilizzare un modulo dedicato alla libreria Android. Per indicazioni su come pubblicare una raccolta, consulta Pubblicare la propria raccolta

Crea un modulo della libreria

Per creare un nuovo modulo della libreria nel tuo progetto, procedi come segue:

  1. Fai clic su File > Nuovo > Nuovo modulo.
  2. Nella finestra di dialogo Crea nuovo modulo visualizzata, fai clic su Libreria Android e poi su Avanti.

    C'è anche un'opzione per creare una libreria Kotlin o Java, che crea un file JAR tradizionale. Sebbene un file JAR sia utile per molti progetti, in particolare quando vuoi condividere codice con altre piattaforme, non consente di includere risorse Android o file manifest, il che è molto utile per il riutilizzo del codice nei progetti Android. Questa guida è incentrata sulla creazione di librerie Android.

  3. Assegna un nome alla libreria e seleziona una versione minima dell'SDK per il codice nella libreria, quindi fai clic su Fine.

Al termine della sincronizzazione del progetto Gradle, il modulo della libreria viene visualizzato nel riquadro Progetto. Se non vedi la nuova cartella del modulo, assicurati che il riquadro mostri la visualizzazione Android.

Convertire un modulo dell'app in un modulo della libreria

Se hai già un modulo dell'app con codice che vuoi riutilizzare, puoi convertirlo in un modulo libreria come segue:

  1. Apri il file build.gradle a livello di modulo, se utilizzi Groovy, o il file build.gradle.kts, se utilizzi lo script Kotlin.
  2. Elimina la riga relativa a applicationId. Solo un modulo per app per Android può definire questo elemento.
  3. Individua il blocco "plugins" nella parte superiore del file simile al seguente:

    trendy

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

      plugins {
          id("com.android.application")
      }
      

    Modificalo come segue:

    trendy

      plugins {
          id 'com.android.library'
      }
      

    Kotlin

      plugins {
          id("com.android.library")
      }
      
  4. Salva il file e fai clic su File > Sincronizza progetto con file Gradle.

La struttura del modulo rimane la stessa, ma ora funziona come una libreria Android. La build crea un file AAR anziché un APK.

Quando vuoi creare il file AAR, seleziona il modulo della libreria nella finestra Progetto e fai clic su Crea > APK build.

Aggiungere dipendenze con la finestra di dialogo Struttura del progetto

Puoi utilizzare la finestra di dialogo Struttura del progetto per aggiungere dipendenze al progetto. Le seguenti sezioni descrivono come utilizzare la finestra di dialogo per aggiungere dipendenze.

Usare la raccolta all'interno dello stesso progetto

Per utilizzare il codice della nuova libreria Android in un'altra app o in un altro modulo della libreria all'interno dello stesso progetto, aggiungi una dipendenza a livello di progetto:

  1. Vai a File > Struttura del progetto > Dipendenze.
  2. Seleziona il modulo a cui vuoi aggiungere la libreria.
  3. Nella scheda Dipendenze dichiarate, fai clic su e seleziona Dipendenza modulo dal menu.

  4. Nella finestra di dialogo Aggiungi dipendenza modulo, seleziona il modulo della libreria.

    Aggiungi la dipendenza del modulo nella
finestra di dialogo Struttura del progetto

  5. Seleziona la configurazione che richiede questa dipendenza o seleziona Implementazione se si applica a tutte le configurazioni, quindi fai clic su OK.

Android Studio modifica il file build.gradle o build.gradle.kts del modulo per aggiungere la dipendenza nel seguente formato:

trendy

  implementation project(path: ":example-library")

Kotlin

  implementation(project(":example-library"))

Utilizza la tua libreria in altri progetti

Il modo consigliato per condividere le dipendenze (JAR e AAR) è con un repository Maven ospitato su un servizio, come Maven Central, o con una struttura di directory sul disco locale. Per ulteriori informazioni sull'utilizzo dei repository Maven, consulta Repositori remoti.

Quando una libreria Android viene pubblicata in un Repository Maven, i metadati sono inclusi in modo che le dipendenze della libreria siano incluse nella build. In questo modo, la libreria viene deduplicata automaticamente se viene utilizzata in più luoghi.

Per utilizzare il codice della tua libreria Android in un altro modulo dell'app in un altro progetto, procedi come segue:

  1. Vai a File > Struttura del progetto > Dipendenze.
  2. Nella scheda Dipendenze dichiarate, fai clic su e seleziona Dipendenza libreria nel menu.

  3. Nella finestra di dialogo Aggiungi dipendenza dalla libreria, utilizza la casella di ricerca per trovare la libreria da aggiungere. Questo modulo cerca nei repository specificati nel blocco dependencyResolutionManagement { repositories {...}} nel file settings.gradle o settings.gradle.kts.

    Aggiungi una dipendenza dalla libreria nella
finestra di dialogo Struttura del progetto

  4. Seleziona la configurazione che richiede questa dipendenza o seleziona Implementazione se si applica a tutte le configurazioni, quindi fai clic su OK.

Controlla il file build.gradle o build.gradle.kts della tua app per verificare che venga visualizzata una dichiarazione simile alla seguente (a seconda della configurazione di build selezionata):

trendy

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

  implementation("com.example:examplelibrary:1.0.0")

Aggiungi il tuo AAR o JAR come dipendenza

Per utilizzare il codice della tua libreria Android in un altro modulo dell'app, procedi come segue:

  1. Vai a File > Struttura del progetto > Dipendenze.
  2. Nella scheda Dipendenze dichiarate, fai clic su e seleziona Dipendenza jar nel menu.

  3. Nella finestra di dialogo Aggiungi dipendenza Jar/Aar, inserisci il percorso del file AAR o JAR, quindi seleziona la configurazione a cui si applica la dipendenza. Se la libreria deve essere disponibile per tutte le configurazioni, seleziona la configurazione di implementazione.

    Aggiungi una dipendenza AAR nella finestra
di dialogo Struttura del progetto

    Controlla il file build.gradle o build.gradle.kts dell'app per verificare che venga visualizzata una dichiarazione simile alla seguente (a seconda della configurazione della build selezionata):

    trendy

      implementation files('my_path/my_lib.aar')
    

    Kotlin

      implementation(files("my_path/my_lib.aar"))
    

Per importare una dipendenza dalla build Gradle in esecuzione al di fuori di Android Studio, aggiungi un percorso per la dipendenza nel file build.gradle o build.gradle.kts dell'app. Ecco alcuni esempi:

trendy

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}

Kotlin

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
}

Per ulteriori informazioni sull'aggiunta di dipendenze Gradle, consulta Aggiungere dipendenze build.

Dichiara una risorsa pubblica

Le risorse includono tutti i file, ad esempio le immagini, nella directory res/ del progetto. Tutte le risorse di una libreria sono pubbliche per impostazione predefinita. Per rendere implicitamente private tutte le risorse, devi definire almeno un attributo specifico come pubblico.

Per dichiarare una risorsa pubblica, aggiungi una dichiarazione <public> al file public.xml della libreria. Se non hai mai aggiunto risorse pubbliche, devi creare il file public.xml nella directory res/values/ della tua libreria.

Il seguente codice di esempio crea due risorse di stringhe pubbliche con i nomi mylib_app_name e mylib_public_string:

<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

Per impedire agli utenti della tua libreria di accedere alle risorse destinate solo a uso interno, utilizza questo meccanismo automatico di designazione privata dichiarando una o più risorse pubbliche. In alternativa, puoi rendere private tutte le risorse aggiungendo un tag <public /> vuoto. Non viene contrassegnato come pubblico e tutte le risorse vengono rese private.

Tutte le risorse che vuoi mantenere visibili agli sviluppatori che utilizzano la tua libreria devono essere rese pubbliche.

La creazione implicita degli attributi impedisce agli utenti della tua libreria di ricevere suggerimenti di completamento del codice dalle risorse della libreria interna e consente agli utenti di rinominare o rimuovere le risorse private senza interrompere i client della libreria. Le risorse private vengono escluse dal completamento del codice e lo strumento lint ti avvisa quando provi a fare riferimento a una risorsa privata.

Durante la creazione di una libreria, il plug-in Android Gradle riceve le definizioni delle risorse pubbliche e le estrae nel file public.txt, che viene poi pacchettizzato all'interno del file AAR.

Considerazioni sullo sviluppo dei moduli delle biblioteche

Durante lo sviluppo dei moduli della libreria e delle app dipendenti, tieni presente i seguenti comportamenti e limitazioni.

  • Le raccolte sono unite in ordine di priorità.

    Dopo aver aggiunto i riferimenti ai moduli della libreria al modulo dell'app Android, puoi impostare la relativa priorità. In fase di creazione, le librerie vengono unite all'app una alla volta, a partire dalla priorità più bassa a quella più alta.

  • Evita conflitti di unione delle risorse.

    Gli strumenti di creazione uniscono le risorse di un modulo libreria con quelle di un modulo dell'app dipendente. Se in entrambi i moduli viene definito un determinato ID risorsa, viene utilizzata la risorsa dell'app.

    In caso di conflitti tra più librerie AAR, viene utilizzata la risorsa della libreria elencata per prima nell'elenco delle dipendenze (la più vicina all'inizio del blocco dependencies).

    Per evitare conflitti tra le risorse, utilizza classi R non transitive. Se non è possibile, valuta la possibilità di utilizzare un prefisso o un altro schema di denominazione coerente che sia univoco per il modulo o che sia univoco per tutti i moduli di progetto.

  • Nelle build multi-modulo, le dipendenze JAR vengono trattate come dipendenze transitive.

    Quando aggiungi una dipendenza JAR a un progetto di libreria che restituisce un AAR, il JAR viene elaborato dal modulo libreria e pacchettizzato con il relativo AAR.

    Tuttavia, se il progetto include un modulo libreria utilizzato da un modulo dell'app, quest'ultimo considera la dipendenza JAR locale della libreria come dipendenza transitiva. In questo caso, il JAR locale viene elaborato dal modulo dell'app che lo utilizza e non dal modulo libreria. Questo accelera le build incrementali causate dalle modifiche al codice di una libreria.

    Eventuali conflitti di risorse Java causati da dipendenze JAR locali devono essere risolti nel modulo dell'app che utilizza la libreria.

  • Un modulo libreria può dipendere da una libreria JAR esterna.

    Puoi sviluppare un modulo della libreria che dipende da una libreria esterna. In questo caso, il modulo dipendente deve essere creato in base a una destinazione che include la libreria esterna.

    Tieni presente che sia il modulo libreria sia l'app dipendente devono dichiarare la libreria esterna nei file manifest in un elemento <uses-library>.

  • Il valore del campo minSdkVersion del modulo dell'app deve essere uguale o superiore alla versione definita dalla libreria.

    Una libreria viene compilata come parte del modulo dell'app dipendente, quindi le API utilizzate nel modulo Libreria devono essere compatibili con la versione della piattaforma supportata dal modulo dell'app.

  • Ogni modulo della libreria crea il proprio corso R.

    Quando crei i moduli dell'app dipendenti, i moduli delle librerie vengono compilati in un file AAR e poi aggiunti al modulo dell'app. Di conseguenza, ogni libreria ha una propria classe R, denominata in base al nome del pacchetto della libreria.

    La classe R generata dal modulo principale e dal modulo libreria viene creata in tutti i pacchetti necessari, inclusi il pacchetto del modulo principale e i pacchetti delle librerie.

  • Un modulo libreria potrebbe includere il proprio file di configurazione ProGuard.

    Se hai un progetto libreria che utilizzi per creare e pubblicare un AAR, puoi aggiungere un file di configurazione ProGuard alla configurazione di compilazione della tua libreria. In questo caso, il plug-in Android Gradle applica le regole ProGuard che hai specificato. Gli strumenti di creazione incorporano questo file all'interno del file AAR generato per il modulo dedicato alle librerie. Quando aggiungi la libreria a un modulo dell'app, il file ProGuard della libreria viene aggiunto al file di configurazione ProGuard (proguard.txt) del modulo dell'app.

    Incorporando un file ProGuard nel modulo della libreria, puoi assicurarti che i moduli dell'app che dipendono dalla tua libreria non debbano aggiornare manualmente i file ProGuard per utilizzare la libreria. Quando il sistema di build di Android Studio crea la tua app, utilizza le istruzioni sia del modulo dell'app sia della libreria. Quindi non è necessario eseguire uno strumento di riduzione del codice sulla libreria in un passaggio separato.

    Per aggiungere le regole ProGuard al progetto della libreria, specifica il nome del file con la proprietà consumerProguardFiles all'interno del blocco defaultConfig del file build.gradle o build.gradle.kts della libreria.

    Ad esempio, il seguente snippet imposta lib-proguard-rules.txt come file di configurazione ProGuard della libreria:

    trendy

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }

    Kotlin

    android {
        defaultConfig {
            consumerProguardFiles("lib-proguard-rules.txt")
        }
        ...
    }

    Tuttavia, se il modulo della libreria fa parte di una build multimodulo che viene compilata in un APK e non genera un AAR, esegui la riduzione del codice solo sul modulo dell'app che utilizza la libreria. Per scoprire di più sulle regole ProGuard e sul loro utilizzo, leggi l'articolo Ridurre, offuscare e ottimizzare l'app.

  • Testare un modulo della libreria è quasi come testare un'app.

    La differenza principale è che la libreria e le sue dipendenze vengono incluse automaticamente come dipendenze dell'APK di test. Ciò significa che l'APK di test include non solo il proprio codice, ma anche l'AAR della libreria e tutte le sue dipendenze. Poiché non esiste un'app separata in fase di test, l'attività androidTest installa (e disinstalla) solo l'APK di test.

    Durante l'unione di più file manifest, Gradle segue l'ordine di priorità predefinito e unisce il manifest della libreria al manifest principale dell'APK di test.

Struttura di un file AAR

L'estensione del file per un file AAR è .aar e anche il tipo di artefatto Maven è aar. Il file stesso è un file ZIP. L'unica voce obbligatoria è /AndroidManifest.xml.

Un file AAR può anche includere una o più delle seguenti voci facoltative: