Pertanyaan hapus kelas yang tidak digunakan dengan proguard untuk Android


Sejarah / Konteks Saya punya proyek [1] di mana ukuran benar-benar penting - baru-baru ini saya memindahkan barang ke lib yang dibagikan [2] dan proguard berpikir akan berhati-hati dan menghapus kelas yang tidak terpakai karena saya memiliki konfigurasi yang secara drastis mengurangi ukuran tetapi dengan menggunakan lib saya datang ke tanda ajaib 100kb jadi saya menyelidiki: kelas yang tidak saya gunakan pasti berada dalam file dex yang dihasilkan - dan bahkan dengan nama lengkap (tidak disingkat menjadi single-char) - misalnya Saya melihat SquareView di dek yang tidak pernah saya gunakan di App.

Pertanyaan Anehnya saya temukan dalam dokumentasi proguard berikut ini:

The library jars themselves always remain unchanged. 

Bisakah saya memberi tahu / menipu proguard (dalam) untuk memprosesnya? Saya menemukan ini benar-benar aneh terutama karena saya mengharapkan lebih banyak barang yang dapat dihapus di lib daripada di App itu sendiri ..

[1] https://github.com/ligi/FAST [2] https://github.com/ligi/AndroidHelper


5
2017-08-26 21:00


asal


Jawaban:


Proses pembuatan Eclipse / Ant / Gradle di Android SDK secara otomatis menentukan kode Anda (dari bin/classes) dan perpustakaannya (dari libs) dengan opsi -injars. Ini berarti bahwa aplikasi lengkap dipadatkan, dioptimalkan, dan dikaburkan (dalam rilis rilis, dengan asumsi ProGuard diaktifkan).

Proses pembuatan hanya menentukan runtime Android android.jar dengan opsi -libraryjars. Anda perlu memproses kode, tetapi tidak akan berakhir di apk yang diproses, karena sudah ada di perangkat.

Jadi semuanya harus bekerja secara otomatis. Anda mungkin masih melihat seluruh pustaka dengan nama asli mereka dalam apks diproses, jika konfigurasi Anda proguard-project.txt mengandung garis seperti -keep class org.mylibrary.** { *; }. Konfigurasi semacam itu biasanya merupakan solusi konservatif untuk memperhitungkan refleksi. Dengan beberapa riset dan eksperimen, Anda sering dapat memperbaiki konfigurasi dan mendapatkan hasil yang lebih baik. Anda dapat mencari tahu mengapa kelas-kelas tersebut disimpan dengan opsi -whyareyoukeeping.


8
2017-08-27 15:19



Saya percaya Anda harus menggunakannya -injars:

-kelas class_path       Menentukan guci input (atau perang, telinga, ritsleting, atau direktori) dari aplikasi yang akan diproses. File kelas dalam toples ini akan menjadi   diproses dan ditulis ke stoples output. Secara default, semua non-kelas   file akan disalin tanpa perubahan. Harap berhati-hati untuk sementara   file (misalnya dibuat oleh IDE), terutama jika Anda membaca masukan Anda   file langsung dari direktori. Entri di jalur kelas bisa   difilter, seperti yang dijelaskan di bagian filter. Untuk keterbacaan yang lebih baik,   entri jalur kelas dapat ditentukan menggunakan beberapa opsi-gandar.

Sumber:  http://proguard.sourceforge.net/index.html#manual/usage.html


3
2017-08-27 01:54