blob: 764157a669b546802971ae886c8cab59c32e0c32 [file] [log] [blame]
//
// This Gradle build file illustrates how to process Android
// applications.
//
// If you're using the Android SDK, the provided build systems with Gradle,
// Android Studio, Eclipse, and Ant already take care of the proper settings.
// You only need to enable ProGuard as explained in the Android documentation.
// You can still add project-specific configuration in proguard-project.txt.
//
// This configuration file is for custom, stand-alone builds.
// Usage:
// gradle -b android.gradle proguard
// Tell Gradle where to find the ProGuard task.
buildscript {
repositories {
flatDir dirs: '../../lib'
}
dependencies {
classpath ':proguard'
}
}
// Define a ProGuard task.
task ('proguard', type: proguard.gradle.ProGuardTask) {
// You should probably import a more compact ProGuard-style configuration
// file for all static settings, but we're specifying them all here, for
// the sake of the example.
//configuration 'configuration.pro'
//##############################################################################
// Input and output.
//##############################################################################
// Specify the input jars, output jars, and library jars.
// Note that ProGuard works with Java bytecode (.class),
// before the dex compiler converts it into Dalvik code (.dex).
injars 'classes'
injars 'libs'
outjars 'classes-processed.jar'
libraryjars '/usr/local/android-sdk/platforms/android-27/android.jar'
//libraryjars '/usr/local/java/android-sdk/extras/android/support/v4/android-support-v4.jar'
//libraryjars '/usr/local/java/android-sdk/add-ons/addon-google_apis-google-21/libs/maps.jar'
// ...
// Save the obfuscation mapping to a file, so you can de-obfuscate any stack
// traces later on.
printmapping 'bin/classes-processed.map'
// You can print out the seeds that are matching the keep options below.
//printseeds 'bin/classes-processed.seeds'
//##############################################################################
// General settings.
//##############################################################################
verbose
// We can debug the ProGuard configuration by instrumenting the code and
// checking the log for feedback. Disable the option again for actual releases!
//addconfigurationdebugging
// We can also disable the individual processing steps.
//dontshrink
//dontoptimize
//dontobfuscate
// Specifically target Android.
android
// The dex compiler ignores preverification information.
dontpreverify
// Reduce the size of the output some more.
repackageclasses ''
allowaccessmodification
// Switch off some optimizations that trip older versions of the Dalvik VM.
optimizations '!code/simplification/arithmetic'
// Keep a fixed source file attribute and all line number tables to get line
// numbers in the stack traces.
renamesourcefileattribute 'SourceFile'
keepattributes 'SourceFile,LineNumberTable'
//##############################################################################
// Settings to handle reflection in the code.
//##############################################################################
// RemoteViews might need annotations.
keepattributes '*Annotation*'
// Preserve all fundamental application classes.
keep 'public class * extends android.app.Activity'
keep 'public class * extends android.app.Application'
keep 'public class * extends android.app.Service'
keep 'public class * extends android.content.BroadcastReceiver'
keep 'public class * extends android.content.ContentProvider'
// Preserve all View implementations, their special context constructors, and
// their setters.
keep 'public class * extends android.view.View { \
public <init>(android.content.Context); \
public <init>(android.content.Context, android.util.AttributeSet); \
public <init>(android.content.Context, android.util.AttributeSet, int); \
public void set*(...); \
}'
// Preserve all classes that have special context constructors, and the
// constructors themselves.
keepclasseswithmembers 'class * { \
public <init>(android.content.Context, android.util.AttributeSet); \
}'
// Preserve all classes that have special context constructors, and the
// constructors themselves.
keepclasseswithmembers 'class * { \
public <init>(android.content.Context, android.util.AttributeSet, int); \
}'
// Preserve all possible onClick handlers.
keepclassmembers 'class * extends android.content.Context { \
public void *(android.view.View); \
public void *(android.view.MenuItem); \
}'
// Preserve the special fields of all Parcelable implementations.
keepclassmembers 'class * implements android.os.Parcelable { \
static android.os.Parcelable$Creator CREATOR; \
}'
// Preserve static fields of inner classes of R classes that might be accessed
// through introspection.
keepclassmembers 'class **.R$* { \
public static <fields>; \
}'
// Preserve annotated Javascript interface methods.
keepclassmembers 'class * { \
@android.webkit.JavascriptInterface <methods>; \
}'
// Preserve annotated and generated classes for Dagger.
keepclassmembers allowobfuscation: true, 'class * { \
@dagger.** *; \
}'
keep 'class **$$ModuleAdapter'
keep 'class **$$InjectAdapter'
keep 'class **$$StaticInjection'
keep if: 'class **$$ModuleAdapter', 'class <1>'
keep if: 'class **$$InjectAdapter', 'class <1>'
keep if: 'class **$$StaticInjection', 'class <1>'
keepnames 'class dagger.Lazy'
// Preserve annotated and generated classes for Butterknife.
keep 'class **$$ViewBinder { \
public static void bind(...); \
public static void unbind(...); \
}'
keep if: 'class **$$ViewBinder', 'class <1>'
keep 'class **_ViewBinding { \
<init>(<1>, android.view.View); \
}'
keep if: 'class **_ViewBinding', 'class <1>'
// Preserve fields that are serialized with GSON.
//keepclassmembers 'class com.example.SerializedClass1,'
// com.example.SerializedClass2 {
// <fields>;
//}'
keepclassmembers allowobfuscation: true, 'class * { \
@com.google.gson.annotations.SerializedName <fields>; \
}'
keep allowobfuscation: true, '@interface com.google.gson.annotations.**'
// Preserve the required interface from the License Verification Library
// (but don't nag the developer if the library is not used at all).
keep 'public interface com.android.vending.licensing.ILicensingService'
dontnote 'com.android.vending.licensing.ILicensingService'
// The Android Compatibility library references some classes that may not be
// present in all versions of the API, but we know that's ok.
dontwarn 'android.support.**'
// Preserve all native method names and the names of their classes.
keepclasseswithmembernames includedescriptorclasses: true, 'class * { \
native <methods>; \
}'
// Preserve the special static methods that are required in all enumeration
// classes.
keepclassmembers allowoptimization: true, 'enum * { \
public static **[] values(); \
public static ** valueOf(java.lang.String); \
}'
// Explicitly preserve all serialization members. The Serializable interface
// is only a marker interface, so it wouldn't save them.
// You can comment this out if your application doesn't use serialization.
// If your code contains serializable classes that have to be backward
// compatible, please refer to the manual.
keepclassmembers 'class * implements java.io.Serializable { \
static final long serialVersionUID; \
static final java.io.ObjectStreamField[] serialPersistentFields; \
private void writeObject(java.io.ObjectOutputStream); \
private void readObject(java.io.ObjectInputStream); \
java.lang.Object writeReplace(); \
java.lang.Object readResolve(); \
}'
// Your application may contain more items that need to be preserved;
// typically classes that are dynamically created using Class.forName:
// keep 'public class com.example.MyClass'
// keep 'public interface com.example.MyInterface'
// keep 'public class * implements com.example.MyInterface'
//##############################################################################
// Further optimizations.
//##############################################################################
// If you wish, you can let the optimization step remove Android logging calls.
assumenosideeffects 'class android.util.Log { \
public static boolean isLoggable(java.lang.String, int); \
public static int v(...); \
public static int i(...); \
public static int w(...); \
public static int d(...); \
public static int e(...); \
}'
}