# Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # 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 *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile #1.基本指令区 # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不进行优化,建议使用此选项, -dontoptimize # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify 能够加快混淆速度。 -dontpreverify # 使我们的项目混淆后产生映射文件包含有类名->混淆后类名的映射关系 -verbose # 使用printmapping指定映射文件的名称 -printmapping proguardMapping.txt # 屏蔽警告 -ignorewarnings # 指定混淆是采用的算法,后面的参数是一个过滤器这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* # 保留Annotation不混淆 -keepattributes *Annotation* # 避免混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable #2.默认保留区 # 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -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 -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService -keep public class com.google.vending.licensing.ILicensingService # 保留support下的所有类及其内部类 -keep class android.support.** {*;} # 保留继承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native ; } # 保留在Activity中的方法参数是view的方法,这样一来我们在layout中写的onClick就不会被影响 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我们自定义控件(继承自View)不被混淆 -keep public class * extends android.view.View{ *** get*(); void set*(***); public (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } # 保留Parcelable序列化类不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的类不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private 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(); } # 保留R下面的资源 -keep class **.R$* { *; } # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } # 避免layout中onclick方法(android:onclick="onClick")混淆 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # webview -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.webView, jav.lang.String); } #在app中与HTML5的JavaScript的交互进行特殊处理 #我们需要确保这些js要调用的原生方法不能够被混淆,于是我们需要做如下处理: #-keepclassmembers class com.XXX.XXX.JSInterface { # ; #} # AndroidX混淆 -keep class com.google.android.material.** {*;} -keep class androidx.** {*;} -keep public class * extends androidx.** -keep interface androidx.** {*;} -dontwarn com.google.android.material.** -dontnote com.google.android.material.** -dontwarn androidx.** #me.jessyan:autosize:1.1.2 -keep class me.jessyan.autosize.** { *; } -keep interface me.jessyan.autosize.** { *; } #com.hjq:xxpermissions:9.6 -dontwarn com.hjq.permissions.** #com.ttcble.android:blebase -keep class com.ble.** { *; } -keep class com.ttcble.** { *; } -keep interface com.ble.** { *; } -keep interface com.ttcble.** { *; } # EventBus -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe ; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { (java.lang.Throwable); } -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME; } -keep class **$Properties { *; } # If you DO use SQLCipher: -keep class org.greenrobot.greendao.database.SqlCipherEncryptedHelper { *; } # If you do NOT use SQLCipher: -dontwarn net.sqlcipher.database.** # If you do NOT use RxJava: -dontwarn rx.** #com.jeremyliao:live-event-bus-x:1.7.3 -dontwarn com.jeremyliao.liveeventbus.** -keep class com.jeremyliao.liveeventbus.** {* ; } -keep class android.arch.lifecycle.* { *; } -keep class android.arch.core.* { *; } # for androidx: -dontwarn com.jeremyliao.liveeventbus.* -keep class com.jeremyliao.liveeventbus.** { *; } -keep class androidx.lifecycle.* { *; } -keep class androidx.arch.core.* { *; } #org.greenrobot:greendao:3.3.0 -keep class org.greenrobot.greendao.**{*;} -keep public interface org.greenrobot.greendao.** -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME; } -keep class **$Properties -keep class net.sqlcipher.database.**{*;} -keep public interface net.sqlcipher.database.** -dontwarn net.sqlcipher.database.** -dontwarn org.greenrobot.greendao.** #org.litepal.guolindev:core -keep class org.litepal.** { *; } -keep class * extends org.litepal.crud.DataSupport { *; } -keep class * extends org.litepal.crud.LitePalSupport { *; } #阿里路由框架 -keep public class com.alibaba.android.arouter.routes.**{*;} -keep public class com.alibaba.android.arouter.facade.**{*;} -keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} -dontwarn javax.lang.model.element.** # 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口 -keep interface * implements com.alibaba.android.arouter.facade.template.IProvider # 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现 # -keep class * implements com.alibaba.android.arouter.facade.template.IProvide #微信 -keep class com.tencent.mm.opensdk.** { *; } -keep class com.tencent.wxop.** { *; } -keep class com.tencent.mm.sdk.** { *; } #XHttp2 -keep class com.snc.net.model.** { *; } -keep class com.snc.net.cache.model.** { *; } -keep class com.snc.net.cache.stategy.**{*;} -keep class com.snc.net.annotation.** { *; } #okhttp -dontwarn com.squareup.okhttp3.** -keep class com.squareup.okhttp3.** { *;} -dontwarn okio.** -dontwarn javax.annotation.Nullable -dontwarn javax.annotation.ParametersAreNonnullByDefault -dontwarn javax.annotation.** # Retrofit -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Exceptions # RxJava RxAndroid -dontwarn sun.misc.** -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { long producerIndex; long consumerIndex; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { rx.internal.util.atomic.LinkedQueueNode producerNode; } -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { rx.internal.util.atomic.LinkedQueueNode consumerNode; } #如果用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错 -keepattributes Signature -keep class com.google.gson.stream.** { *; } -keepattributes EnclosingMethod -keep class org.xz_sale.entity.**{*;} -keep class com.google.gson.** {*;} -keep class com.google.**{*;} -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.** { *; } -keep class com.google.gson.examples.android.model.** { *; } -keep public class cn.jzvd.JZMediaSystem {*; } -keep public class cn.jzvd.demo.CustomMedia.CustomMedia {*; } -keep public class cn.jzvd.demo.CustomMedia.JZMediaIjk {*; } -keep public class cn.jzvd.demo.CustomMedia.JZMediaSystemAssertFolder {*; } -keep class tv.danmaku.ijk.media.player.** {*; } -dontwarn tv.danmaku.ijk.media.player.* -keep interface tv.danmaku.ijk.media.player.** { *; } #串口问题 -dontwarn com.kongqw.** -keep class com.kongqw.**{*;} #数据库 -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME; } -keep class **$Properties { *; } # If you DO use SQLCipher: -keep class org.greenrobot.greendao.database.SqlCipherEncryptedHelper { *; } # If you do NOT use SQLCipher: -dontwarn net.sqlcipher.database.** # If you do NOT use RxJava: -dontwarn rx.** -keep class com.just.agentweb.** { *; } -dontwarn com.just.agentweb.** #GSYVideoPlayer -keep class com.shuyu.gsyvideoplayer.video.** { *; } -dontwarn com.shuyu.gsyvideoplayer.video.** -keep class com.shuyu.gsyvideoplayer.video.base.** { *; } -dontwarn com.shuyu.gsyvideoplayer.video.base.** -keep class com.shuyu.gsyvideoplayer.utils.** { *; } -dontwarn com.shuyu.gsyvideoplayer.utils.** -keep class tv.danmaku.ijk.** { *; } -dontwarn tv.danmaku.ijk.** -keep public class * extends android.view.View{ *** get*(); void set*(***); public (android.content.Context); public (android.content.Context, java.lang.Boolean); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } -keep public class com.google.android.material.bottomnavigation.BottomNavigationView { *; } -keep public class com.google.android.material.bottomnavigation.BottomNavigationMenuView { *; } -keep public class com.google.android.material.bottomnavigation.BottomNavigationPresenter { *; } -keep public class com.google.android.material.bottomnavigation.BottomNavigationItemView { *; } # # 自己项目中定义的实体类 -keep class com.snc.database.bean.** { *; } -keep class com.snc.base.bean.** { *; } -keep class com.snc.repairshop.bean.** { *; } -keep class com.snc.acdoc.bean.** { *; } -keep class com.snc.language.bean.** { *; } -keep class com.snc.technician.bean.** { *; } -keep class com.snc.examination.bean.**{*;} -keep class com.snc.systemsetting.bean.** { *; } -keep class com.snc.base.view.** { *; } -keep class com.snc.base.base.utils.** { *; } -keep class com.snc.base.base.** { *; } -keep class com.snc.base.dbmanager.**{*;} -keep class com.snc.base.ble.**{*;} -keep public class * extends com.snc.base.base.IModuleInit #保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留support下的所有类及其内部类 -keep class android.support.** {*;} # 保留继承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留R下面的资源 -keep class **.R$* {*;} # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native ; } # 保留在Activity中的方法参数是view的方法, # 这样以来我们在layout中写的onClick就不会被影响 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我们自定义控件(继承自View)不被混淆 -keep public class * extends android.view.View{ *** get*(); void set*(***); public (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } # 保留Parcelable序列化类不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的类不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient ; !private ; !private ; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } -keep class com.google.android.material.** {*;} -keep class androidx.** {*;} -keep public class * extends androidx.** -keep interface androidx.** {*;} -dontwarn com.google.android.material.** -dontnote com.google.android.material.** -dontwarn androidx.** #me.jessyan:autosize:1.1.2 -keep class me.jessyan.autosize.** { *; } -keep interface me.jessyan.autosize.** { *; } #com.hjq:xxpermissions:9.6 -dontwarn com.hjq.permissions.** -keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { public static java.lang.String TABLENAME; } -keep class **$Properties { *; } # If you DO use SQLCipher: -keep class org.greenrobot.greendao.database.SqlCipherEncryptedHelper { *; } # If you do NOT use SQLCipher: -dontwarn net.sqlcipher.database.** # If you do NOT use RxJava: -dontwarn rx.** -dontwarn com.jeremyliao.liveeventbus.** -keep class com.jeremyliao.liveeventbus.** { *; } -keep class androidx.lifecycle.** { *; } -keep class androidx.arch.core.** { *; } -dontwarn com.kingja.loadsir.** -keep class com.kingja.loadsir.** {*;} -keep class com.tencent.** {*;} -keep class com.tencent.mmkv.** {*;} -keep class com.luck.picture.lib.** { *; } # use Camerax -keep class com.luck.lib.camerax.** { *; } # use uCrop -dontwarn com.yalantis.ucrop** -keep class com.yalantis.ucrop** { *; } -keep interface com.yalantis.ucrop** { *; } # Fastjson 混淆规则 -keep public class com.alibaba.fastjson.JSON { public static ** toJSONString(**); public static ** parseObject(**); public static ** parseArray(**); public static ** parse(**); } -keep public class com.alibaba.fastjson.** { public (org.json.JSONObject); } -keep public class * implements com.alibaba.fastjson.serializer.ObjectSerializer { public (); } -keep public class * implements com.alibaba.fastjson.parser.deserializer.ObjectDeserializer { public (); } -keep class com.alibaba.fastjson.parser.ParserConfig { public (); public static void putDeserializer(java.lang.Class, com.alibaba.fastjson.parser.deserializer.ObjectDeserializer); } -keep class com.alibaba.fastjson.serializer.SerializeConfig { public (); public static void putSerializer(java.lang.Class, com.alibaba.fastjson.serializer.ObjectSerializer); } -keep class com.alibaba.fastjson.util.TypeUtils { public static void register(java.lang.Class, java.lang.Class); } # 如果使用了AutoType的功能,需要保留下面的类不被混淆 -keepattributes Signature -keepattributes *Annotation* -keepclassmembers class * { @com.alibaba.fastjson.annotation.JSONField ; @com.alibaba.fastjson.annotation.JSONType ; } # 如果使用了enum类型的序列化,需要保留enum的名字 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 如果使用了ASM的ClassGenerator,需要保留下面的类不被混淆 -dontnote com.alibaba.fastjson.asm.** -keep class com.alibaba.fastjson.asm.** { *; } ##Glide -dontwarn com.bumptech.glide.** -keep class com.bumptech.glide.**{*;} -keep public class * implements com.bumptech.glide.module.GlideModule -keep public class * extends com.bumptech.glide.AppGlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } -keep class com.hjq.permissions.** {*;} # 保护AndroidX和Jetpack依赖库中的类和成员 -keep class androidx.** { *; } -keep interface androidx.** { *; } -keep public class * extends androidx.** -keep public class * extends androidx.appcompat.app.AppCompatActivity -keep public class * extends androidx.fragment.app.Fragment -keep public class * extends androidx.fragment.app.FragmentActivity -keep public class * extends androidx.appcompat.app.ActionBarActivity -keep public class * extends androidx.preference.Preference -keep public class * extends androidx.viewpager.widget.ViewPager -keep public class * extends androidx.viewpager2.widget.ViewPager2 -keep public class * extends androidx.recyclerview.widget.RecyclerView -keep public class * extends androidx.coordinatorlayout.widget.CoordinatorLayout -keep public class * extends androidx.appcompat.widget.Toolbar -keep public class * extends androidx.drawerlayout.widget.DrawerLayout -keep public class * extends androidx.constraintlayout.widget.ConstraintLayout -keep public class com.google.android.material.** { *; } # 保留 ViewBinding 相关类和方法 -keep class * implements androidx.viewbinding.ViewBinding { *; } # 保留 LayoutInflater.inflate 方法,避免 NoSuchMethodException 异常 -keepclassmembers class * { void inflate(android.view.LayoutInflater, android.view.ViewGroup, boolean); } # 保留基础 Fragment 类及其抽象方法 -keep class com.snc.base.base.BaseFragment { public protected *; private *; } # 保留 BaseFragment 中的 initListener 和 initData 方法 -keepclassmembers class com.snc.base.base.BaseFragment { void initListener(); void initData(); } # 保留 NetworkMonitor 类及其方法和成员变量 -keep class com.snc.base.network.NetworkMonitor { public protected *; private *; } # 保留 TDialog.Builder 类及其方法和成员变量 -keep class com.yourpackage.TDialog$Builder { public protected *; private *; } # 保留 OnBindViewListener 和 OnViewClickListener 接口及其实现类 -keep interface com.snc.base.dialog.listener.OnBindViewListener { public protected *; private *; } -keep public class * extends androidx.appcompat.app.AppCompatActivity -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 -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # AgentWeb -keep public class com.just.agentweb.** { ; ; } -keep public class androidx.** { ; ; } # OkHttp3 -keepattributes Signature -keepattributes *Annotation* -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -dontwarn okhttp3.** -dontwarn okio.** # EasyHttp -keep class com.hjq.http.** {*;} # 必须要加上此规则,否则会导致泛型解析失败 -keep public class * implements com.hjq.http.listener.OnHttpListener { *; } # 不混淆这个包下的类 -keep class com.snc.base.http.** { ; } -keep class javax.mail.**{*;} -keep class javax.mail.internet.**{*;} -keep class org.apache.commons.mail.**{*;} -keep class javamail.** {*;} -keep class javax.mail.** {*;} -keep class javax.activation.** {*;} -keep class com.sun.mail.dsn.** {*;} -keep class com.sun.mail.handlers.** {*;} -keep class com.sun.mail.smtp.** {*;} -keep class com.sun.mail.util.** {*;} -keep class mailcap.** {*;} -keep class mimetypes.** {*;} -keep class myjava.awt.datatransfer.** {*;} -keep class org.apache.harmony.awt.** {*;} -keep class org.apache.harmony.misc.** {*;}