Cara memasukkan paket aar eksternal secara manual menggunakan Gradle Android Build System baru

406

Saya telah bereksperimen dengan sistem build android baru dan saya mengalami masalah kecil. Saya telah menyusun paket aar saya sendiri dari ActionBarSherlock yang saya sebut 'actionbarsherlock.aar'. Apa yang saya coba lakukan sebenarnya menggunakan aar ini untuk membangun APK akhir saya. Jika saya menyertakan seluruh perpustakaan ActionBarSherlock sebagai modul pustaka android ke proyek utama saya menggunakan proyek kompilasi (': actionbarsherlock') saya dapat membangun dengan sukses tanpa masalah.

Tapi masalah saya adalah bahwa saya ingin memberikan dependensi itu sebagai paket file aar MANUAL, jika saya ingin JAR maka saya tidak bisa menemukan cara untuk memasukkannya ke dalam proyek saya. Saya sudah mencoba menggunakan konfigurasi kompilasi tetapi ini sepertinya tidak berhasil. Saya terus mendapatkan tidak dapat menemukan simbol selama kompilasi yang memberitahu saya bahwa class.jar dari paket aar tidak dimasukkan dalam classpath.

Adakah yang tahu tentang sintaks untuk secara manual memasukkan paket aar sebagai 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: Jadi jawabannya adalah saat ini tidak didukung, inilah masalahnya jika Anda ingin melacaknya.

EDIT: Saat ini karena ini masih belum didukung secara langsung, alternatif terbaik tampaknya menjadi solusi yang diusulkan dari @RanWakshlak

EDIT: Juga lebih sederhana dengan menggunakan sintaks yang diusulkan oleh @VipulShah

Miguel Lavigne
sumber
Pertimbangkan tanggapan Vipul Shah: akhirnya bekerja untuk saya, tanpa repositori pakar lokal, pada Android Studio 0.5.8.
shkschneider
Lihatlah pertanyaan saya dan jawab di sini stackoverflow.com/a/31662782/746347
mixel
Jika Anda menggunakan Gradle 3.0.0 atau lebih tinggi, pengaturan Gradle sederhana ini berfungsi untuk saya: stackoverflow.com/questions/29081429/…
user1506104

Jawaban:

670

Ikuti langkah-langkah di bawah ini untuk membuatnya berfungsi (Saya telah mengujinya hingga Android Studio 2.2)

Katakanlah Anda telah menyimpan file aar di folder libs. (anggap nama file adalahcards.aar )

kemudian di aplikasi build.gradletentukan berikut dan klik proyek sinkronisasi dengan file Gradle. Buka build.gradle tingkat Proyek dan tambahkan flatDir{dirs 'libs'}seperti di bawah ini

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

dan sekarang buka file build.grdle tingkat aplikasi dan tambahkan .aarfile

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

Jika semuanya berjalan dengan baik, Anda akan melihat entri perpustakaan dibuat dalam build -> meledak-aar

Perhatikan juga bahwa jika Anda mengimpor file .aar dari proyek lain yang memiliki dependensi, Anda harus menyertakannya dalam build.gradle Anda juga.

Vipul Shah
sumber
5
@ VipulShah di mana direktori libs berada?
StuStirling
2
Mungkin disarankan untuk memasukkan modifikasi dalam modul aplikasi 'build.gradle' dan tidak di folder atas 'build.gradle'.
loloof64
4
menemukan jawaban untuk pertanyaan saya di atas: alih-alih compileketergantungan tambahkan dua dependensi debugCompile(name:'cards-debug', ext:'aar')danreleaseCompile(name:'cards-release', ext:'aar')
Iftah
2
Jangan bingung dengan kode sampel. Blok pertama dengan allprojects {...}pergi ke file tingkat tingkat "proyek", dan bagian kedua dengan dependencies {...}harus pergi ke file tingkat tingkat "aplikasi".
Kirill Karmazin
8
Harap perbarui jawaban Anda: PERINGATAN: Konfigurasi 'kompilasi' sudah usang dan telah diganti dengan 'implementasi' dan 'api'. Itu akan dihapus pada akhir tahun 2018. Untuk informasi lebih lanjut, lihat: d.android.com/r/tools/update-dependency-configurations.html
B-GangsteR
248
  1. Klik kanan pada proyek Anda dan pilih "Buka Pengaturan Modul" .

Buka pengaturan modul

  1. Klik tombol "+" di sudut kiri atas jendela untuk menambahkan modul baru.

Tambahkan modul baru

  1. Pilih "Impor .JAR atau .AAR Paket" dan klik tombol "Next" .

Impor AAR

  1. Temukan file AAR menggunakan tombol ellipsis "..." di sebelah bidang "Nama file".

Temukan file AAR

  1. Tetap pilih modul aplikasi dan klik pada panel Ketergantungan untuk menambahkan modul baru sebagai ketergantungan.

Panel ketergantungan

  1. Gunakan tombol "+" pada layar dependensi dan pilih "Module dependency" .

Tambahkan ketergantungan modul

  1. Pilih modul dan klik "OK" .

Pilih modul

Oliver Kranz
sumber
4
Jawaban terbaik, ingatlah setelah itu buat Alt+Bproyek bersih dan bangun kembali. Android Studio mengapa Anda sakit! Saya ingin memiliki NetBeans IDE sebagai Platform Pengembang Android
java acm
@Luar Anda luar biasa!
ankit purwar
Kamu yang terbaik!
codezombie
2
Ini bukan ide terbaik untuk membuat modul baru setiap kali Anda hanya ingin menambahkan beberapa aarlib ke proyek Anda
Kirill Karmazin
Kamu mengagumkan temanku. !! Ceria untuk ini.
Timothy Macharia
112

Anda dapat mereferensikan file aar dari repositori. Seorang pakar adalah sebuah pilihan, tetapi ada solusi yang lebih sederhana: letakkan file aar di direktori libs Anda dan tambahkan repositori direktori.

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

Kemudian referensi perpustakaan di bagian ketergantungan:

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

Anda dapat memeriksa posting blog Min'an untuk informasi lebih lanjut.

Ran Wakshlak
sumber
1
Ini berfungsi dengan baik, dan lebih baik daripada jawaban yang diterima / dinilai lebih tinggi karena lebih sederhana dan saya dapat memasukkan ini dalam kontrol versi tanpa menambahkan file ke masing-masing repo pakar lokal pengembang (jika saya harus melakukan itu, mengapa menggunakan Gradle di tempat pertama) ?) Terima kasih!
ajpolt
@ajpolt Mungkin disarankan untuk menyiapkan server repo sebagai gantinya (untuk deps berpemilik) sehingga Anda tidak harus meletakkannya di mesin dev atau di folder lib proyek Anda. Jika Anda hanya memiliki satu ketergantungan, buanglah ke repositori kode Google terstruktur (sebagai repo temporer)
Lo-Tan
4
Poin paling penting untuk diperhatikan dalam jawaban ini adalah menyebutkan '@ aar' di akhir ketergantungan.
Atharva
Saya kira ini tidak akan berfungsi lagi dengan plugin gradle terbaru: stackoverflow.com/questions/60878599/…
David
Ini adalah satu-satunya jawaban yang menyertakan bentuk paling sederhana, dengan semua sintaksis modern, termasuk implementationdll. Ini adalah salin-rekatkan solusinya. Banyak upvotes baru masuk karena Android Build Gradle Plugin 4.0.0 sekarang melempar kesalahan alih-alih mengabaikan jalur .aar yang rusak
Patrick
52

Pendekatan di bawah ini berfungsi dengan studio Android terbaru (> v0.8.x):

  • Simpan aarfile di bawah aplikasi modul libsfolder (misalnya: <project>/<app>/libs/myaar.aar)

  • Tambahkan di bawah ini untuk build.gradle folder modul "app" Anda (bukan build.gradle root proyek Anda). Catat nama di baris kompilasi, itu myaar @ aar bukan myaar.aar.

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

asbak
sumber
3
Berfungsi sempurna di AS 1.0
Pablo Johnson
1
Jika seseorang membutuhkannya, jika gradle berfungsi dengan baik tetapi Anda masih tidak dapat melihat kelas, mulai ulang Android Studio ...
htafoya
1
Solusi ini bekerja sangat baik di AS2.2 - gradle sangat pemilih pada sintaksis file AAR.
Jim Andreas
Harap perbarui atau hapus, kompilasi sudah usang dan ada juga masalah ini: stackoverflow.com/questions/60878599/…
David
49

sebelum (default)

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

cukup tambahkan '*.aar'dalam includearray.

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

ini bekerja dengan baik di Android Studio 3.x.

jika Anda ingin mengabaikan beberapa perpustakaan? lakukan seperti ini.

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')
Changhoon
sumber
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Alexander
1
Bekerja dengan baik, ini adalah cara untuk pergi jika perpustakaan itu sederhana. Tetapi mereka adalah masalah di sini: Anda perlu mengimpor semua perpustakaan yang diimpor dalam file aar Anda untuk membuatnya berfungsi. Impor dari file aar tidak diperbanyak menggunakan metode ini.
Tobliug
Atau, lebih sederhana:implementation fileTree(include: ['*.?ar'], dir: 'libs')
friederbluemle
@ Friederbluemle Daripada lebih sederhana saya akan mengatakan lebih pendek, dan pada saat yang sama tidak spesifik, secara teoritis.
David
21

Saya baru saja berhasil!

  1. Salin file mylib-0.1.aar ke folder libs /

  2. Tambahkan baris ini ke bagian bawah build.gradle (harus app, bukan proyek):

    repositories {
       flatDir {
           dirs 'libs'
       }
    }
    dependencies {
        compile 'com.example.lib:mylib:0.1@aar'
    }
  3. Sejauh ini bagus. Inilah poin terpenting:

Gradle perlu mengakses jaringan untuk dependensi kecuali mode offline diaktifkan.

Pastikan Anda telah mengaktifkan pekerjaan Offline melalui kotak centang di Project Structures / Gradle

-- ATAU --

Konfigurasikan pengaturan proxy untuk mengakses jaringan.

Untuk mengkonfigurasi pengaturan proxy Anda harus memodifikasi file properti gradle.prop proyek , mengkonfigurasi http dan https secara terpisah seperti di bawah ini:

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>

Semoga ini berhasil.

Orhun D.
sumber
Harap perbarui atau hapus, kompilasi sudah usang dan ada juga masalah ini: stackoverflow.com/questions/60878599/…
David
20

Saat ini mereferensikan file .aar lokal tidak didukung (seperti dikonfirmasi oleh Xavier Ducrochet)

Yang bisa Anda lakukan adalah mengatur repositori Maven lokal (jauh lebih sederhana daripada kedengarannya) dan merujuk .aar dari sana.

Saya telah menulis posting blog yang merinci cara membuatnya bekerja di sini:

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

Artiom Chilaru
sumber
Saya tidak berhasil membuatnya ketika artefak itu adalah snapshot, tahu mengapa?
tbruyelle
Apakah Anda berhasil menggunakan Eclipse, atau hanya Android studio? Dengan eclipse, "gradle eclipse" menambahkan file aar ke classpath, tetapi eclipse tidak mengenali kelas di dalamnya.
andrej_k
Periksa pertanyaan ini stackoverflow.com/questions/20911665/… jika setelah mengikuti tutorial, file aaar lokal Anda tidak ditemukan (di Gradle 1.9 atau lebih tinggi)
Maragues
Harap perbarui atau hapus, jawaban ini sudah usang.
David
19

Anda dapat menambahkan beberapa aardependensi hanya dengan beberapa baris kode.

Tambahkan flatDirrepositori lokal :

repositories {
    flatDir {
        dirs 'libs'
    }
} 

Menambahkan setiap aardi libsdirektori compilekonfigurasi ketergantungan:

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'])
}
mixel
sumber
Ini berhasil, Tapi bagaimana bisa mengecek, jika ketergantungan sudah ditambahkan sebagai ketergantungan pakar maka saya tidak ingin file aar perlu ditambahkan, PS: Saya menggunakan ini untuk menulis sebuah plugin yang secara otomatis menambahkan aar saya ke proyek android dan menambahkan ketergantungan dalam build.gradle
Adi
@Adi Jika Anda sudah memiliki ketergantungan maven maka jangan menaruh aar yang sesuai ke libsfolder.
mixel
Terima kasih atas tanggapannya, Seperti yang saya sebutkan, menambahkan aar ke libs diotomatisasi oleh plugin Android studio yang sedang dalam pengembangan, Jadi saya ingin tahu apakah ketergantungan yang ditambahkan plugin ke file build.gradle sudah ditambahkan sebelumnya.
Adi
Saya tidak punya jawaban sekarang. Saya pikir lebih baik membuat pertanyaan terpisah.
mixel
15

Sayangnya tidak ada solusi di sini yang bekerja untuk saya (saya mendapatkan dependensi yang belum terselesaikan). Apa yang akhirnya berhasil dan merupakan cara termudah IMHO adalah: Sorot nama proyek dari Android Studio lalu File -> New Module -> Impor JAR atau Paket AAR. Kredit diberikan untuk solusi di pos ini

Nonos
sumber
1
Perlu dicatat bahwa Android Studio sangat tidak jelas dalam panduan impor mereka. Ketika mereka menyatakan "Nama File" di salah satu langkah, yang sebenarnya mereka minta adalah jalur file ... Semoga pesan ini menyelamatkan orang lain dari sakit kepala.
Tukajo
13

Ada 2 cara:

Cara pertama

  1. Buka Android Studio Anda dan navigasikan ke Create New Modulejendela denganFile -> New -> New Module

masukkan deskripsi gambar di sini

  1. Pilih Import .JAR/.AAR Packageitem dan klik Nexttombol

  2. Tambahkan ketergantungan pada build.gradlefile milik appmodul Anda .

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

Itu saja.

Cara kedua

  1. Buat folder di libsdirektori, seperti aars.

  2. Masukkan aar lib Anda ke folder aars.

  3. Tambahkan potongan kode

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

ke dalam build.gradlefile Anda milik modul aplikasi.

  1. Tambahkan ketergantungan pada build.gradlefile milik appmodul Anda .
dependencies {
    ...
    implementation (name:'your aar lib name', ext:'aar')
}

Itu saja.

Jika Anda dapat membaca bahasa Mandarin, Anda dapat memeriksa blog 什么 是 AAR 文件 以及 如何 在 Android 开发 中 使用

shusheng007
sumber
jawaban ini sangat membantu saya
Csabi
Ketika diikuti dengan cara pertama, kelas-kelas di dalam file aar tidak terdeteksi di proyek utama, apakah kita perlu menambahkan konfigurasi tambahan?
Kiran
Harap perbarui atau hapus, terlebih dahulu jawabannya sudah diposkan dan "kompilasi" kedua sudah usang.
David
12

Dengan Android Studio 3.4 dan Gradle 5 Anda cukup melakukannya seperti ini

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}
m0skit0
sumber
1
Ini jawaban terbaik. Ketergantungannya eksplisit dan sangat sederhana.
Nikmoon
1
Menyetujui ini menjadi jawaban terbaik. Secara instan bekerja, sangat cocok untuk menambahkan dependensi aa ke perpustakaan React Native.
Josh Baker
1
Ini menimbulkan kesalahan yang dimulai dengan plugin gradle 4: stackoverflow.com/questions/60878599/…
David
@ David Terima kasih atas laporannya, saya akan mencoba mengujinya segera.
m0skit0
10

MEMPERBARUI ANDROID STUDIO 3.4

  1. Buka File -> Struktur Proyek

masukkan deskripsi gambar di sini

  1. Modul dan klik +

masukkan deskripsi gambar di sini

  1. Pilih Impor .aar Paket

masukkan deskripsi gambar di sini

  1. Temukan rute .aar

masukkan deskripsi gambar di sini

  1. Selesai dan Terapkan , lalu verifikasi apakah paket ditambahkan

masukkan deskripsi gambar di sini

  1. Sekarang di modul aplikasi, klik pada + dan Ketergantungan Modul

masukkan deskripsi gambar di sini

  1. Periksa paket perpustakaan dan Ok

masukkan deskripsi gambar di sini

  1. Verifikasi ketergantungan yang ditambahkan

masukkan deskripsi gambar di sini

  1. Dan struktur proyek seperti ini

masukkan deskripsi gambar di sini

Álvaro Agüero
sumber
1
ini jawaban ke 17 yang saya baca yang akhirnya menambah ketergantungan .. eeh
Taras Matsyk
6

Saya juga punya masalah ini. Laporan masalah ini: https://code.google.com/p/android/issues/detail?id=55863 tampaknya menyarankan bahwa secara langsung merujuk file .AAR tidak didukung.

Mungkin alternatif untuk saat ini adalah mendefinisikan pustaka actionbarsherlock sebagai pustaka Gradle di bawah direktori induk proyek Anda dan referensi yang sesuai.

Sintaksnya didefinisikan di sini http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


sumber
Terima kasih atas referensi untuk masalah ini. Ya, saya sadar bagaimana membuat ini bekerja menggunakan Perpustakaan Android Gradle tetapi opsi ini tidak benar-benar optimal untuk proyek yang saya kerjakan tetapi thx!
Miguel Lavigne
3

Saya menemukan solusi ini di pelacak masalah Android: https://code.google.com/p/android/issues/detail?id=55863#c21

Caranya (bukan perbaikan) adalah dengan mengisolasi file .aar Anda ke dalam suatu sub-proyek dan menambahkan lib Anda sebagai artefak:

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

Info lebih lanjut: Menangani-transitif-dependensi-untuk-artefak lokal-guci-dan-aar

jiparis
sumber
Benar, dan berikut ini contohnya: di github.com/textileio/notes/commit/… , compile project(':mobile')di android / app / build.gradle, configurations.maybeCreate("default")di android / mobile / build.gradle, include ':mobile'di android / settings.gradle
Li Zheng
3

Dalam kasus saya, saya memiliki beberapa depency di perpustakaan saya dan ketika saya membuat aardari itu saya gagal, karena depities terjawab, jadi solusi saya adalah menambahkan semua depencies dari lib saya dengan arrfile.

Jadi level proyek saya build.gradleterlihat sangat:

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) begitu:

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
    ...
}

dan perpustakaan 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
    ...
}
mohax
sumber
3

Saya mencoba semua solusi di sini tetapi tidak ada yang berfungsi, maka saya sadar saya melakukan kesalahan, saya meletakkan .aarfolder yang salah, seperti yang Anda lihat di bawah, saya pikir saya harus meletakkan di folder root, jadi saya membuat libsfolder di sana (1 di gambar) ), tetapi di dalam folder aplikasi, sudah ada libs, Anda harus memasukkan yang kedua libs, semoga ini membantu mereka yang memiliki masalah yang sama dengan saya:

masukkan deskripsi gambar di sini

GMsoF
sumber
2

Sekedar menyederhanakan jawabannya

Jika file .aar hadir secara lokal, maka sertakan
compile project(':project_directory')dalam dependensi build.gradle proyek Anda.

Jika file .aar hadir di remote maka sertakan compile 'com.*********.sdk:project_directory:0.0.1@aar'dalam dependensi build.gradle proyek Anda.

anupam_kamble
sumber
0

Dalam kasus saya hanya berfungsi ketika saya menambahkan "proyek" ke kompilasi:

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


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

Anda dapat melakukan sesuatu seperti ini:

  1. Masukkan perpustakaan lokal Anda (dengan ekstensi: .jar, .aar, ...) ke dalam folder 'libs' (atau yang lain jika Anda mau).

  2. Di build.gradle (tingkat aplikasi), tambahkan baris ini ke dalam dependensi

    implementasi fileTree (termasuk: ['* .jar', '* .aar'], dir: 'libs')

nguyencse
sumber