ProGuard – Wie man Methoden beibehält und sie gleichzeitig verschleiert?

Ich versuche, meine Android-Anwendung manuell zu verschleiern (ja, ich weiß, es ist ein Schmerz) und dafür muss ich alle Methoden, die ich implementiere, behalten und sie auch mit ProGuard gleichzeitig verschleiern.

Ich habe versucht, die config so zu ändern:

  • Mit android gradle + dagger, um instrumentTests zu führen
  • Android Content Provider oder Datenbank?
  • Legen Sie Vollbild auf onCreate
  • ShouldOverrideUrlLoading in WebView für Android läuft nicht
  • Zeichnen Sie in Canvas mit dem Finger, Android
  • Lesen von whatsapp Nachrichten
  • -keep class com.project.x.* { } 

    Aber es hielt alle Klassennamen und Methodennamen und entfernte noch meinen unbenutzten Code.

    Was kann ich tun, um dieses Problem zu lösen?

    Danke im Voraus!

  • Was ist Ihr Workflow zum Testen von Cloud Code auf Parse?
  • SecurityException mit grantUriPermission beim Freigeben einer Datei mit FileProvider
  • Android - Set TalkBack Zugänglichkeit Fokus auf eine bestimmte Ansicht
  • Hinzufügen von Widgets zu einer Launcher-Seite ohne bindAppWidgetId ()
  • Android Studio Javadoc: Kann kein Symbol finden
  • Zeigen Sie einen Teil der Webseite auf dem Webview android an
  • 3 Solutions collect form web for “ProGuard – Wie man Methoden beibehält und sie gleichzeitig verschleiert?”

    Wie CommonsWare erklärte, scheint es unwahrscheinlich, dass du unbenutzte Methoden behalten willst und doch ihre Namen verschleiert hast, aber ProGuard unterstützt es wie folgt:

     -keepclassmembers,allowobfuscation class com.project.x.** { <methods>; } 

    Dies zwingt gewaltsam alle Methoden (aber nicht alle Klassen) in dem angegebenen Paket (und seinem Unterpaket), aber immer noch erlaubt ihre Namen verschleiert werden.

    Ich meine, ich möchte alle Methoden verschleiert haben, aber ich möchte nicht, dass ProGuard sie entfernt, wenn sie nicht benutzt werden.

    Das macht keinen Sinn.

    ProGuard wird die statische Analyse verwenden, um alle erreichbaren Methoden zu finden. Die einzigen Dinge, die es standardmäßig entfernen wird, sind diejenigen, die es für unerreichbar hält. Diese Methoden konnten ja noch über Reflexion erreicht werden. Allerdings können Sie in diesem Fall die Namen dieser Methoden nicht verschleiern, denn dann wird die Reflexion brechen.

    Zum Beispiel, sagen wir, dass Sie versuchen, Methode foo() auf eine Bar Klasse aufrufen, und Sie nur nennen, dass über Reflexion. Irgendwo, in deinem Quellcode, getMethod() du getMethod() oder etwas mit einem Wert von "foo" , um das Method zu finden. Allerdings, wenn ProGuard foo() verschleiert und benennt es in asd3498pasdke8sd0da() , dann wird Ihr Aufruf zu getMethod() fehlschlagen, weil es keine Methode foo() mehr gibt.

    Verwenden Sie bitte Option Modifikatoren – siehe hier

    Ich denke, du würdest so etwas machen:

     -keep,allowoptimization class com.project.x.* { } 

    Aber um die Dokumentation zu zitieren: "Dieser Modifikator ist nur für die Erfüllung ungewöhnlicher Anforderungen nützlich."

    Hast du versucht, den Motoren umzukehren, um zu sehen, dass das etwas ist, was du tun musst? Mein Eindruck von behalten ist, dass es die Klasse als Einstiegspunkt für die App bewahren wird, aber dass es nicht aufhört, es zu optimieren und die Methoden dieser Klassen intern zu verschleiern.

    Vielleicht ist alles, was du willst, -keepnames sehen, dass Link oben für Details.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.