# If your project uses WebView with JS, uncomment the following | |
# and specify the fully qualified class name to the JavaScript interface | |
# class: | |
-keepclassmembers class fqcn.of.javascript.interface.for.webview { | |
public *; | |
} | |
### RxJava, RxAndroid (https://gist.github.com/kosiara/487868792fbd3214f9c9) | |
-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; | |
} | |
-dontwarn sun.misc.Unsafe | |
-dontwarn org.reactivestreams.FlowAdapters | |
-dontwarn org.reactivestreams.** | |
-dontwarn java.util.concurrent.flow.** | |
-dontwarn java.util.concurrent.** | |
### LeakCanary | |
-keep class org.eclipse.mat.** { *; } | |
-keep class com.squareup.leakcanary.** { *; } | |
### Stetho, Stetho Realm plugin | |
-keep class com.facebook.stetho.** { | |
*; | |
} | |
-dontwarn com.facebook.stetho.** | |
-keep class com.uphyca.** { *; } | |
### Glide, Glide Okttp Module, Glide Transformations | |
-keep public class * implements com.bumptech.glide.module.GlideModule | |
-keep public class * extends com.bumptech.glide.module.AppGlideModule | |
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { | |
**[] $VALUES; | |
public *; | |
} | |
# -keepresourcexmlelements manifest/application/meta-data@value=GlideModule 3 For dexguard | |
-dontwarn jp.co.cyberagent.android.gpuimage.** | |
### Viewpager indicator | |
-dontwarn com.viewpagerindicator.** | |
### Support v7, Design | |
# http://stackoverflow.com/questions/29679177/cardview-shadow-not-appearing-in-lollipop-after-obfuscate-with-proguard/29698051 | |
-keep class android.support.v7.widget.RoundRectDrawable { *; } | |
-keep public class android.support.v7.widget.** { *; } | |
-keep public class android.support.v7.internal.widget.** { *; } | |
-keep public class android.support.v7.internal.view.menu.** { *; } | |
-keep public class * extends android.support.v4.view.ActionProvider { | |
public <init>(android.content.Context); | |
} | |
-dontwarn android.support.** | |
-dontwarn android.support.design.** | |
-keep class android.support.design.** { *; } | |
-keep interface android.support.design.** { *; } | |
-keep public class android.support.design.R$* { *; } | |
# https://github.com/Gericop/Android-Support-Preference-V7-Fix/blob/master/preference-v7/proguard-rules.pro | |
-keepclassmembers class android.support.v7.preference.PreferenceGroupAdapter { | |
private ** mPreferenceLayouts; | |
} | |
-keepclassmembers class android.support.v7.preference.PreferenceGroupAdapter$PreferenceLayout { | |
private int resId; | |
private int widgetResId; | |
} | |
# https://github.com/dandar3/android-support-animated-vector-drawable/blob/master/proguard-project.txt | |
#-keepclassmembers class android.support.graphics.drawable.VectorDrawableCompat$* { | |
# void set*(***); | |
# *** get*(); | |
#} | |
### Reactive Network | |
-dontwarn com.github.pwittchen.reactivenetwork.library.ReactiveNetwork | |
-dontwarn io.reactivex.functions.Function | |
-dontwarn rx.internal.util.** | |
-dontwarn sun.misc.Unsafe | |
### Retrolambda | |
# as per official recommendation: https://github.com/evant/gradle-retrolambda#proguard | |
-dontwarn java.lang.invoke.* | |
### Gson uses generic type information stored in a class file when working with fields. Proguard | |
# removes such information by default, so configure it to keep all of it. | |
-keepattributes Signature | |
# For using GSON @Expose annotation | |
-keepattributes *Annotation* | |
# Gson specific classes | |
-dontwarn sun.misc.** | |
#-keep class com.google.gson.stream.** { *; } | |
# Application classes that will be serialized/deserialized over Gson | |
-keep class com.google.gson.examples.android.model.** { <fields>; } | |
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, | |
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) | |
-keep class * extends com.google.gson.TypeAdapter | |
-keep class * implements com.google.gson.TypeAdapterFactory | |
-keep class * implements com.google.gson.JsonSerializer | |
-keep class * implements com.google.gson.JsonDeserializer | |
# Prevent R8 from leaving Data object members always null | |
-keepclassmembers,allowobfuscation class * { | |
@com.google.gson.annotations.SerializedName <fields>; | |
} | |
### Retrofit 2 | |
# Platform calls Class.forName on types which do not exist on Android to determine platform. | |
-dontnote retrofit2.Platform | |
# Platform used when running on RoboVM on iOS. Will not be used at runtime. | |
-dontnote retrofit2.Platform$IOS$MainThreadExecutor | |
# Platform used when running on Java 8 VMs. Will not be used at runtime. | |
-dontwarn retrofit2.Platform$Java8 | |
# Retain generic type information for use by reflection by converters and adapters. | |
-keepattributes Signature | |
# Retain declared checked exceptions for use by a Proxy instance. | |
-keepattributes Exceptions | |
-dontwarn retrofit2.adapter.rxjava.CompletableHelper$** # https://github.com/square/retrofit/issues/2034 | |
#To use Single instead of Observable in Retrofit interface | |
-keepnames class rx.Single | |
#Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and | |
# EnclosingMethod is required to use InnerClasses. | |
-keepattributes Signature, InnerClasses, EnclosingMethod | |
# Retain service method parameters when optimizing. | |
-keepclassmembers,allowshrinking,allowobfuscation interface * { | |
@retrofit2.http.* <methods>; | |
} | |
# Retrofit does reflection on method and parameter annotations. | |
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations | |
# Ignore annotation used for build tooling. | |
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement | |
# Ignore JSR 305 annotations for embedding nullability information. | |
-dontwarn javax.annotation.** | |
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath. | |
-dontwarn kotlin.Unit | |
# Top-level functions that can only be used by Kotlin. | |
-dontwarn retrofit2.KotlinExtensions | |
-dontwarn retrofit2.KotlinExtensions$* | |
# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy | |
# and replaces all potential values with null. Explicitly keeping the interfaces prevents this. | |
-if interface * { @retrofit2.http.* <methods>; } | |
-keep,allowobfuscation interface <1> | |
### OkHttp3 | |
-dontwarn okhttp3.** | |
-dontwarn okio.** | |
-dontwarn javax.annotation.** | |
# A resource is loaded with a relative path so the package of this class must be preserved. | |
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase | |
### Picasso | |
-dontwarn com.squareup.okhttp.** | |
### SimpleXmlConverter | |
# Keep public classes and methods. | |
-dontwarn com.bea.xml.stream.** | |
-dontwarn org.simpleframework.xml.stream.** | |
-keep class org.simpleframework.xml.**{ *; } | |
-keepclassmembers,allowobfuscation class * { | |
@org.simpleframework.xml.* <fields>; | |
@org.simpleframework.xml.* <init>(...); | |
} | |
# Findbugs Annotation | |
-dontwarn edu.umd.cs.findbugs.annotations.SuppressFBWarnings | |
# Findbugs jsr305 | |
-dontwarn javax.annotation.** | |
### greenDAO 3 | |
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { | |
public static java.lang.String TABLENAME; | |
} | |
-keep class **$Properties | |
# If you do not use SQLCipher: | |
-dontwarn org.greenrobot.greendao.database.** | |
# If you do not use RxJava: | |
-dontwarn rx.** | |
### greenDAO 2 | |
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao { | |
public static java.lang.String TABLENAME; | |
} | |
-keep class **$Properties | |
### MoPub | |
-keepclassmembers class com.mopub.** { public *; } | |
-keep public class com.mopub.** | |
-keep public class android.webkit.JavascriptInterface {} | |
-keep class * extends com.mopub.mobileads.CustomEventBanner {} | |
-keepclassmembers class com.mopub.mobileads.CustomEventBannerAdapter {!private !public !protected *;} | |
-keep class * extends com.mopub.mobileads.CustomEventInterstitial {} | |
-keep class * extends com.mopub.mobileads.CustomEventNative {} | |
## Android Advertiser ID | |
-keep class com.google.android.gms.common.GooglePlayServicesUtil {*;} | |
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {*;} | |
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {*;} | |
### Crashlytics | |
# In order to provide the most meaningful crash reports | |
-keepattributes SourceFile,LineNumberTable | |
# If you're using custom Eception | |
-keep public class * extends java.lang.Exception | |
-keep class com.crashlytics.** { *; } | |
-dontwarn com.crashlytics.** | |
-keep class com.google.firebase.crashlytics.** { *; } | |
-dontwarn com.google.firebase.crashlytics.** | |
### Crash report | |
-renamesourcefileattribute SourceFile | |
-keepattributes SourceFile,LineNumberTable | |
### Other | |
-dontwarn com.google.errorprone.annotations.* | |
### Exoplayer2 | |
-dontwarn com.google.android.exoplayer2.** | |
### Android Architecture Components | |
# Ref: https://issuetracker.google.com/issues/62113696 | |
# LifecycleObserver's empty constructor is considered to be unused by proguard | |
#-keepclassmembers class * implements android.arch.lifecycle.LifecycleObserver { | |
# <init>(...); | |
#} | |
-keep class * implements android.arch.lifecycle.LifecycleObserver { | |
<init>(...); | |
} | |
# ViewModel's empty constructor is considered to be unused by proguard | |
-keepclassmembers class * extends android.arch.lifecycle.ViewModel { | |
<init>(...); | |
} | |
# keep Lifecycle State and Event enums values | |
-keepclassmembers class android.arch.lifecycle.Lifecycle$State { *; } | |
-keepclassmembers class android.arch.lifecycle.Lifecycle$Event { *; } | |
# keep methods annotated with @OnLifecycleEvent even if they seem to be unused | |
# (Mostly for LiveData.LifecycleBoundObserver.onStateChange(), but who knows) | |
-keepclassmembers class * { | |
@android.arch.lifecycle.OnLifecycleEvent *; | |
} | |
### Carbon | |
-keepclasseswithmembernames class * { | |
native <methods>; | |
} | |
-keep class android.support.v8.renderscript.** { *; } | |
-dontwarn carbon.BR | |
-dontwarn carbon.internal** | |
-dontwarn carbon.databinding** | |
-dontwarn java.lang.invoke** | |
## Databinding or library depends on databinding | |
-dontwarn android.databinding.** | |
-keep class android.databinding.** { *; } | |
### Kotlin Coroutine | |
# https://github.com/Kotlin/kotlinx.coroutines/blob/master/README.md | |
# ServiceLoader support | |
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} | |
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} | |
-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {} | |
-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {} | |
# Most of volatile fields are updated with AFU and should not be mangled | |
-keepclassmembernames class kotlinx.** { | |
volatile <fields>; | |
} | |
# Same story for the standard library's SafeContinuation that also uses AtomicReferenceFieldUpdater | |
-keepclassmembernames class kotlin.coroutines.SafeContinuation { | |
volatile <fields>; | |
} | |
# https://github.com/Kotlin/kotlinx.atomicfu/issues/57 | |
-dontwarn kotlinx.atomicfu.** | |
-dontwarn kotlinx.coroutines.flow.** | |
### Kotlin | |
#https://stackoverflow.com/questions/33547643/how-to-use-kotlin-with-proguard | |
#https://medium.com/@AthorNZ/kotlin-metadata-jackson-and-proguard-f64f51e5ed32 | |
-keepclassmembers class **$WhenMappings { | |
<fields>; | |
} | |
-keep class kotlin.Metadata { *; } | |
-keepclassmembers class kotlin.Metadata { | |
public <methods>; | |
} | |
### Google Play Billing | |
-keep class com.android.vending.billing.** | |
### Adjust SDK, android.installreferrer | |
-keep public class com.adjust.sdk.** { *; } | |
-keep class com.google.android.gms.common.ConnectionResult { | |
int SUCCESS; | |
} | |
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient { | |
com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context); | |
} | |
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { | |
java.lang.String getId(); | |
boolean isLimitAdTrackingEnabled(); | |
} | |
-keep public class com.android.installreferrer.** { *; } | |
### Appsflyer | |
-keep class com.appsflyer.** { *; } | |
-keep public class com.android.installreferrer.** { *; } | |
## uninstall tracking (FirebaseMessagingService) | |
-dontwarn com.appsflyer.** | |
-keep public class com.google.firebase.messaging.FirebaseMessagingService { | |
public *; | |
} | |
### Android Iconics | |
-keep class .R | |
-keep class **.R$* { | |
<fields>; | |
} | |
### Huawei HMS core | |
-keepattributes *Annotation* | |
-keepattributes Exceptions | |
-keepattributes InnerClasses | |
-keepattributes Signature | |
-keepattributes SourceFile,LineNumberTable | |
-keep class com.hianalytics.android.**{*;} | |
-keep class com.huawei.updatesdk.**{*;} | |
-keep class com.huawei.hms.**{*;} | |
### Huawei HMS ads | |
-keep class com.huawei.openalliance.ad.** { *; } | |
-keep class com.huawei.hms.ads.** { *; } | |
### Huawei App Metrics | |
-keep class com.huawei.agconnect.**{*;} | |
-dontwarn com.huawei.agconnect.** | |
-keep class com.hianalytics.android.**{*;} | |
-keep class com.huawei.updatesdk.**{*;} | |
-keep class com.huawei.hms.**{*;} | |
-keep interface com.huawei.hms.analytics.type.HAEventType{*;} | |
-keep interface com.huawei.hms.analytics.type.HAParamType{*;} | |
-keepattributes Exceptions, Signature, InnerClasses, LineNumberTable | |
### Nothing for Butterknife 8, Realm, RxJava2, RxBinding, RxRelay, Dagger2, OneSignal, Google Play Services, Firebase, Facebook SDK, Room DB, |
Would you mind if I recommend you add androidx to this list?
AndroidX
-dontwarn com.google.android.material.**
-keep class com.google.android.material.** { *; }
-dontwarn androidx.**
-keep class androidx.** { ; }
-keep interface androidx.* { *; }
@ThanawatMas did you test it on production? (we have been using androidx+material components without any proguard settings for long time)
Is this proguard still valid? We should keep this updated! Thank you
Awesome! Thanks, @jemshit. Although, my app still crashes on Le Eco 2 devices.
Good one bud, it will be grateful for developers if you keep updating the file as and when you work on some other library.
@jemshit kindly add the following lines for Gson to prevent proguard from obfuscating field's serialize name mark with @SerializedName annotation.
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
reference - https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg
Updated
Hi This is Jesuraj.
I have a android.webkit.WebView in my activity. When the proguard is enabled in gradle file, In release build the Webview activity is not working.. Please guide me how to fix this issue..
Thanks !