Come includere manualmente il pacchetto aar esterno usando il nuovo sistema Android Build Gradle


406

Ho sperimentato il nuovo sistema di build Android e ho riscontrato un piccolo problema. Ho compilato il mio pacchetto aar di ActionBarSherlock che ho chiamato 'actionbarsherlock.aar'. Quello che sto cercando di fare è effettivamente usare questo aar per costruire il mio APK finale. Se includo l'intera libreria ActionBarSherlock come modulo di libreria Android nel mio progetto principale usando il progetto di compilazione (': actionbarsherlock') sono in grado di costruire con successo senza problemi.

Ma il mio problema è che voglio fornire quella dipendenza come un pacchetto di file aAR MANUALMENTE solo se farei un JAR, non riesco a capire come includerlo correttamente nel mio progetto. Ho tentato di utilizzare la configurazione di compilazione ma questo non sembra funzionare. Continuo a non riuscire a trovare il simbolo durante la compilazione, il che mi dice che il pacchetto class.jar di aar non viene incluso nel percorso di classe.

Qualcuno sa della sintassi per includere manualmente un pacchetto aar come file?

build.gradle

buildscript {

 repositories {
     mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4'
  }
}
apply plugin: 'android'

repositories {
   mavenCentral()
}
dependencies {
    compile files('libs/actionbarsherlock.aar')
}

android {
    compileSdkVersion 15
    buildToolsVersion "17.0"
}

EDIT: Quindi la risposta è che al momento non è supportato, ecco il problema se vuoi seguirlo.

EDIT: attualmente poiché questo non è ancora supportato direttamente, la migliore alternativa sembra essere la soluzione proposta da @RanWakshlak

EDIT: anche più semplice usando la sintassi proposta da @VipulShah


Considera la risposta di Vipul Shah: alla fine ha funzionato per me, senza repository maven locale, a partire da Android Studio 0.5.8.
shkschneider,

Date un'occhiata alla mia domanda e risposta qui stackoverflow.com/a/31662782/746347
Mixel

Se si utilizza Gradle 3.0.0 o superiore, questa semplice impostazione Gradle funzionato per me: stackoverflow.com/questions/29081429/...
user1506104

Risposte:


670

Seguire i passaggi seguenti per farlo funzionare (l'ho testato su Android Studio 2.2)

Diciamo che hai tenuto il file nella cartella libs. (supponiamo che il nome del file siacards.aar )

quindi nell'app build.gradlespecificare quanto segue e fare clic su Sincronizza progetto con i file Gradle. Apri Build.gradle a livello di progetto e aggiungi flatDir{dirs 'libs'}come fatto di seguito

allprojects {
   repositories {
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}

e ora apri il file build.grdle a livello di app e aggiungi il .aarfile

    dependencies {
       compile(name:'cards', ext:'aar')
}

Se tutto va bene vedrai la voce della libreria fatta in build -> esplded-aar

Inoltre, se stai importando un file .aar da un altro progetto che ha dipendenze, dovrai includerle anche nel tuo build.gradle.


5
@VipulShah dove si trova la directory libs?
StuStirling,

2
Forse dovrebbe essere consigliato inserire le modifiche nel modulo dell'app 'build.gradle' e non nella cartella principale 'build.gradle'.
loloof64,

4
ho trovato la risposta alla mia domanda sopra: invece della compiledipendenza aggiungi due dipendenze debugCompile(name:'cards-debug', ext:'aar')ereleaseCompile(name:'cards-release', ext:'aar')
Iftah,

2
Non essere confuso con il codice di esempio. Il primo blocco con allprojects {...}va al file di livello di livello "progetto" e la seconda parte con dependencies {...}va al file di livello di livello "app".
Kirill Karmazin,

8
Aggiorna la risposta: ATTENZIONE: la configurazione 'compilare' è obsoleta ed è stata sostituita con 'implementazione' e 'api'. Sarà rimosso alla fine del 2018. Per ulteriori informazioni, consultare: d.android.com/r/tools/update-dependency-configurations.html
B-GangsteR

248
  1. Fare clic con il tasto destro sul progetto e selezionare "Apri le impostazioni del modulo" .

Apri le impostazioni del modulo

  1. Fai clic sul pulsante "+" nell'angolo in alto a sinistra della finestra per aggiungere un nuovo modulo.

Aggiungi nuovo modulo

  1. Seleziona "Importa pacchetto .JAR o .AAR" e fai clic sul pulsante "Avanti" .

Importa AAR

  1. Trova il file AAR usando il pulsante con i puntini di sospensione "..." accanto al campo "Nome file".

Trova il file AAR

  1. Mantieni selezionato il modulo dell'app e fai clic sul riquadro Dipendenze per aggiungere il nuovo modulo come dipendenza.

Riquadro Dipendenze

  1. Utilizzare il pulsante "+" della schermata delle dipendenze e selezionare "Dipendenza del modulo" .

Aggiungi dipendenza del modulo

  1. Seleziona il modulo e fai clic su "OK" .

Scegli il modulo


4
Migliore risposta, tieni presente che dopo aver reso Alt+B> pulito e ricostruito il progetto. Android Studio perché sei doloroso! Vorrei avere NetBeans IDE come piattaforma per sviluppatori Android
java acm

@Oliver Sei fantastico!
Ankit Purwar,

Sei il migliore!
codezombie,

2
Non è la migliore idea creare un nuovo modulo ogni volta che vuoi solo aggiungere un po 'di aarlib al tuo progetto
Kirill Karmazin,

Sei fantastico amico mio !! Saluti a questo.
Timothy Macharia,

112

È possibile fare riferimento a un file aar da un repository. Un maven è un'opzione, ma esiste una soluzione più semplice: metti il ​​file aar nella tua directory libs e aggiungi un repository di directory.

    repositories {
      mavenCentral()
      flatDir {
        dirs 'libs'
      }
    }

Quindi fare riferimento alla libreria nella sezione delle dipendenze:

  dependencies {
        implementation 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
}

Puoi dare un'occhiata al post sul blog di Min'an per maggiori informazioni.


1
Funziona alla grande, ed è migliore delle risposte accettate / votate più alte perché è più semplice e posso includerlo nel controllo della versione senza aggiungere il file al repository maven dello sviluppatore locale (se dovessi farlo, perché usare Gradle in primo luogo ?) Grazie!
ajpolt,

@ajpolt Probabilmente ti consigliamo di impostare un server repo invece (per i deps proprietari) in modo da non doverlo mettere su macchine dev o nella cartella lib del tuo progetto. Se hai solo una dipendenza, gettala in un repository di codice Google strutturato maven (come repository temporaneo)
Lo-Tan,

4
Il punto più importante da notare in questa risposta è la menzione di "@aar" alla fine della dipendenza.
Atharva,

Suppongo che questo non funziona più con ultimo plugin Gradle: stackoverflow.com/questions/60878599/...
David

Questa è l'unica risposta che include la forma più semplice, con tutta la sintassi moderna, incluso implementationecc. Questa è copia-incolla della soluzione. Molti nuovi voti in arrivo perché Android Build Gradle Plugin 4.0.0 ora genera un errore invece di ignorare i percorsi .aar non funzionanti
Patrick,

52

L'approccio seguente funziona con l'ultimo Android Studio (> v0.8.x):

  • Salvare il aarfile nella libscartella del modulo dell'app (ad es . <project>/<app>/libs/myaar.aar:)

  • Aggiungi quanto segue a build.gradle della cartella del modulo "app" (non alla build del progetto build.gradle). Nota il nome nella riga di compilazione, è myaar @ aar non myaar.aar.

    dependencies {
        compile 'package.name.of.your.aar:myaar@aar'
    }
    
    repositories{
        flatDir{
            dirs 'libs'
        }
    }
  • Clic Tools -> Android -> Sync Project with Gradle Files


3
Funziona perfettamente su AS 1.0
Pablo Johnson il

1
Nel caso in cui qualcuno ne abbia bisogno, se Gradle funziona bene ma non riesci ancora a vedere le lezioni, riavvia Android Studio ...
htafoya

1
Questa soluzione funziona alla grande in AS2.2 - sembra che Gradle sia incredibilmente esigente nella sintassi dei file AAR.
Jim Andreas,

Aggiorna o elimina, la compilazione è obsoleta e c'è anche questo problema: stackoverflow.com/questions/60878599/…
David

49

prima (default)

implementation fileTree(include: ['*.jar'], dir: 'libs')

basta aggiungere '*.aar'in includearray.

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

funziona bene su Android Studio 3.x.

se vuoi ignorare qualche libreria? fare così.

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')

2
Mentre questo codice può rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Alexander,

1
Funzionando bene, questa è la strada da percorrere se la libreria è semplice. Ma il loro è un problema qui: è necessario importare tutta la libreria importata nel file aar per farlo funzionare. L'importazione dal file aar non viene propagata con questo metodo.
Tobliug

O ancora più semplice:implementation fileTree(include: ['*.?ar'], dir: 'libs')
friederbluemle il

@friederbluemle Piuttosto che più semplice direi più breve, e allo stesso tempo non specifico, teoricamente.
David,

21

Ci sono appena riuscito!

  1. Copia il file mylib-0.1.aar nella cartella libs /

  2. Aggiungi queste righe in fondo a build.gradle (dovrebbe essere un'app, non un progetto):

    repositories {
       flatDir {
           dirs 'libs'
       }
    }
    dependencies {
        compile 'com.example.lib:mylib:0.1@aar'
    }
  3. Fin qui tutto bene. Ecco il punto più importante:

Gradle deve accedere alla rete per dipendenze a meno che non sia abilitata la modalità offline.

Assicurati di aver abilitato il lavoro offline tramite la casella di controllo in Strutture di progetto / Grado

-- O --

Configurare le impostazioni del proxy per accedere alla rete.

Per configurare le impostazioni del proxy devi modificare il file gradle.properties del progetto , configurando separatamente http e https come di seguito:

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=pass
systemProp.http.nonProxyHosts=localhost
systemProp.http.auth.ntlm.domain=example <for NT auth>

systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user
systemProp.https.proxyPassword=pass
systemProp.https.nonProxyHosts=localhost
systemProp.https.auth.ntlm.domain=example <for NT auth>

Spero che funzioni.


Aggiorna o elimina, la compilazione è obsoleta e c'è anche questo problema: stackoverflow.com/questions/60878599/…
David

20

Attualmente fare riferimento a un file .aar locale non è supportato (come confermato da Xavier Ducrochet)

Quello che puoi fare invece è impostare un repository Maven locale (molto più semplice di quanto sembri) e fare riferimento al .aar da lì.

Ho scritto un post sul blog che spiega come farlo funzionare qui:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds


Non sono riuscito a farlo funzionare quando l'artefatto è un'istantanea, hai idea del perché?
tbruyelle,

Hai funzionato solo con Eclipse o Android Studio? Con eclipse, "gradle eclipse" aggiunge il file aar al percorso di classe, ma eclipse non riconosce le classi al suo interno.
andrej_k,

Controlla questa domanda stackoverflow.com/questions/20911665/… se dopo aver seguito il tutorial non è stato trovato il tuo file .aar locale (su Gradle 1.9 o superiore)
Maragues

Aggiorna o elimina, questa risposta è obsoleta.
David

19

È possibile aggiungere più aardipendenze con solo poche righe di codice.

Aggiungi flatDirrepository locale :

repositories {
    flatDir {
        dirs 'libs'
    }
} 

Aggiungere tutti aarnella libsdirectory di compileconfigurazione di dipendenze:

fileTree(dir: 'libs', include: '**/*.aar')
        .each { File file ->
    dependencies.add("compile", [name: file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name }, ext: 'aar'])
}

Questo ha funzionato, ma come posso mettere un segno di spunta, se la dipendenza è già stata aggiunta come dipendenza maven, non voglio che il file aar debba essere aggiunto, PS: sto usando questo per scrivere un plugin che aggiunge automaticamente il mio aar al progetto Android e aggiunge dipendenza in build.gradle
Adi

@Adi Se hai già una dipendenza maven, non mettere l'aar corrispondente nella libscartella.
mixel

Grazie per la risposta, come ho già detto, l'aggiunta di aar a libs è automatizzata da un plug-in Android Studio che in fase di sviluppo, quindi voglio sapere se la dipendenza che il plug-in aggiunge al file build.gradle è già stata aggiunta in precedenza.
Adi,

Non ho una risposta adesso. Penso che sia meglio creare una domanda separata.
Mixel

15

Sfortunatamente nessuna delle soluzioni qui ha funzionato per me (ottengo dipendenze irrisolte). Quello che alla fine ha funzionato ed è il modo più semplice di IMHO: evidenzia il nome del progetto da Android Studio, quindi File -> Nuovo modulo -> Importa JAR o pacchetto AAR. Il merito va alla soluzione in questo post


1
Va notato che Android Studio è eccezionalmente vago nella procedura guidata di importazione. Quando dichiarano "Nome file" in uno dei passaggi, quello che stanno effettivamente chiedendo è il percorso del file ... Speriamo che questo messaggio salvi gli altri da un mal di testa.
Tukajo,

13

Ci sono 2 modi:

Il primo modo

  1. Apri Android Studio e vai alla Create New Modulefinestra diFile -> New -> New Module

inserisci qui la descrizione dell'immagine

  1. Seleziona l' Import .JAR/.AAR Packageelemento e fai clic sul Nextpulsante

  2. Aggiungi una dipendenza nel build.gradlefile che appartiene al tuo appmodulo.

    dependencies {
        ...
        implementation project(path: ':your aar lib name')
    }

È tutto.

Il secondo modo

  1. Creare una cartella nella libsdirectory, ad esempio aars.

  2. Metti la tua libreria aar nella cartella aars.

  3. Aggiungi lo snippet di codice

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

nel tuo build.gradlefile appartiene al modulo dell'app.

  1. Aggiungi una dipendenza nel build.gradlefile che appartiene al tuo appmodulo.
dependencies {
    ...
    implementation (name:'your aar lib name', ext:'aar')
}

È tutto.

Se riesci a leggere il cinese, puoi controllare il blog 什么 是 AAR 文件 以及 如何 在 Android 开发 中 使用


questa risposta è stata davvero utile per me
Csabi

Se seguite per la prima volta, le classi all'interno del file aar non vengono rilevate nel progetto principale, è necessario aggiungere ulteriori configurazioni?
Kiran,

Si prega di aggiornare o eliminare, le prime risposte sono già pubblicate e la seconda "compilazione" è obsoleta.
David,

12

Con Android Studio 3.4 e Gradle 5 puoi semplicemente farlo in questo modo

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}

1
Questa è la risposta migliore La dipendenza è esplicita e molto semplice.
Nikmoon,

1
Concordato sul fatto che questa sia la risposta migliore. Immediatamente funzionante, è stato perfetto per aggiungere dipendenze .aar a una libreria nativa React.
Josh Baker,

1
Questo genera un errore a partire con il plugin Gradle 4: stackoverflow.com/questions/60878599/...
David

@David Grazie per il rapporto, proverò a provarlo al più presto.
m0skit0

10

AGGIORNAMENTO STUDIO ANDROID 3.4

  1. Vai a File -> Struttura del progetto

inserisci qui la descrizione dell'immagine

  1. Moduli e fare clic su +

inserisci qui la descrizione dell'immagine

  1. Seleziona Importa pacchetto .aar

inserisci qui la descrizione dell'immagine

  1. Trova il percorso .aar

inserisci qui la descrizione dell'immagine

  1. Termina e applica , quindi verifica se il pacchetto è stato aggiunto

inserisci qui la descrizione dell'immagine

  1. Ora nel modulo dell'app, fai clic su + e Dipendenza dal modulo

inserisci qui la descrizione dell'immagine

  1. Controlla il pacchetto della libreria e Ok

inserisci qui la descrizione dell'immagine

  1. Verifica la dipendenza aggiunta

inserisci qui la descrizione dell'immagine

  1. E la struttura del progetto in questo modo

inserisci qui la descrizione dell'immagine


1
questa è la 17a risposta che ho letto che alla fine ha aggiunto dipendenza .. eeh
Taras Matsyk l'

6

Ho anche avuto questo problema. Segnala questo problema: https://code.google.com/p/android/issues/detail?id=55863 sembra suggerire che il riferimento diretto al file .AAR non sia supportato.

Forse l'alternativa per ora è definire la libreria actionbarsherlock come libreria Gradle nella directory principale del progetto e fare riferimento di conseguenza.

La sintassi è definita qui http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


Grazie per il riferimento al problema. Sì, sono consapevole di come farlo funzionare utilizzando Gradle Android Library ma questa opzione non è davvero ottimale per il progetto a cui sto lavorando ma grazie!
Miguel Lavigne,

3

Ho trovato questa soluzione alternativa nel tracker dei problemi di Android: https://code.google.com/p/android/issues/detail?id=55863#c21

Il trucco (non una correzione) è isolare i tuoi file .aar in un sottoprogetto e aggiungere le tue librerie come artefatti:

configurations.create("default")
artifacts.add("default", file('somelib.jar'))
artifacts.add("default", file('someaar.aar'))

Ulteriori informazioni: Gestione-dipendenze-transitive-per-manufatti-locali-barattoli-e-aar


Esatto, ed ecco l'esempio: in github.com/textileio/notes/commit/… , compile project(':mobile')in android / app / build.gradle, configurations.maybeCreate("default")in android / mobile / build.gradle, include ':mobile'in android / settings.gradle
Li Zheng

3

Nel mio caso ho alcune dipendenze nella mia libreria e quando ne creo una aarho fallito, a causa di mancate dipendenze, quindi la mia soluzione è quella di aggiungere tutte le dipendenze dalla mia lib con un arrfile.

Quindi il mio livello di progetto build.gradlesembra così:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

allprojects {
    repositories {
        mavenCentral()
        //add it to be able to add depency to aar-files from libs folder in build.gradle(yoursAppModule)
        flatDir {
            dirs 'libs'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(modile app) così:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.sampleapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //your project depencies
    ...
    //add lib via aar-depency
    compile(name: 'aarLibFileNameHere', ext: 'aar')
    //add all its internal depencies, as arr don't have it
    ...
}

e biblioteca build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //here goes library projects dependencies, which you must include
    //in yours build.gradle(modile app) too
    ...
}

3

Ho provato tutte le soluzioni qui ma nessuna funziona, quindi mi rendo conto di aver fatto un errore, ho inserito la .aarcartella sbagliata, come puoi vedere di seguito, ho pensato che avrei dovuto mettere la cartella principale, quindi ho creato una libscartella lì (1 in figura ), ma all'interno della cartella dell'app, c'è già un libs, dovresti metterlo in secondo luogo libs, spero che questo aiuti quelli che hanno il mio stesso problema:

inserisci qui la descrizione dell'immagine



2

Solo per semplificare la risposta

Se il file .aar è presente localmente, includi
compile project(':project_directory')nelle dipendenze di build.gradle del tuo progetto.

Se il file .aar è presente in remoto, includi le compile 'com.*********.sdk:project_directory:0.0.1@aar'dipendenze di build.gradle del tuo progetto.


0

Nel mio caso lavoro solo quando aggiungo "progetto" per compilare:

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}


dependencies {
   compile project('com.x.x:x:1.0.0')
}

0

puoi fare qualcosa del genere:

  1. Metti le tue librerie locali (con estensione: .jar, .aar, ...) nella cartella 'libs' (o un'altra se vuoi).

  2. In build.gradle (a livello di app), aggiungi questa riga nelle dipendenze

    fileTree di implementazione (include: ['* .jar', '* .aar'], dir: 'libs')

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.