Aktivieren von ProGuard in Eclipse für Android

112

In der neuen Dokumentation zu ProGuard für Android heißt es, dass der Datei default.properties im Home-Verzeichnis des Projekts eine Zeile hinzugefügt werden soll. Beim Öffnen dieser Datei habe ich jedoch oben gelesen:

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

Vermisse ich etwas

Gibt es auch eine Möglichkeit, ProGuard nur für einen Produktions-Build aus Eclipse zu aktivieren (dh beim Exportieren des fertigen Produkts)?

Ted Hopp
quelle
Ich stimme Ihrem Standpunkt zu, dass default.properties jedes Mal neu generiert werden. Daher ist es eine interessante Frage
Aman Alam
Sie sollten die Antwort von ligi akzeptieren, NeTeInStEiN hält nicht mehr und verwirrt neue Benutzer.
Gaurav Agarwal
2
Ich habe die Antwort geändert, um auf dem neuesten Stand zu sein.
Neteinstein
Die Antwort von ligi ist für neuere Installationen immer noch klarer als die von neteinstein. Am wichtigsten ist, dass angezeigt wird proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt , ob Sie benutzerdefinierte Einstellungen für ein bestimmtes Projekt benötigen.
ToolmakerSteve

Antworten:

76

Nur ein Follow-up, weil ich nach der gleichen Sache gesucht habe - und die Antworten hier sind veraltet - in letzter Zeit befindet sich die Base Proguard-Konfiguration hier im SDK-Verzeichnis - Sie müssen dies also nur in Ihre project.properties einfügen:

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

Wenn Sie projektspezifische Änderungen vornehmen möchten, erstellen Sie eine proguard-project.txt und ändern Sie die Zeile in:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
ligi
quelle
Betrachtet man mein Projekt (in r20, aber in einer früheren Version generiert), scheint es eine Mischung der oben genannten Methoden zu verwenden:
Tom
26
Immer noch ziemlich verwirrend, da in project.properties auch # steht. Diese Datei wird automatisch von Android Tools generiert. # Ändern Sie diese Datei nicht - IHRE ÄNDERUNGEN WERDEN GELÖSCHT!
Todd Painton
12
"Sie müssen dies nur in Ihre project.properties einfügen". Diese Zeile befindet sich in project.properties, ist jedoch standardmäßig kommentiert. Kommentiere es einfach aus.
Braj
113

Android SDK (r20 oder höher)

Bitte überprüfen Sie die vordefinierte proguard.config, auf die in project.properties verwiesen wird

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

Weitere Informationen: http://proguard.sourceforge.net/manual/examples.html#androidapplication

Auf Gradle:

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

            ...
  }
 }

Hier können Sie eine Proguard- "Standard" -Datei überprüfen, die ich ständig aktualisiere: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK (r19 oder niedriger)

Sie können es zu den default.properties hinzufügen. Ich habe manuell hinzugefügt, ohne bisher ein Problem zu haben.

Wenn Sie die Zeile hinzufügen:

proguard.config=proguard.cfg

Wie gesagt, ProGuard wird nur beim Exportieren signierter Anwendungen verwendet (Android Tools => Signierte Anwendungen exportieren)

Wenn Sie das Projekt mit dem SDK vor Android 2.3 starten, wird die proguard.cfgDatei nicht erstellt (neben default.propertieswie in 2.3>).

Um die automatische Erstellung zu aktivieren, aktualisieren Sie einfach auf das SDK von Android 2.3 und erstellen Sie ein neues Projekt mit vorhandenen Quellen (die die Quellen des Projekts sind, über das Sie derzeit verfügen).

Automatisch wird die proguard.cfgFüllung erstellt.

Wenn Sie es dennoch manuell erstellen möchten, sollte es Folgendes enthalten:

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

Ich glaube, ich habe alle oben genannten Fragen beantwortet.

UPDATE :

Eine zeilenweise Erklärung:

#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:

In der letzten ADT / Proguard-Verwendung -keepclasseswithmembersanstelle von-keepclasseswithmembernames

neteinstein
quelle
1
@NeTeInStEiN Ich habe auf SDK 16 (Android 4.x) aktualisiert, die Zeile hinzugefügt, proguard.config=proguard.cfgaber die Datei proguard.cfg ist nirgends zu sehen ... Trotz mehrmaligem Export, Neustart von Eclipse usw. Irgendeine Idee warum? und wie kann man das beheben? Vielen Dank.
Bill The Ape
1
@NeTeInStEiN Macht nichts. Es stellt sich heraus, dass ich selbst einen hätte erstellen sollen.
Bill The Ape
@NeTeInStEiN Wenn ich erstellen Sie ein Projekt, obwohl es Build - Ziel Android1.1 ist, fand ich proguard.cfg Datei , die automatisch erstellt wird.
Hasanghaforian
1
@NeTeInStEiN Erstaunlicher Mann ... Schätzen Sie wirklich Ihre Zeit und Ihre Bemühungen, Prost !!
SwiftBoy
1
@ user31231234124 Die angeforderten Informationen wurden hinzugefügt.
Neteinstein
10

Zumindest ab ADT 16 können Sie die Zeile tatsächlich hinzufügen project.properties, und sie bleibt erhalten. Sie können versuchen, die Ziel-SDK-Version zu ändern, und sehen, dass diese project.propertiesentsprechend aktualisiert wird, die hinzugefügte Zeile jedoch noch vorhanden ist. Ich denke, die Warnung ist nur schlecht formuliert. es bedeutet zu sagen, dass Einstellungen in der Datei, wie targetsie mit Projekteinstellungen überschrieben werden, und nicht umgekehrt.

usethe4ce
quelle
4

Änderungen an der ProGuard-Konfiguration wurden mit ADT Version 17 vorgenommen. ProGuard wurde von 4.4 auf 4.7 aktualisiert und der Unterschied in der bereits erwähnten Referenz der Konfigurationsdatei wurde eingeführt. Beachten Sie, dass vorhandene Projekte unverändert bleiben und ohne den neueren Regelsatz in dieser und neueren ADT-Versionen verbleiben. Relevante Dokumente für neuere Konfigurationsanordnungen, die bereits von ligi oben erwähnt wurden, sind verfügbar unter: -

http://tools.android.com/recent/proguardimprovements "Zweitens haben wir die Art und Weise geändert, wie Konfigurationsdateien behandelt werden."

phillxnet
quelle
3

Sie können die Zeile hinzufügen build.properties, wie in erwähnt default.properties.

Eric Lafortune
quelle
Wo ist build.properties? Oder muss ich es erstellen?
Ted Hopp
Es befindet sich im Projektverzeichnis neben default.properties (zumindest mit Android SDK r8).
Eric Lafortune
Dort habe ich danach gesucht, aber in keinem meiner Projekte gibt es eine solche Datei. Ich verwende das neueste Plugin und habe gerade ein Level 8-Projekt erstellt, um dies zu überprüfen.
Ted Hopp
4
Es stellt sich heraus, dass die Verwendung von build.properties nur für Ant-Builds funktioniert, nicht für Eclipse-Builds.
Ted Hopp
Wo ist build.properties im Jahr 2016 Android Studio Buld?