neraka proguard - tidak dapat menemukan kelas referensi

125

Jadi, saya BERUSAHA untuk merilis beberapa perangkat lunak tetapi Proguard membuat saya sakit kepala.

Ketika saya mencoba untuk mengekspor menggunakan proguard saya mendapat banyak peringatan yaitu "tidak dapat menemukan kelas referensi"

Sebagai contoh:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

Peringatan tampaknya terkait dengan pekerjaan sederhana, jadi dalam file konfigurasi proguard saya, saya telah menambahkan yang berikut:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Di mana pathtoprojecttolibsjalur ke toples yang dirujuk oleh proyek saya.

Ini membuat TIDAK ada perbedaan.

Jika referensi simpleframework javax dapatkah saya katakan proguard untuk mengabaikan ini juga ??

Ada ide?

iasksillyquestions
sumber
1
Apakah Anda menggunakan proguard hanya untuk melakukan treeshaking? Jika demikian, apakah Anda sudah memeriksa ukuran file Anda tanpa menggunakannya? Anda bisa mendapatkan bug superwierd ketika proguard mengeluarkan sesuatu yang diakses menggunakan refleksi misalnya yang Anda tidak akan menemukan sampai rusak runtime jadi benar-benar, sangat yakin Anda membutuhkannya.
alun
Saya benar-benar hanya menggunakannya untuk mencoba melindungi kode dengan mudah? Apakah Anda pikir itu layak?
iasksillyquestions
3
@ListenToRick Proguard baik-baik saja, jika dijalankan dengan konfigurasi yang tepat dan aplikasi yang dihasilkan diuji dengan benar. Saya cukup yakin Google bahkan merekomendasikan penggunaannya. Google menyediakan banyak panduan / contoh untuk menggunakan Proguard dengan aplikasi Android.
CrackerJack9
Proguard adalah alat yang bagus tetapi google merekomendasikannya mungkin paling tidak karena keterbatasan ukuran yang agak aneh dalam format dex seperti yang lainnya. (Lihat code.google.com/p/android/issues/detail?id=7147 )
alun
5
@ alun, bukan itu alasannya. Kita yang tidak ingin aplikasi kita direkayasa balik, atau yang menggunakan lisensi untuk 'mencoba' mencegah pembajakan harus menggunakan alat kebingungan seperti ini untuk membuatnya lebih sulit untuk menjadi peretas. Membuat aplikasi Anda mengambil lebih sedikit ruang juga merupakan manfaat bagi pengguna akhir, dan ada juga optimasi yang dibuat oleh alat-alat ini juga ... manfaat lain.
Christopher Perry

Jawaban:

128

org.simpleframework.xml.stream.StreamReadermengacu pada kode Anda javax.xml.stream.events.XMLEvent. Kelas yang terakhir adalah bagian dari runtime Java ( rt.jar) tetapi bukan bagian dari runtime Android ( android.jar), jadi ProGuard memperingatkan bahwa ada sesuatu yang mungkin rusak. Jika Anda yakin aplikasi Anda berfungsi, Anda dapat menentukan

-dontwarn javax.xml.stream.events.**

Neraka ProGuard?

Eric Lafortune
sumber
15
Itu tidak memperbaikinya untuk saya, namun ini berhasil-dontwarn javax.xml.**
Jeshurun
8
Menambahkan -libraryjars <java.home>/lib/rt.jarmemperbaiki masalah untuk saya.
Gautam
3
Saya mendapat peringatan tambahan tentang misalnya javax.xml.stream.XMLInputFactory, jadi saya menggunakan-dontwarn javax.xml.stream.**
spatialist
1
Bagaimana saya bisa mengatur -dontwarnbernyanyi GUI?
Tomáš Zato - Reinstate Monica
2
Neraka proguard terus berlanjut, hanya menguliti saya dan selesai dengan rasa sakit ini.
Josh
9

Dalam kasus saya, akar masalahnya ada di sini . Peringatan itu bisa Anda lewati dengan:

-dontwarn org.simpleframework.xml.stream.**

The jawaban asli di sini

Yaroslav Havrylovych
sumber
5

Kesalahan ini terjadi karena lib yang Anda gunakan bergantung pada lib lain yang tidak benar-benar digunakan, tetapi Proguard mencari mereka.
Tambahkan baris -dontwarn Anda ke file proguard-rules.pro Anda di proyek Android Anda untuk menonaktifkan peringatan ini.

masukkan deskripsi gambar di sini

Anda dapat menemukan dependensi mana yang perlu Anda tambahkan ke proguard-rules.pro Anda di stacktrace kesalahan Anda.

Yuliia Ashomok
sumber
2

Anda harus memasukkan ini dalam konfigurasi Proguard Anda:

-dontskipnonpubliclibraryclasses
CrackerJack9
sumber
Ya, itu berlaku untuk saya pada saat itu ... ~ 4 tahun yang lalu ... keadaan mungkin telah berubah sejak saat itu :) Sepertinya telah bekerja untuk setidaknya 2 orang lainnya.
CrackerJack9
Proguard-android.txt default sudah memiliki baris ini.
Cristina De Rito
1
@Ultimecia yang melakukan komitmen adalah dari 2013, pos ini dibuat pada 2011
CrackerJack9
2

Kunci Ajaib saya yang memecahkan jam pencarian saya: Tambahkan ini ke progruard-android.txt

-dontskipnonpubliclibraryclassmembers
Ashraf Alshahawy
sumber
0

Hmm. Membaca peringatan itu tampaknya perpustakaan yang Anda coba gunakan memiliki ketergantungan pada javax.xml.stream.events. Saya tidak berpikir bahwa namespace sebenarnya termasuk dalam android sama sekali. (Lihat Indeks Paket ).

Coba gunakan untuk emulator tanpa menggunakan proguard dan lihat apakah itu berfungsi. Dugaan saya akan menjadi tidak jika peringatan itu akurat.

alun
sumber
Hai, jika ini bekerja di emulator tanpa proguard, itu berarti peringatannya tidak akurat? Saya mencoba mencari tahu mengapa saya memiliki peringatan serupa ini. Saya tidak ingin hanya menekan peringatan.
Michelle Shieh
0

Saya pikir ini adalah kasus tepi tetapi dalam kasus saya, saya harus benar-benar menghapus folder build pada proguard Jenkins saya mencoba untuk bekerja dengan kode lama yang tidak ada lagi - kalau-kalau ada yang memiliki masalah yang sama.

luckyhandler
sumber
0

Dalam kasus saya, saya belum mengubah apa pun dan peringatan mulai muncul. Masalahnya adalah dengan cache gradle rusak. Periksa jawaban saya yang lain . Saya berbagi dengan ini karena butuh 2 jam saya untuk menemukan masalah:]

AppiDevo
sumber
0

Tambahkan baris ini ke proguard-rules.profile Anda di direktori skrip gradle:

-dontwarn package.class.name.**

di mana package.class.namenama paket dengan nama kelas dari file jar ditambahkan.

Sebagai contoh:

-dontwarn com.myexternalclass.utils.**
Pedro Marthon
sumber