Zoeken…


Regels voor enkele van de veelgebruikte bibliotheken

Momenteel bevat het regels voor de volgende bibliotheken: -

  1. Botermes
  2. RxJava
  3. Android-ondersteuningsbibliotheek
  4. Android Design-ondersteuningsbibliotheek
  5. retrofit
  6. Gson en Jackson
  7. Otto
  8. Crashlitycs
  9. Picasso
  10. salvo
  11. OkHttp3
  12. Parcelable
#Butterknife
-keep class butterknife.** { *; }
-keepnames class * { @butterknife.Bind *;}

-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# rxjava
-keep class rx.schedulers.Schedulers {
    public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
    public <methods>;
}
-keep class rx.schedulers.TestScheduler {
    public <methods>;
}
-keep class rx.schedulers.Schedulers {
    public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
    long producerIndex;
    long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    long producerNode;
    long consumerNode;
}

# Support library
-dontwarn android.support.**
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }

# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

# retrofit
-dontwarn okio.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

-dontwarn rx.**
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}

-keep class sun.misc.Unsafe { *; }
#your package path where your gson models are stored
-keep class com.abc.model.** { *; }

# Keep these for GSON and Jackson
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
  
#keep otto
-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

# Crashlitycs 2.+
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keepattributes SourceFile, LineNumberTable, *Annotation*
# If you are using custom exceptions, add this line so that custom exception types are skipped during obfuscation:
-keep public class * extends java.lang.Exception
# For Fabric to properly de-obfuscate your crash reports, you need to remove this line from your ProGuard config:
# -printmapping mapping.txt

# Picasso
-dontwarn com.squareup.okhttp.** 

# Volley
-keep class com.android.volley.toolbox.ImageLoader { *; }

# OkHttp3
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

Schakel ProGuard in voor uw build

Om ProGuard configuraties voor uw toepassing in te schakelen, moet u deze inschakelen in uw gradle-bestand op moduleniveau. u moet de waarde van minifyEnabled true .

U kunt ook shrinkResources true inschakelen shrinkResources true waardoor bronnen worden verwijderd die ProGuard markeert als ongebruikt.

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

De bovenstaande code past uw ProGuard-configuraties in proguard-rules.pro ("proguard-project.txt" in Eclipse) toe op uw vrijgegeven apk.

Om u in staat te stellen later de regel te bepalen waarop een uitzondering in een stacktracering heeft plaatsgevonden, moet "proguard-rules.pro" de volgende regels bevatten:

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

Om Proguard in Eclipse in te schakelen, voegt u proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt aan "project.properties"

Verwijder trace logging (en andere) statements tijdens het bouwen

Als u oproepen voor bepaalde methoden wilt verwijderen, ervan uitgaande dat ze ongeldig terugkeren en geen neveneffecten hebben (zoals in, veranderen ze geen systeemwaarden, referentieargumenten, statica, enz.), Dan kunt u ProGuard ze uit de uitvoer nadat de build is voltooid.

Ik vind dit bijvoorbeeld handig bij het verwijderen van foutopsporings- / uitgebreide logboekinstructies die nuttig zijn bij het opsporen van fouten, maar het genereren van de tekenreeksen daarvoor is niet nodig in de productie.

# Remove the debug and verbose level Logging statements.
# That means the code to generate the arguments to these methods will also not be called.
# ONLY WORKS IF -dontoptimize IS _NOT_ USED in any ProGuard configs
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

Opmerking: als -dontoptimize wordt gebruikt in elke ProGuard-configuratie zodat het geen ongebruikte code verkleint / verwijdert, dan worden de instructies niet verwijderd. (Maar wie wil toch niet de ongebruikte code verwijderen?)

Opmerking 2: deze oproep verwijdert de oproep om te loggen, maar beschermt uw code niet. De tekenreeksen blijven in de gegenereerde apk. Lees meer in dit bericht .

Uw code beschermen tegen hackers

Obfuscation wordt vaak beschouwd als een magische oplossing voor codebescherming, door uw code moeilijker te begrijpen te maken als deze ooit door hackers wordt gecompileerd.

Maar als u denkt dat het verwijderen van Log.x(..) daadwerkelijk de informatie verwijdert die hackers nodig hebben, zult u een nare verrassing hebben.

Al uw logboekoproepen verwijderen met:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    ...etc
}

verwijdert inderdaad de log-aanroep zelf, maar meestal niet de tekenreeksen die u erin plaatst.

Als u bijvoorbeeld in uw logboekoproep een gemeenschappelijk logbericht typt, zoals: Log.d(MyTag,"Score="+score); , converteert de compiler de + naar een 'nieuwe StringBuilder ()' buiten de Log-aanroep. ProGuard verandert dit nieuwe object niet.

Uw-de gecompileerde code zal nog steeds een hangende StringBuilder voor "Score=" , toegevoegd met de versluierde versie voor score variabele (laten we zeggen dat werd omgezet in b ).
Nu weet de hacker wat b is en begrijpt u uw code.

Een goede gewoonte om deze residuen daadwerkelijk uit uw code te verwijderen, is ze niet in de eerste plaats te plaatsen (gebruik in plaats daarvan String-formatter, met proguard-regels om ze te verwijderen), of om uw Log aanroepen te verpakken met:

    if (BuildConfig.DEBUG) {
        Log.d(TAG,".."+var);
    }

Tip:

Test hoe goed je verborgen code beschermd is door deze zelf te decompileren!

  1. dex2jar - converteert de apk naar jar
  2. jd - decompileert de pot en opent deze in een gui-editor

ProGuard inschakelen met een aangepast configuratiebestand voor obfuscation

Met ProGuard kan de ontwikkelaar zijn code verdoezelen, verkleinen en optimaliseren.

# 1 De eerste stap van de procedure is het inschakelen van proguard tijdens het bouwen .

Dit kan worden gedaan door de opdracht 'minifyEnabled' in te stellen op true op de gewenste build

# 2 De tweede stap is om aan te geven welke proguard-bestanden we gebruiken voor de gegeven build

Dit kan door de regel 'proguardFiles' in te stellen met de juiste bestandsnamen

buildTypes {
    debug {
        minifyEnabled false
    }
    testRelease {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro'
    }
    productionRelease {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro', 'proguard-rules-release.pro'
    }
}

# 3 De ontwikkelaar kan vervolgens zijn proguard-bestand bewerken met de regels die hij wenst.

Dat kan door het bestand te bewerken (bijvoorbeeld 'proguard-rules-tests.pro') en de gewenste beperkingen toe te voegen. Het volgende bestand dient als een voorbeeld van een proguard-bestand

// default & basic optimization configurations
-optimizationpasses 5
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*

-verbose

-dump obfuscation/class_files.txt
-printseeds obfuscation/seeds.txt
-printusage obfuscation/unused.txt // unused classes that are stripped out in the process
-printmapping obfuscation/mapping.txt // mapping file that shows the obfuscated names of the classes after proguad is applied

// the developer can specify keywords for the obfuscation (I myself use fruits for obfuscation names once in a while :-) )
-obfuscationdictionary obfuscation/keywords.txt
-classobfuscationdictionary obfuscation/keywords.txt
-packageobfuscationdictionary obfuscation/keywords.txt

Ten slotte, wanneer de ontwikkelaar zijn nieuwe .APK-bestand uitvoert en / of genereert, worden de aangepaste proguard-configuraties toegepast, waardoor aan de vereisten wordt voldaan.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow