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.

  • ProGuard: doppelte Definition der Bibliotheksklasse?
  • Proguard Obfuscation Enum Problem
  • Kotlin android proguard error
  • Wenn man sich mit ProGuard verschleiert hat, macht das KeyFile, LineNumberTable die daraus resultierende apk leichter zu reverse engineer?
  • Proguard - AppCompat unterstützt die aktuellen Themenmerkmale nach Proguard / Minify nicht
  • Proguard verursacht einen Absturz in Google Play Services 'ActivityRecognitionResult getMostProbableActivity
  • Konflikt zwischen Android-Datenbindung und Guava verursacht ProGuard-Fehler
  • Android Studio 1.1.0 Einstellung minifyEnabled true verursacht Probleme mit App
  • Wie man den Proguard Mapping Dateinamen in gradle für Android-Projekt zu ändern
  • Android - Proguard doppelte Zip Eintrag Fehler
  • ProGuard in AndroidStudio: Wie bekomme ich verschleierte Bibliotheks-Dateien aus einem Multimodul-Projekt-Release-Build?
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.