Saya ingin membuat Perpustakaan Android dengan file jar dan sumber daya tanpa sumber.

Struktur ketergantungan:

  • Contoh Pustaka Android:
    • tergantung pada dukungan v4, v7 dan beberapa toples disertakan
  • ContohAplikasi
    • bergantung pada Sampel Pustaka Android dan dukungan v4, v7

Saya dapat menghasilkan file jar dengan mengkompilasi Android Sample Library, tetapi ketika saya membuat ruang kerja baru dengan Android Library Sample dengan jar yang dihasilkan, saya mendapatkan kesalahan seperti ini:

Kesalahan: Eksekusi gagal untuk tugas ': sampleAppProject: dexDebug'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Proses 'perintah'/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home/bin/java'' selesai dengan nilai keluar bukan nol 2

Tampaknya disebabkan oleh duplikasi dukungan v4, v7 yang termasuk dalam toples yang saya buat. Ketika saya menghapus dari dependensi gradle yang mendukung perpustakaan v7 dan v4 saya mendapatkan:

Kesalahan:(1) Kesalahan saat mengambil induk untuk item: Tidak ditemukan sumber daya yang cocok dengan nama yang diberikan 'Theme.AppCompat.Light'. Kesalahan:(1) Kesalahan saat mengambil induk untuk item: Tidak ditemukan sumber daya yang cocok dengan nama yang diberikan 'Theme.AppCompat.Light'. Kesalahan:(1) Kesalahan saat mengambil induk untuk item: Tidak ditemukan sumber daya yang cocok dengan nama yang diberikan 'Theme.AppCompat.Light.DarkActionBar'.

Jadi ada sumber daya dukungan yang hilang. Bagaimana saya bisa memecahkan masalah ini?

MEMPERBARUI:

Setelah tips dari @dawidgdanski, saya dapat mengkompilasi proyek saya. Kesalahan saya berubah menjadi selesai dengan nilai keluar bukan nol 1 yang saya pikir disebabkan oleh nama paket yang digandakan. Saya mengubah nama paket dalam manifes, tetapi sekarang saya mendapatkan

Java.lang.ClassNotFoundException: Tidak menemukan kelas "**.android.R$layout" di jalur: DexPathList[[file zip ...

Tampaknya disebabkan oleh saya mengubah paket dalam manifes dan selama kompilasi kelas R tidak konsisten dengan kelas yang disertakan dengan file jar

Dari konsol Gradle :

AGPBI: {"kind":"SIMPLE","text":"java.lang.IllegalArgumentException: sudah ditambahkan: L.../library/android/R$anim;","position":{},"original" :"java.lang.IllegalArgumentException: sudah ditambahkan: L.../library/android/R$anim;"}

3
jacekchronowski 12 Mei 2015, 21:35

1 menjawab

Jawaban Terbaik

Ya, Anda menduplikasi dependensi. Jika Anda menjalankan gradle dependencies di direktori proyek, Anda akan melihat bahwa pustaka dukungan digandakan. Untuk mencegah kejadian seperti itu, Anda perlu memutuskan apakah Anda benar-benar membutuhkan pustaka dukungan di pustaka Android Anda atau tidak. Jika Anda membutuhkannya, Anda harus secara eksplisit memberi tahu pengembang akhir bahwa pustaka dukungan juga harus dikecualikan dari aplikasi mereka.

Mari kita fokus pada cuplikan berikut:

dependencies {
   // App dependencies
   compile 'com.android.support:appcompat-v7:21.0.3'

   //Library dependency
   compile (project(':library')) {
      exclude group: 'com.android.support' module: 'appcompat-v7' 
   }
}

Dengan asumsi bahwa perpustakaan Anda menggunakan perpustakaan kompatibilitas, ini adalah cara Anda mengecualikan ketergantungan 'appcompat-v7' yang tidak perlu.

Di sisi lain, Anda bisa memasukkan ketergantungan perpustakaan Anda dengan mengetahui bahwa itu datang dengan appcompat-v7 dengan versi yang memenuhi permintaan Anda.

Anda dapat melihat contoh proyek yang saya buat beberapa waktu lalu. Ini terdiri dari beberapa modul yang berkolaborasi dengan diri mereka sendiri.

https://github.com/dawidgdanski/BLE-matters

Terkadang Anda menyertakan pustaka yang berisi dependensi yang sudah dikompilasi sebelumnya. Dengan menjalankan gradle dependencies Anda dapat melihatnya dan mengecualikannya juga. Satu-satunya hal yang harus Anda kenali adalah apakah ketergantungan yang akan dikecualikan adalah modul atau pustaka terpisah yang dilampirkan ke pustaka induk yang Anda sertakan.

Pengecualian modul yang telah dikompilasi terlihat seperti berikut:

 compile ('com.google.android.gms:play-services-wearable:6.1.71') {
  exclude module: 'support-v4'
 }

Padahal, untuk mengecualikan ketergantungan yang telah dikompilasi, Anda menentukannya dengan cara ini:

compile (project(':library')) {
  exclude group: 'com.android.support' module: 'appcompat-v7' 
}

Omong-omong. apakah Anda pernah melihat masalah yang serupa dengan masalah Anda?

Java selesai dengan nilai keluar bukan nol 2 - Android Gradle

Aplikasi Anda mungkin telah mencapai ambang batas 65k metode.

Bersulang

3
dawid gdanski 13 Desember 2018, 01:15
Sayangnya saya mendapatkan kesalahan yang sama dengan cuplikan yang Anda posting. Saya kira ada perpustakaan duplikat lainnya. Terima kasih
 – 
jacekchronowski
12 Mei 2015, 22:55
Apakah mungkin untuk mengecualikan beberapa paket dari toples yang dikompilasi?
 – 
jacekchronowski
12 Mei 2015, 23:10
Saya telah memperbarui jawabannya. Jika Anda masih menerima dependensi ganda, validasikan melalui 'dependensi bertahap' dan kecualikan
 – 
dawid gdanski
12 Mei 2015, 23:33
Hai @powder366 bisakah Anda memvalidasi apa yang salah dengan cuplikan?
 – 
dawid gdanski
7 Oktober 2015, 20:44
Saya tidak yakin apa masalahnya, sesuatu dengan "modul:"
 – 
powder366
7 Oktober 2015, 20:57