2016-08-05 30 views
5

Wie ich weiß, gibt es einige Klassen, die nicht verschleiert werden sollten und deren Namen wie "Aktivitäten" beibehalten werden müssen. Ich möchte jedoch, dass andere Klassen und Pakete in meinem Code umbenannt werden. hier ist build.gradle innerhalb app Ordner: Plugin anwenden: 'com.android.application'Android: Proguard-Konfiguration zum Verschleiern von Klassennamen und -methoden

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "apt.eve.good.morning" 
     minSdkVersion 14 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 


} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:support-v4:23.4.0' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

Ich benutze diese proguard Konfiguration für meine Anwendung (app\proguard-rules.pro):

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-useuniqueclassmembernames 
-verbose 

-keepattributes *Annotation* 
-keep public class com.google.vending.licensing.ILicensingService 
-keep public class com.android.vending.licensing.ILicensingService 

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 

# 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*(); 
} 
-allowobfuscations class * 
# 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); 
} 

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

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

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

# The support library contains references to newer platform versions. 
# Don't warn about those in case this app is linking against an older 
# platform version. We know about them, and they are safe. 
-dontwarn android.support.** 

# Understand the @Keep support annotation. 
-keep class android.support.annotation.Keep 

-keep @android.support.annotation.Keep class * {*;} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <methods>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <fields>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <init>(...); 
} 

Es Optimierung tun, sondern als Ich habe innerhalb meines classes.dex nachgesehen, alle Klassennamen sind unverändert geblieben. Also ich möchte wissen, was ich in meiner Konfigurationsdatei verpasst habe, die Klassen-/Methoden-Namen nicht verschleiert?

P.S.1 Ich habe mehrere Fragen gesucht, aber ich kann mir nicht vorstellen, was hier falsch ist.

P.S.2 Ich habe mein Android-Studio richtig konfiguriert und Änderungen auf Proguard-Konfiguration gilt ohne kein Problem auf meiner freigegebenen .apk-Datei.

+0

posten Sie Ihre gradle Build-Datei – petey

+0

Wo sehen Sie Ergebnis der Verschleierung überprüfen:

net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a: java.util.Queue queue -> a boolean downloadRunning -> b 67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a 

Viele weitere Informationen finden Sie im „Shrink Ihren Code und Ressourcen“ Artikel finden Sie hier? Ich bin mir nicht 100% ig sicher, aber ich denke, in meinem Projekt sind die verschleierten '.dex'-Dateien in' build/intermediates/transforms/dex/** ', jede andere Klasse/dex in' build/** 'sieht so aus Ausgabe des Build-Schritts vor der Verschleierung. Letztendlich sollte das resultierende '.apk' /' .aar 'verschleiert werden. Wenn Sie also dieses entpacken und die Klassen nicht verschleiert sind, dann funktioniert etwas nicht wie erwartet. – Ped7g

+0

@ Ped7g Ich benutze Dex2jar, um Dex in meiner apk in JAR-Datei zu konvertieren. Dann benutze ich [jd-gui] (http://jd.benow.ca/#jd-gui-overview), um JAR-Datei zu dekompilieren, und wenn ich nachschaue, gibt es keine Namensverschleierung in meinem Code. Alle Klassen und Pakete blieben mit demselben Namen. – VSB

Antwort

6

Stellen Sie sicher, dass Sie die verschleierten .dex-Dateien überprüfen.

Mit gemeinsamen Graple Build-Skript können die build/** Ordner mehrere unverschleierte Versionen von .dex/.class-Dateien enthalten.

Letztendlich sollte die resultierende .apk/.aar verschleiert werden. Wenn Sie also diesen entpacken und die Klassen nicht verschleiert sind, funktioniert etwas nicht wie erwartet.

Wie bereits erwähnt, ist es auch wichtig zu überprüfen, ob Ihre [Disassembly] Tools korrekt funktionieren.

Das Anzeigen der binären Form von .dex aus .apk reicht normalerweise aus, um [un] verschleierte Symbole zu erkennen (versuchen Sie mit der unauffälligen .class, die Symbole sind auch im Texteditor leicht lesbar, in verschleierter .dex die Symbolkette wie " aa "," ab ", ... ist oft auch gut sichtbar).

Auch die Ausführung von gropler proguard Task mit ausführlicher Option kann helfen zu erkennen, ob der Proguard ausgeführt wurde und auf welche Dateien.

+0

Der Vorschlag von Petey, die Karte zu überprüfen Datei ist viel besser, stellen Sie einfach sicher, dass es frisch ist (modifizieren Sie datetime == cca. build), und Sie können leicht alle verschleierten Symbole überprüfen (und nach "sensitiven" Symbolen suchen, um zu verifizieren, dass sie wie erwartet verschleiert wurden). Es ist kein zusätzliches Werkzeug erforderlich, um einen detaillierten Überblick über den Erfolg der Verschleierung zu erhalten. (und meine binäre Methode kann nur verwendet werden, um zu überprüfen, ob .apk wirklich das erwartete Ergebnis enthält, wie die Map-Datei suggeriert ... wenn Sie wirklich paranoid sind). – Ped7g

1

Haben Sie bereits

geändert
minifyEnabled=true 

Innen App -> build.gradle?

buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
3

Basierend auf Ihrer Gradle-Datei (minifyEnabled=true) und proguard config. Du scheinst schon gut in Form zu sein.

Um schnell zu bestätigen, dass Ihre App Ihre Klassen verschleiert, überprüfen Sie die resultierende Datei mapping.txt, wenn Sie Release-Builds erstellen. Diese Datei "bietet eine Übersetzung zwischen den ursprünglichen und verschleierten Klassen-, Methoden- und Feldnamen."

Hier ist ein Beispiel für ein Mapping.txt, die eine hockeyapp Bibliothek obsfucates: https://developer.android.com/studio/build/shrink-code.html