Menambahkan file .aar lokal ke Gradle build menggunakan "flatDirs" tidak berfungsi


159

Saya menyadari pertanyaan ini: Menambahkan file .aar lokal ke bangunan gradle saya tetapi solusinya tidak bekerja untuk saya.

Saya mencoba menambahkan pernyataan ini ke tingkat atas build.gradlefile saya :

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

Saya juga memasukkan slidingmenu.aarfile ke dalam /libsdan mereferensikannya di dependenciesbagian: compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar'tetapi tidak berhasil sama sekali.

Saya mencoba compile files('libs/slidingmenu.aar')juga tetapi tidak berhasil.

Apa yang saya lewatkan? Ada ide?

PS Android Studio 0.8.2


1
flatDirs + compile (nama: 'libname', ext: 'aar') bekerja untuk saya di Android Studio 8.2.0, + gradle 1.12. Jadi pasti ada yang salah dengan file build Anda. Periksa sekali lagi atau kirim kode lebih banyak
Dari

Jawaban:


293

Berdasarkan jawaban Yosia, inilah cara saya membuatnya bekerja.

Mengikuti instruksinya (dalam edit) ( File -> New-> New Module -> Impor .JAR / .AAR ) dan impor .AAR Anda.

Kemudian di build.gradle proyek Anda (bukan yang tingkat atas, yang di bawah 'aplikasi') tambahkan yang berikut (di bagian dependensi):

dependencies {
    compile project(':Name-Of-Your-Project')
}

Catatan Nama-Dari-Proyek-Anda harus sesuai dengan nama folder yang ditambahkan setelah Anda mengimpor file AAR (pada tingkat yang sama seperti di app/.ideabawah folder tingkat paling atas). Atau dengan kata lain ...

Lamaran saya
  .ide
  aplikasi
  build.gradle (di sinilah tempat untuk menambahkan proyek kompilasi (': ProjectName') ke bagian dependensi)
  ProjectName (ditambahkan secara otomatis setelah mengimpor, cocok dengan nama file aar Anda)
  membangun
  gradle
  dll

Ini bekerja untuk saya yang menjalankan Android Studio 0.8.0. Jangan lupa untuk menyinkronkan gradle (menggunakan tombol bilah alat atau di File-> Sinkronisasi ) setelah Anda melakukan ini.

(Terima kasih kepada Yosia karena membuat saya pergi ke arah yang benar)

(Catatan: sebelum ini saya mencoba menambahkannya ke folder libs, mencoba untuk memanipulasi tingkat atas build.gradledan tingkat aplikasi build.gradle, tetapi tidak ada yang bekerja untuk file aars saya - jar itu akan berfungsi dengan baik, tetapi tidak pada file aar)


1
Astaga! Ini berhasil, terima kasih atas penjelasan terperinci. Di bawah kap impor master melakukan hal yang sama seperti yang dijelaskan di situs Tools: "Pilihan lain adalah membuat sub-proyek Gradle baru, dan untuk membuat artefak yang diterbitkan proyek ini menjadi jar atau file aar yang ingin Anda gunakan kembali. Kemudian Anda dapat dengan mudah memiliki sub-proyek Gradle lainnya bergantung pada sub-proyek baru ini. Dalam sub-proyek baru ini, cukup buat build.gradle dengan yang berikut ini: configurationations.create ("default") artifacts.add ("default", file ('somelib.aar')) "
Alexey Dmitriev

Saya mendapatkan kesalahan: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.jika saya menggunakan compile project(name:'mylibrary-debug').. Apa yang saya lewatkan?
MysticMagicϡ

2
Plugin gradle terbaru memecahkan ini. Solusi di sini: stackoverflow.com/a/28816265/560600
Sky Kelsey

1
Silakan juga melakukan Pembangunan Bersih setelah semua langkah di atas.
Iklan

1
Sejalan compile project(':Name-Of-Your-Project'), saya diganti Name-Of-Your-Projectdengan nama file .aar saya (tanpa .aarekstensi). Dan itu berhasil.
Sufian

190

Pembaruan : Seperti yang disebutkan @ amram99, masalah telah diperbaiki pada rilis Android Studio v1.3.

Diuji dan diverifikasi dengan spesifikasi di bawah ini

  • Android Studio v1.3
  • plugin gradle v1.2.3
  • Gradle v2.4

Apa yang berhasil sekarang?

  • Sekarang Anda dapat mengimpor file aar lokal melalui opsi File> New> New Module> Import .JAR / .AAR Package di Android Studio v1.3

  • Namun jawaban di bawah ini berlaku dan efektif terlepas dari perubahan Android Studio karena ini didasarkan pada skrip gradle.


Jawaban Lama: Dalam pembaruan terbaru, orang-orang di Android memecah pemasukan file aar lokal melalui Android Studio menambahkan opsi menu modul baru. Periksa Masalah yang tercantum di sini. Terlepas dari apa pun yang masuk dan keluar dari daftar fitur IDE, metode di bawah ini berfungsi ketika bekerja dengan file aar lokal (Diuji hari ini):

Letakkan file aar di direktori libs (buat jika perlu), lalu tambahkan kode berikut di build.gradle Anda:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
Ini adalah jawaban yang tepat dan cara terbaru untuk melakukannya. Harap jawab jawaban ini;)
lmo

Saya menyalin kode Anda, tetapi apakah Anda tahu mengapa saya mendapatkan kesalahan ini? "Kesalahan: Terjadi masalah saat mengonfigurasi proyek ': app'.> Artifact 'signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :)' tidak ditemukan. Dicari di lokasi berikut: jitpack.io//signalr-client-sdk-android-release//… "
toddmo

10
The repositoriesbagian berjalan dalam yang berbeda build.gradle untuk pekerjaan - yang global. Bagian ini dependenciesmasuk dalam modul build.gradle. Itu sebabnya saya mendapat kesalahan.
toddmo

@toddmo Jadi jawaban saya sebenarnya berlaku untuk file AAR lokal. yaitu file .aar yang terletak di dalam direktori libs Anda.
Nishant.

1
Terima kasih. Versi lama tidak berfungsi untuk saya, cara impor yang baru berhasil dengan sangat baik! Gradle 3.5, asyik 2.4.10
Arnold Schrijver

26

Sunting: Cara yang benar (saat ini) untuk menggunakan file AAR lokal sebagai dependensi build adalah dengan menggunakan panduan impor modul (File | Modul Baru | Impor .JAR atau paket .AAR) yang secara otomatis akan menambahkan .aar sebagai modul perpustakaan dalam proyek Anda.

Jawaban Lama

Coba ini:

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

...

compile(name:'slidingmenu', ext:'aar')

1
Juga tidak berfungsi ... Sepertinya ini adalah bug yang dikenal yang belum diperbaiki: code.google.com/p/android/issues/detail?id=55863
Alexey Dmitriev

Saya melakukan seperti yang Anda katakan di edit tetapi tidak ada yang ditambahkan pada akhirnya. Di panduan saya memilih jalur ke file AAR, nama modul yang ditentukan. Setelah mengklik Selesai itu menyinkronkan file Gradle tetapi tidak ada file baru atau baris apa pun di build.gradle muncul (tidak ada perubahan dalam copy pekerjaan Git saya). Saya mencoba dengan kedua file AAR dan JAR dengan hasil yang sama. (Saya menggunakan Android Studio 0.8.1)
Alexey Dmitriev

3
Jawaban lama ini benar-benar bekerja untuk saya selama saya memasukkan flatDir { dirs 'libs' }blok seperti yang disebutkan dalam OP menggunakan AS 8.13 / Gradle 2.1
qix

4
Saya mengimpor file .aar menggunakan metode impor baru. Tapi saya tidak bisa melihat nama kelas perpustakaan ketika saya mengetik setengah nama, dan tekan ctrl + spasi Jadi masih belum mempertimbangkan perpustakaan. Ada ide?
MysticMagicϡ

1
Versi yang diedit berfungsi dengan baik untuk Android Studio 1.2.1.1. Tidak ada skrip gradel lainnya yang harus dilakukan. Anda dapat membuat modul baru seperti yang dijelaskan di atas. Dalam dialog 'Buat Model Baru' pilih jalur ke file aar perpustakaan Anda, misalnya MyLib \ mylibrary \ build \ outputs \ aar. AS akan menyalin file ke folder lokal baru. Bangun kembali proyek aplikasi Anda dan modul perpustakaan baru akan ditampilkan pada tampilan proyek. Sekarang Anda dapat menambahkan modul perpustakaan sebagai ketergantungan untuk modul aplikasi Anda (misalnya 'aplikasi') dalam struktur proyek: Struktur Proyek | modul | aplikasi | ketergantungan | Tambah | Ketergantungan modul.
Christian Schulzendorff

15

Saya dapat ini bekerja di Android Studio 2.1. Saya memiliki modul yang disebut "Native_Ads" yang dibagikan di beberapa proyek.

Pertama, saya membuat direktori dalam modul Native_ads saya dengan nama 'aars' dan kemudian meletakkan file aar di sana.

Struktur direktori:

libs/
aars/    <-- newly created
src/
build.gradle
etc

Kemudian, perubahan lainnya:

File Gradle tingkat atas:

allprojects {
    repositories {
        jcenter()
        // For module with aar file in it
        flatDir {
            dirs project(':Native_Ads').file('aars')
        }
    }
}

File build.gradle modul aplikasi: - tidak ada perubahan

File Settings.gradle (untuk memasukkan modul):

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')

File gradle untuk modul Native_Ads:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}

Itu dia. Bersihkan dan bangun.


Juga berfungsi untuk banyak file aar di 'Native_Ads'. Solusi yang sangat bagus!
Christian Schulzendorff

8

Cara termudah sekarang adalah menambahkannya sebagai modul

masukkan deskripsi gambar di sini

Ini akan membuat modul baru yang berisi file aar, jadi Anda hanya perlu memasukkan modul itu sebagai dependensi setelahnya


Apakah Anda mungkin punya ide mengapa nexttombol saya berwarna abu-abu pada Create New Moduledialog setelah memilih Impor JAR/AAR Package?
Kevin Crain

1
Perhatikan bahwa saya telah memilih file .aar dan memberinya nama
Kevin Crain

Saya menemukan alasannya, IDE sedang memeriksa jalur untuk menentukan apakah .aarfile ada dalam direktori proyek, saya cukup meletakkannya .aardi desktop saya dan mencoba lagi dan berfungsi, terima kasih atas solusi Anda!
Kevin Crain

Mungkin pertanyaan bodoh, tetapi tentang so you just need to include that module as a dependency afterwards- bagaimana Anda melakukannya?
boltup_im_coding

1
@Marian Klühspies yang saya lihat sekarang, saya tidak yakin apakah memiliki includedi settings.gradleseharusnya sudah cukup. Saya membuatnya bekerja. Terima kasih!
boltup_im_coding

7

Ini adalah struktur saya, dan bagaimana saya mengatasi ini:

MyProject / app / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

Di build.gradle

dari Project / app / myModulesFolder / myLibXYZ

Saya telah meletakkan ini:

repositories {
   flatDir {
    dirs 'libs', '../../libs'
  }
}
compile (name: 'mylib-1.0.0', ext: 'aar')

Dilakukan dan berfungsi dengan baik, submodule saya XYZ tergantung pada perpustakaan dari modul utama.


5

Anda bisa melakukannya dengan cara ini. Perlu masuk dalam format pakar:

repositories {
  maven { url uri('folderName')}
}

Dan kemudian AAR Anda harus masuk dalam struktur folder untuk id grup "com.example":

folderName/
  com/
    example/
       verion/
          myaar-version.aar

Kemudian referensi sebagai ketergantungan:

compile 'com.example:myaar:version@aar'

Di mana versionversi file aar Anda (yaitu, 3.0, dll)


3

Bagi siapa saja yang memiliki masalah ini pada Android Studio 1.4, saya membuatnya bekerja dengan membuat modul dalam proyek yang berisi 2 hal.

  1. build.gradle dengan konten berikut:

    configurations.create("default")

    artifacts.add("default", file('facebook-android-sdk-4.7.0.aar'))

  2. file aar (dalam contoh ini 'facebook-android-sdk-4.7.0.aar')

Kemudian sertakan perpustakaan baru sebagai ketergantungan modul. Sekarang Anda dapat menggunakan aar yang dibangun tanpa menyertakan sumber dalam proyek.

Kredit ke Facebook untuk hack ini. Saya menemukan solusinya saat mengintegrasikan Android SDK ke dalam proyek.


Modul apa yang Anda buat? File> Baru> Modul Baru>?
Al Lelopath

Dalam hal ini jenis modul adalah "Perpustakaan Android" jika Anda menggunakan GUI untuk membuat modul. Anda dapat membuat modul yang ada menjadi perpustakaan Android dengan memodifikasi build.gradle modul. ubah apply plugin: 'com.android.application'keapply plugin: 'com.android.library'
Victor Ude

Apakah mungkin menambahkan beberapa aar ke dalam satu modul? Kalau tidak, saya perlu membuat lebih dari 10 modul gradle hanya untuk memasukkan file aar saya
Marian Klühspies

@ MarianKlühspies banyak yang berubah sejak saya awalnya menulis jawaban ini. Saya akan merekomendasikan mencoba dokumentasi resmi untuk memasukkan aar dalam proyek Anda: developer.android.com/studio/projects/…
Victor Ude

3

Dalam kasus saya, tidak ada jawaban di atas yang berfungsi! karena saya punya productFlavors berbeda hanya menambahkanrepositories{ flatDir{ dirs 'libs' } }

tidak bekerja! Saya berakhir dengan menentukan lokasi tepatnya direktori libs :

repositories{
flatDir{
    dirs 'src/main/libs'
}

}

Tebak orang harus memperkenalkan flatDir seperti ini ketika ada productFlavors yang berbeda di build.gradle


2

Dalam kasus saya, saya hanya meletakkan file aar di libs, dan menambahkan

dependencies { ... api fileTree(dir: 'libs', include: ['*.aar']) ... }

di build.gradle dan berfungsi. Saya pikir ini mirip dengan dependensi bawaan yang dihasilkan:

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


"Api fileTree (dir: 'libs', termasuk: ['* .aar])" bekerja dengan baik. Tidak berfungsi jika saya menggunakan "implementasi" alih-alih "api". Saya tidak pernah bisa mendapatkan solusi Victor Ude untuk bekerja dengan multiple aar. Satu wawasan tambahan: jika Anda menggunakan sumber daya (seperti tata letak) pastikan aar yang Anda tautkan tidak berisi sumber daya dengan nama yang sama seperti di apk Anda. Mungkin akan memberi Anda kesalahan karena tidak dapat menemukan salah satu id di tata letak. Masalahnya adalah bahwa ia menggunakan namespace yang salah untuk id dalam tata letak aar.
Tom Rutchik

1

Baris ini mencakup semua aardan jarfile dari libsfolder:

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

0

Tambahkan di bawah ini dalam proyek implementasi file gradle aplikasi (jalur: ': nama proyek')


0

Jika Anda sudah menggunakan Kotlin Gradle DSL, alternatif untuk menggunakannya dengan cara ini:

Inilah struktur proyek saya

|-root
|----- app
|--------- libs // I choose to store the aar here
|-------------- my-libs-01.aar
|-------------- my-libs-02.jar
|--------- build.gradle.kts // app module gradle
|----- common-libs // another aar folder/directory
|----------------- common-libs-01.aar
|----------------- common-libs-02.jar
|----- build.gradle.kts // root gradle

Saya app/build.gradle.kts

  1. Menggunakan pendekatan sederhana dengan fileTree
// android related config above omitted...

dependencies {
    // you can do this to include everything in the both directory
    // Inside ./root/common-libs & ./root/app/libs
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(fileTree(mapOf("dir" to "../common-libs", "include" to listOf("*.jar", "*.aar"))))
}
  1. Menggunakan pendekatan yang sama seperti mengambil dari repositori maven lokal / jauh dengan flatDirs
// android related config above omitted...

repositories {
    flatDir {
        dirs = mutableSetOf(File("libs"), File("../common-libs") 
    }
}

dependencies {
   implementation(group = "", name = "my-libs-01", ext = "aar")
   implementation(group = "", name = "my-libs-02", ext = "jar")

   implementation(group = "", name = "common-libs-01", ext = "aar")
   implementation(group = "", name = "common-libs-02", ext = "jar")
}

Itu groupdiperlukan, karena itu wajib (bukan opsional / memiliki nilai default) di kotlin implementation, lihat di bawah:

// Filename: ReleaseImplementationConfigurationAccessors.kt
package org.gradle.kotlin.dsl

fun DependencyHandler.`releaseImplementation`(
    group: String,
    name: String,
    version: String? = null,
    configuration: String? = null,
    classifier: String? = null,
    ext: String? = null,
    dependencyConfiguration: Action<ExternalModuleDependency>? = null
)

Penafian: Perbedaannya menggunakan flatDirspendekatan no.1 & no.2, saya masih tidak tahu banyak, Anda mungkin ingin mengedit / mengomentari jawaban ini.

Referensi:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/9272
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.