Android
ProGuard - Обфускация и сокращение вашего кода
Поиск…
Правила для некоторых из широко используемых библиотек
В настоящее время он содержит правила для следующих библиотек: -
- Нож для масла
- RxJava
- Библиотека поддержки Android
- Библиотека поддержки Android Design
- модифицировать
- Гссон и Джексон
- эфирное масло
- Crashlitycs
- Пикассо
- залп
- OkHttp3
- 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;
}
Включите ProGuard для вашей сборки
Для включения конфигураций ProGuard
для вашего приложения вам необходимо включить его в файл уровня градиента уровня модуля. вам нужно установить значение minifyEnabled true
.
Вы также можете включить shrinkResources true
который удалит ресурсы, которые флаг ProGuard
не используется.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Вышеприведенный код применит ваши конфигурации ProGuard, содержащиеся в proguard-rules.pro
(«proguard-project.txt» в Eclipse), к вашему выпущенному apk.
Чтобы позднее определить строку, в которой произошла ошибка в трассировке стека, «proguard-rules.pro» должен содержать следующие строки:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Чтобы включить Proguard в Eclipse, добавьте proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
в "project.properties"
Удаление протоколов трассировки (и других) во время сборки
Если вы хотите удалить вызовы на определенные методы, считая, что они возвращают void и не имеют побочных эффектов (так как в них их не изменяются никакие системные значения, ссылочные аргументы, статика и т. Д.), Тогда вы можете заставить ProGuard удалить их из после завершения сборки.
Например, я нахожу это полезным при удалении отладочных / подробных протоколирующих операторов, полезных при отладке, но генерация строк для них не требуется в производстве.
# 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(...);
}
Примечание. Если -dontoptimize
используется в любой конфигурации ProGuard, чтобы он не уменьшал / удалял неиспользуемый код, тогда это не будет вытеснять утверждения. (Но кто не хочет удалять неиспользуемый код, не так ли?)
Примечание2: этот вызов удалит вызов в журнал, но не защитит ваш код. Строки фактически останутся в сгенерированном apk. Читайте больше в этом сообщении .
Защита вашего кода от хакеров
Обфускация часто рассматривается как волшебное решение для защиты кода, делая ваш код более сложным для понимания, если он когда-либо декомпилируется хакерами.
Но если вы думаете, что удаление Log.x(..)
фактически удаляет информацию, необходимую хакерам, у вас будет неприятный сюрприз.
Удаление всех вызовов журнала с помощью:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
действительно удалит сам вызов журнала, но обычно это не строки, которые вы вставляете в них.
Если, например, внутри вашего Log.d(MyTag,"Score="+score);
вызова вы вводите общее сообщение журнала, например: Log.d(MyTag,"Score="+score);
, компилятор преобразует символ +
в новый StringBuilder () за пределами вызова журнала. ProGuard не изменяет этот новый объект.
У вашего скомпилированного кода по-прежнему будет висячий StringBuilder
для "Score="
, добавленный с запутанной версией для переменной score
(предположим, что она была преобразована в b
).
Теперь хакер знает, что такое b
, и понимает ваш код.
Хорошая практика, чтобы фактически удалить эти остатки из вашего кода, либо не помещает их туда в первую очередь (вместо этого используйте вместо этого форматирование String, с правилами proguard для их удаления) или для переноса ваших вызовов Log
с помощью:
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
Совет:
Проверьте, насколько хорошо защищен ваш запутанный код, де-компилируя его самостоятельно!
Включение ProGuard с помощью настраиваемого файла конфигурации обфускации
ProGuard позволяет разработчику запутывать, сжимать и оптимизировать свой код.
# 1 Первым шагом процедуры является включение proguard в сборку .
Это можно сделать, установив команду «minifyEnabled» в true на нужную сборку
# 2 Второй шаг - указать, какие файлы proguard мы используем для данной сборки
Это можно сделать, установив строку 'proguardFiles' с правильными именами файлов
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 Затем разработчик может редактировать свой файл proguard с правилами, которые он желает.
Это можно сделать, отредактировав файл (например, «proguard-rules-tests.pro») и добавив нужные ограничения. Следующий файл служит примером файла proguard
// 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
Наконец, всякий раз, когда разработчик запускает и / или генерирует свой новый .APK-файл, будут применены настраиваемые конфигурации proguard, выполняя таким образом требования.