-
-
Save jemshit/767ab25a9670eb0083bafa65f8d786bb to your computer and use it in GitHub Desktop.
# 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 | |
# Keep generic signatures; needed for correct type resolution | |
-keepattributes Signature | |
# Keep Gson annotations | |
# Note: Cannot perform finer selection here to only cover Gson annotations, see also https://stackoverflow.com/q/47515093 | |
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault | |
## The following rules are needed for R8 in "full mode" which only adheres to `-keepattribtues` if | |
## the corresponding class or field is matches by a `-keep` rule as well, see | |
## https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#r8-full-mode | |
# Keep class TypeToken (respectively its generic signature) if present | |
-if class com.google.gson.reflect.TypeToken | |
-keep,allowobfuscation class com.google.gson.reflect.TypeToken | |
# Keep any (anonymous) classes extending TypeToken | |
-keep,allowobfuscation class * extends com.google.gson.reflect.TypeToken | |
# Keep classes with @JsonAdapter annotation | |
-keep,allowobfuscation,allowoptimization @com.google.gson.annotations.JsonAdapter class * | |
# Keep fields with any other Gson annotation | |
# Also allow obfuscation, assuming that users will additionally use @SerializedName or | |
# other means to preserve the field names | |
-keepclassmembers,allowobfuscation class * { | |
@com.google.gson.annotations.Expose <fields>; | |
@com.google.gson.annotations.JsonAdapter <fields>; | |
@com.google.gson.annotations.Since <fields>; | |
@com.google.gson.annotations.Until <fields>; | |
} | |
# Keep no-args constructor of classes which can be used with @JsonAdapter | |
# By default their no-args constructor is invoked to create an adapter instance | |
-keepclassmembers class * extends com.google.gson.TypeAdapter { | |
<init>(); | |
} | |
-keepclassmembers class * implements com.google.gson.TypeAdapterFactory { | |
<init>(); | |
} | |
-keepclassmembers class * implements com.google.gson.JsonSerializer { | |
<init>(); | |
} | |
-keepclassmembers class * implements com.google.gson.JsonDeserializer { | |
<init>(); | |
} | |
# Keep fields annotated with @SerializedName for classes which are referenced. | |
# If classes with fields annotated with @SerializedName have a no-args | |
# constructor keep that as well. Based on | |
# https://issuetracker.google.com/issues/150189783#comment11. | |
# See also https://github.com/google/gson/pull/2420#discussion_r1241813541 | |
# for a more detailed explanation. | |
-if class * | |
-keepclasseswithmembers,allowobfuscation class <1> { | |
@com.google.gson.annotations.SerializedName <fields>; | |
} | |
-if class * { | |
@com.google.gson.annotations.SerializedName <fields>; | |
} | |
-keepclassmembers,allowobfuscation,allowoptimization class <1> { | |
<init>(); | |
} | |
### 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.** { *; } | |
-keep public class com.miui.referrer.** {*;} | |
### Appsflyer | |
-keep class com.appsflyer.** { *; } | |
-keep public class com.android.installreferrer.** { *; } | |
-keep public class com.miui.referrer.** {*;} | |
## 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..
Do you know who to retain kotlin named function arguments after applying proguard?
Hello,
This is Dhairya.
After some extensive scrolling, I somehow ended up on Google's Git and in one of the samples' proguard-rules, I found these rules for Room DB:
-keep class * extends androidx.room.RoomDatabase
-dontwarn androidx.room.paging.**
I am not sure if it's correct or if it works, if someone can cross-verify it, that would be nice, and if it works, can you update it into your proguard-rules as well?
Here's the link where I found it, just in case:
https://android.googlesource.com/platform/frameworks/support/+/refs/heads/pie-release-2/room/runtime/proguard-rules.pro
Thanks !