Mengaktifkan ProGuard di Eclipse untuk Android

112

Dokumentasi baru di ProGuard untuk Android mengatakan untuk menambahkan baris ke file default.properties di direktori utama proyek. Namun, saat membuka file ini, saya membaca di bagian atas:

# This file is automatically generated by Android Tools. 
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! 

Apakah saya melewatkan sesuatu?

Selain itu, apakah ada cara untuk mengaktifkan ProGuard hanya untuk build produksi dari Eclipse (yaitu, saat mengekspor produk jadi)?

Ted Hopp
sumber
Saya setuju dengan poin Anda bahwa properti default.properti akan dibuat ulang setiap saat. Jadi, ini pertanyaan yang menarik
Aman Alam
Anda harus menerima jawaban ligi, NeTeInStEiN tidak berlaku lagi dan membingungkan pengguna baru.
Gaurav Agarwal
2
Saya telah mengubah jawaban menjadi yang terbaru.
neteinstein
Jawaban ligi masih lebih jelas daripada neteinstein, untuk instalasi yang lebih baru. Yang terpenting, ini menunjukkan proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt , jika Anda memerlukan pengaturan khusus untuk proyek tertentu.
ToolmakerSteve

Jawaban:

76

hanya tindak lanjut karena saya mencari hal yang sama - dan jawabannya di sini sudah usang - akhir-akhir ini konfigurasi dasar proguard ada di sini di dir sdk - jadi Anda hanya perlu memasukkan ini ke dalam properti proyek Anda:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

jika Anda ingin membuat modifikasi khusus proyek, buat proguard-project.txt dan ubah baris menjadi:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
ligi
sumber
Melihat proyek saya (di r20, tetapi dihasilkan dalam rilis sebelumnya) tampaknya menggunakan campuran metode di atas:
Tom
26
Masih cukup membingungkan karena project.properties juga mengatakan # File ini otomatis dibuat oleh Alat Android. # Jangan memodifikasi file ini - PERUBAHAN ANDA AKAN DIHAPUS!
Todd Painton
12
"Anda hanya perlu memasukkan ini ke dalam project.properties Anda". Baris ini akan ada di project.properties tetapi dikomentari secara default. Hapus saja komentarnya.
Braj
113

Android SDK (r20 atau lebih tinggi)

Harap periksa proguard.config standar yang dirujuk di project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

Info selengkapnya: http://proguard.sourceforge.net/manual/examples.html#androidapplication

Di Gradle:

buildTypes {
 release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ...
  }
 }

Di sini Anda dapat memeriksa file "default" proguard yang terus saya perbarui: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK (r19 atau lebih rendah)

Anda dapat menambahkannya ke default.properties. Saya telah menambahkan secara manual tanpa masalah sejauh ini.

Jika Anda menambahkan baris:

proguard.config=proguard.cfg

Seperti yang dikatakan itu hanya akan menggunakan ProGuard saat mengekspor aplikasi yang ditandatangani (Alat Android => Ekspor Aplikasi yang Ditandatangani)

Jika Anda memulai proyek dengan SDK sebelum Android 2.3, proguard.cfgfile tidak akan dibuat (di samping default.propertiesseperti di 2.3>).

Untuk mengaktifkan pembuatannya secara otomatis, cukup perbarui ke SDK Android 2.3 dan buat proyek baru dengan sumber yang ada (yang merupakan sumber proyek yang Anda miliki saat ini).

Secara otomatis proguard.cfgpengisian akan dibuat.

Jika masih, Anda ingin membuatnya secara manual, inilah yang seharusnya berisi:

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn android.support.**
-verbose

-dontoptimize
-dontpreverify


-keepattributes *Annotation* 
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
 }

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

Saya rasa saya sudah menjawab semua pertanyaan di atas.

PERBARUI :

Penjelasan baris demi baris:

#Use 5 step of optimization 
#-optimizationpasses 5

#When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use):
-dontusemixedcaseclassnames

#Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting
-dontskipnonpubliclibraryclasses

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).    
-dontoptimize
-dontpreverify

-dontwarn android.support.**

#Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message.
-verbose

#The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields).
#To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

#To repackage classes on a single package
#-repackageclasses ''

#Uncomment if using annotations to keep them.
#-keepattributes *Annotation*

#Keep classes that are referenced on the AndroidManifest
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#Compatibility library 
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
}

#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
}

#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}

#Maintain java native methods 
-keepclasseswithmembernames class * {
    native <methods>;
}


#To maintain custom components names that are used on layouts XML:
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

#Maintain enums
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#Keep the R
-keepclassmembers class **.R$* {
    public static <fields>;
}

###### ADDITIONAL OPTIONS NOT USED NORMALLY

#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
#   void myCallbackMethod(java.lang.String);
#}

#Uncomment if using Serializable 
#-keepclassmembers class * implements java.io.Serializable {
#    private static final java.io.ObjectStreamField[] serialPersistentFields;
#    private void writeObject(java.io.ObjectOutputStream);
#    private void readObject(java.io.ObjectInputStream);
#    java.lang.Object writeReplace();
#    java.lang.Object readResolve();
#}

UPDATE 2:

Dalam penggunaan ADT / Proguard terbaru, -keepclasseswithmembersbukan-keepclasseswithmembernames

neteinstein.dll
sumber
1
@NeTeInStEiN Saya memperbarui ke SDK 16 (Android 4.x), menambahkan baris proguard.config=proguard.cfgtetapi file proguard.cfg tidak terlihat ... Meskipun melakukan ekspor beberapa kali, memulai ulang Eclipse, dll. Ada tahu mengapa? dan bagaimana cara memperbaikinya? Terima kasih.
Bill The Ape
1
@NeTeInInn. Sudahlah. Ternyata saya harus membuatnya sendiri.
Bill The Ape
@NeTeInStEiN Ketika saya membuat proyek, meskipun target buildnya adalah Android1.1, saya menemukan file proguard.cfg yang dibuat secara otomatis.
hasanghaforian
1
@NeTeInStEiN Pria yang luar biasa ... Sangat menghargai waktu dan usaha Anda, Cheers !!
swiftBoy
1
@ user31231234124 Menambahkan info yang Anda minta.
neteinstein
10

Setidaknya pada ADT 16, Anda memang dapat menambahkan baris tersebut project.properties, dan itu akan dipertahankan. Anda dapat mencoba mengubah versi SDK target, dan melihat bahwa project.propertiesdiperbarui sesuai tetapi baris yang ditambahkan masih ada. Jadi, saya pikir peringatan itu tidak tepat; itu berarti mengatakan bahwa pengaturan di file seperti targetakan ditimpa dengan pengaturan proyek, bukan sebaliknya.

usethe4ce
sumber
4

Perubahan pada konfigurasi ProGuard muncul dengan ADT versi 17. ProGuard diperbarui dari 4.4 menjadi 4.7 dan perbedaan dalam referensi file konfigurasi yang sudah dicatat diperkenalkan. Perhatikan bahwa proyek yang ada akan tetap tidak berubah, membiarkannya tanpa kumpulan aturan yang lebih baru yang disertakan dalam versi ADT ini dan yang lebih baru. Dokumen yang relevan untuk pengaturan konfigurasi yang lebih baru, telah dicatat oleh ligi di atas, tersedia di: -

http://tools.android.com/recent/proguardimprovements "Kedua, kami telah mengubah cara file konfigurasi ditangani."

phillxnet
sumber
3

Anda dapat menambahkan baris ke build.properties, seperti yang disebutkan dalam default.properties.

Eric Lafortune
sumber
Di mana build.properties? Atau apakah saya perlu membuatnya?
Ted Hopp
Ini ada di direktori proyek, di samping default.properties (setidaknya dengan Android SDK r8).
Eric Lafortune
Di situlah saya mencarinya, tetapi tidak ada file seperti itu di proyek saya mana pun. Saya menggunakan plugin terbaru dan baru saja membuat proyek level 8 untuk memeriksanya.
Ted Hopp
4
Ternyata penggunaan build.properties hanya berfungsi untuk build Ant, bukan untuk build Eclipse.
Ted Hopp
di mana build.properties pada tahun 2016 android studio buld?