Warum Proguard hält Aktivitätsklasse in Android?

Ich habe ProGuard auf meine Android-Anwendung angewendet.

Ich benutze

android-studio/sdk/tools/proguard/proguard-android.txt 

Als Konfigurationsdatei, nichts ändern.

In dieser Datei sehe ich die einzige Aussage über Aktivität :

 We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } 

Daraus folgt, dass die Aktivitäten- Klassennamen von ProGuard verschleiert werden, während einige Methoden erhalten bleiben, wie sie sind. Das ist verständlich.

Doch in meiner Anwendung schaffe ich dann eine Aktivitätsklasse aus einer Zeichenfolge mit

 Class.forName("my.app.MyActivity") 

Dann fange ich diese Aktivität an und es fängt gut an

Aber das bedeutet, dass Aktivitäten-abgeleitete Klassen nicht verschleiert werden? . Es sollte gescheitert sein, weil ProGuard nicht -keep class für Activity , es hat nur -keepclassmembers.

Kann jemand, bitte, erklären, wenn ich mich auf das Verhalten verlassen kann, das ich beobachte? Oder verstehe ich die -keepclassmembers Richtlinie?

2 Solutions collect form web for “Warum Proguard hält Aktivitätsklasse in Android?”

Weil die Aktivitäten im Manifest aufgeführt sind und Klassen, auf die dort verwiesen wird, werden automatisch gepflegt. Dies wird benötigt, da das Android-Framework über die Reflexion auf diese App-Einstiegspunkte zugreift.

Von hier :

Der Build-Prozess führt das Tool aapt, um automatisch die Konfigurationsdatei bin/proguard.txt , basierend auf AndroidManifest.xml und anderen XML-Dateien. Der Build-Prozess übergibt dann die Konfigurationsdatei an ProGuard. Also ProGuard selbst in der Tat nicht betrachten AndroidManifest.xml , aber aapt + ProGuard tun.

Von der ProGuard FAQ :

Ist ProGuard Handle Class.forName Anrufe?

Ja. ProGuard behandelt automatisch Konstrukte wie Class.forName ("SomeClass") und SomeClass.class. Die referenzierten Klassen werden in der schrumpfenden Phase beibehalten, und die String-Argumente werden in der Verschleierungsphase ordnungsgemäß ersetzt. Mit variablen String-Argumenten ist es im Allgemeinen nicht möglich, ihre möglichen Werte zu bestimmen. Sie können zB aus einer Konfigurationsdatei gelesen werden. Allerdings wird ProGuard eine Anzahl von Konstrukten wie "(SomeClass) Class.forName (Variable) .newInstance ()" beachten. Dies könnte ein Hinweis darauf sein, dass die Klasse oder die Schnittstelle SomeClass und / oder deren Implementierungen möglicherweise beibehalten werden müssen. Der Entwickler kann seine Konfiguration entsprechend anpassen.

Also, ProGuard ist cleverer als erwartet: Es wird automatisch erkennen und behandeln einfache Fälle der Verwendung für forName() . Auch wenn die Klasse nicht in der Android-Manifest-Datei referenziert wird, wird ProGuard den Klassennamen sowohl in der Klasse als auch in Ihrem Aufruf auf forName() .

Für Aktivitäten würde es mich nicht überraschen, wenn du doppelt von diesem Verhalten und dem Android-spezifischen Input zu ProGuard, der Teil des Build-Prozesses ist, abgedeckt ist, wie @laalto in seiner Antwort erwähnt.

  • Google Play Services macht gradle, um proguard config zu ignorieren
  • So sichern Sie den Anrufservice in Android
  • Proguard und Android :(
  • Android Code Verschleierung mit ProGuard ... Wie weiß man, dass es verschleiert wurde?
  • Ausnahme beim Dexing von Dateien: Übersetzung wurde unterbrochen
  • Doppelte Zip Entry nach Gradle Plugin v0.13.1
  • FileNotFoundException auf proguard-rules.pro Datei
  • Testing Release und proguarded Version von Android App - NoSuchMethodError
  • Admob-Anzeigen werden nicht mit Pro-Guard angezeigt
  • Android Proguard Optionen - Strenge Regeln & entfernen Log Statements
  • Android ProGuard Fehler mit org.xmlpull.v1.XmlPullParser
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.