# 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 # ============================== # 基础混淆配置 # ============================== -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 保留注解、泛型、异常信息(反射必备) -keepattributes *Annotation*,Signature,Exception -keepattributes InnerClasses,EnclosingMethod # 单独再声明一次,确保泛型签名在 R8 full mode 下不被过度优化(修复 ParameterizedType cast 错误) -keepattributes Signature -keepattributes *Annotation* -keepattributes RuntimeVisibleAnnotations,RuntimeVisibleParameterAnnotations,AnnotationDefault # ============================== # Android 基础组件保护 # ============================== -keep public class * extends android.app.Activity -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 # 保留 Activity 中 onClick 属性引用方法名(xml 里直接引用) -keepclassmembers public class * extends android.app.Activity { public void *(android.view.View); } # ============================== # R 文件资源 ID 不混淆 # ============================== -keep class **.R$* { *; } # ============================== # Parcelable 和 Serializable 支持 # ============================== -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient ; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # ============================== # Kotlin 标准库(只保留必要部分,避免全量 keep 造成包体积大) # ============================== -keep class kotlin.Metadata { *; } -dontwarn kotlin.** -keepclassmembers class **$WhenMappings { ; } # ============================== # 网络层 Retrofit + Gson(核心反射依赖,必须保留) # 修复:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType # ============================== # BaseNetworkApi 与 NetworkApi:保留继承关系及泛型参数(INetworkService 实际类型) -keep class com.abbidot.baselibrary.network.base.BaseNetworkApi { *; } -keep class * extends com.abbidot.baselibrary.network.base.BaseNetworkApi { *; } -keep interface com.abbidot.baselibrary.network.base.IService { *; } -keep class com.abbidot.tracker.retrofit2.NetworkApi { *; } # 显式保留 NetworkApi -> BaseNetworkApi 的泛型签名 -keep,allowshrinking class * extends com.abbidot.baselibrary.network.base.BaseNetworkApi # BaseResponse 网络响应泛型基类(Gson 反序列化核心) -keep class com.abbidot.baselibrary.network.base.BaseResponse { *; } -keepclassmembers class * extends com.abbidot.baselibrary.network.base.BaseResponse { ; (...); } # baselibrary 网络拦截器/异常类(Gson TypeAdapter & OkHttp Interceptor) -keep class com.abbidot.baselibrary.network.interceptor.** { *; } -keep class com.abbidot.baselibrary.network.exception.** { *; } -keep class com.abbidot.baselibrary.util.** { *; } # Retrofit 服务接口 INetworkService:所有方法、注解、参数不可混淆(动态代理反射) -keep interface com.abbidot.tracker.retrofit2.INetworkService { *; } -keepclassmembers interface com.abbidot.tracker.retrofit2.INetworkService { public ; @retrofit2.http.* ; } # Retrofit + OkHttp 官方推荐规则 -keep,allowobfuscation,allowshrinking interface retrofit2.Call -keep,allowobfuscation,allowshrinking class retrofit2.Response -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation -if interface * { @retrofit2.http.* ; } -keep,allowobfuscation interface * { ; } -dontwarn org.codehaus.mojo.animal_sniffer.* -dontwarn okhttp3.internal.platform.** -dontwarn org.conscrypt.** -dontwarn org.bouncycastle.** -dontwarn org.openjsse.** # Gson 官方推荐规则:TypeToken 反射、匿名内部类泛型、字段保留 -keep class com.google.gson.** { *; } -dontwarn com.google.gson.** # 保持 Gson TypeToken 及其子类(防止 object : TypeToken<...>() {} 的泛型签名被擦除) -keep class com.google.gson.reflect.TypeToken { *; } -keep class * extends com.google.gson.reflect.TypeToken { *; } -keepclassmembers class * extends com.google.gson.reflect.TypeToken { (...); java.lang.reflect.Type getType(); } # 保留 @SerializedName / @Expose 标记的字段 -keepclassmembers,allowshrinking,allowobfuscation class * { @com.google.gson.annotations.SerializedName ; @com.google.gson.annotations.Expose ; } -keepnames class com.google.gson.internal.** { *; } -keep class com.google.gson.internal.LinkedTreeMap { *; } # ============================== # 项目实体类/数据类 —— 这是核心,开启混淆后必崩的关键!! # ============================== -keep class com.abbidot.tracker.bean.** { *; } -keep class com.abbidot.tracker.data.** { *; } -keep class com.abbidot.tracker.model.** { *; } -keep class com.abbidot.tracker.entity.** { *; } # kotlinx-parcelize:@Parcelize 注解在编译期生成 Parcelable 实现 # 注意:@Parcelize 是 SOURCE/BINARY 级注解,运行时不存在,因此禁止写 -keep @kotlinx.parcelize.Parcelize # 直接保留所有 Parcelable 实现类 + kotlin-parcelize 生成的 $Creator/$Parceler 内部类即可 -keep class * implements android.os.Parcelable { *; } -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; public static final android.os.Parcelable$ClassLoaderCreator *; (android.os.Parcel); (android.os.Parcel, java.lang.ClassLoader); void writeToParcel(android.os.Parcel, int); int describeContents(); } # kotlin-parcelize 运行时生成的内部辅助类($Creator、$Parceler 等) -keep class **$Creator { *; } -keep class **$Parceler { *; } -keepclassmembers class **$Creator { ; ; } -keepclassmembers class **$Parceler { ; ; } -dontwarn kotlinx.parcelize.** # BaseDiffBean:列表 DiffUtil 比较基类(PetBean 等继承) -keep class com.abbidot.tracker.base.BaseDiffBean { *; } -keepclassmembers class * extends com.abbidot.tracker.base.BaseDiffBean { (...); ; ; } # ============================== # ViewModel:by viewModels() / Hilt / SavedStateHandle 反射创建 # ============================== -keep class * extends androidx.lifecycle.ViewModel { *; } -keepclassmembers class * extends androidx.lifecycle.ViewModel { public (...); protected (...); ; ; } # ViewModelProvider.Factory:反射创建 ViewModel 的工厂接口(内部类用 $ 分隔) -keep class * implements androidx.lifecycle.ViewModelProvider$Factory { *; } -keepclassmembers class * implements androidx.lifecycle.ViewModelProvider$Factory { public (...); ; ; } # SavedStateHandle:ViewModel 构造参数 SavedStateHandle 创建器 -keep class * implements androidx.lifecycle.SavedStateViewModelFactory$** { *; } -keep class androidx.lifecycle.SavedStateHandle { *; } # ============================== # Kotlin 协程 / suspend 函数:防止挂起函数签名被 R8 过度优化 # ============================== -keep class kotlin.coroutines.Continuation { *; } -keep class kotlin.coroutines.intrinsics.** { *; } -keep class kotlinx.coroutines.** { *; } -keepclassmembers class kotlinx.coroutines.** { ; ; } -dontwarn kotlinx.coroutines.** -dontwarn kotlin.coroutines.** # ============================== # Kotlin 伴生对象 / 单例 INSTANCE:ViewUtil.instance / SRBleUtil.instance / ConstantString.Companion 等 # ============================== -keepclassmembers class **$Companion { ; ; public static final *; static *; } -keep class **$Companion { *; } -keepclassmembers class * { public static final ** INSTANCE; public static final ** Companion; public static ** getINSTANCE(); public static ** getCompanion(); } # ============================== # 工具类(核心:ViewUtil/Util/SRBleUtil 等 —— 所有页面都在调用,不能混淆!! # ============================== -keep class com.abbidot.tracker.util.** { *; } -keepclassmembers class com.abbidot.tracker.util.** { public (...); ; ; public static final *; static *; } # ============================== # 项目常量类(ConstantString 等:Intent extra key、MMKVKey、事件 key 等) # ============================== -keep class com.abbidot.tracker.constant.** { *; } -keepclassmembers class com.abbidot.tracker.constant.** { public static final *; ; ; } # ============================== # 自定义 View/控件(37个:TrackLineView、VerifyEditText、MyBluetoothAnimView 等,所有 XML inflate) # ============================== -keep class com.abbidot.tracker.widget.** { *; } -keepclassmembers class com.abbidot.tracker.widget.** { public (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (android.content.Context, android.util.AttributeSet, int, int); public (...); ; ; void set*(***); *** get*(); } # ============================== # ViewBinding # ============================== -keep class com.abbidot.tracker.databinding.** { *; } # ============================== # Hilt 依赖注入 # ============================== -keep class dagger.hilt.** { *; } -keep @dagger.hilt.android.lifecycle.HiltViewModel class * { *; } -keep @dagger.hilt.android.AndroidEntryPoint class * { *; } -keep @dagger.Module class * { *; } -keep @dagger.hilt.EntryPoint class * { *; } # ============================== # Room 数据库 # ============================== -keep class * extends androidx.room.RoomDatabase { *; } -keep @androidx.room.Entity class * { *; } -keep @androidx.room.Dao interface * { *; } # ============================== # 第三方库规则(仅保留不能被混淆的 SDK —— 多数自带 consumer-rules 的就不重复写) # ============================== # —— Coil 图片加载(注意:包名是 coil(不是 io.coil)—— -keep class coil.** { *; } -dontwarn coil.** # —— Lottie 动画(自带 consumer rules,保险起见仍保留关键规则 -keep class com.airbnb.lottie.** { *; } -dontwarn com.airbnb.lottie.** # —— BaseRecyclerViewAdapterHelper(BRVAH 3.x:BaseViewHolder 在 viewholder 子包) -keep class com.chad.library.adapter.** { *; } -keep public class * extends com.chad.library.adapter.base.BaseQuickAdapter -keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder # —— QMUI UI 库(官方推荐规则) -keep class com.qmuiteam.** { *; } -dontwarn com.qmuiteam.** # —— Mapbox(自带 consumer rules # —— 百度地图/百度定位(官方要求全量 keep) -keep class com.baidu.** { *; } -keep class vi.com.gdi.bgl.android.** { *; } -dontwarn com.baidu.** # —— 极光推送(官方要求全量 keep) -keep class cn.jiguang.** { *; } -dontwarn cn.jiguang.** # —— Stripe 支付(自带 consumer rules) # —— Braintree / PayPal 支付(自带 consumer rules) # —— 微信 SDK(官方要求) -keep class com.tencent.mm.opensdk.** { *; } -keep class com.tencent.wxop.** { *; } -keep class com.tencent.mm.sdk.** { *; } # —— 支付宝 SDK(官方要求全量 keep) -keep class com.alipay.** { *; } -dontwarn com.alipay.** # —— Nordic DFU 升级(自带 consumer rules) -keep class no.nordicsemi.android.** { *; } -dontwarn no.nordicsemi.android.** # —— XXPermissions / Toaster(官方推荐规则) -keep class com.hjq.permissions.** { *; } -keep class com.hjq.toast.** { *; } -dontwarn com.hjq.permissions.** -dontwarn com.hjq.toast.** # —— daimajia AndroidViewAnimations(R8 missing_rules 自动生成:引用了 Android 不存在的可选分支) -dontwarn com.daimajia.easing.Glider -dontwarn com.daimajia.easing.Skill # ============================== # 自定义 View / XML LayoutInflater 反射实例化保留(核心!) # 修复 InflateException / InvocationTargetException(CalendarView 就是因此崩溃) # ============================== # # 规则 1:所有继承 android.view.View 的类必须保留 (Context, AttributeSet) 构造函数 # LayoutInflater 通过反射调用此构造函数从 XML 创建 View -keepclassmembers class * extends android.view.View { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (android.content.Context, android.util.AttributeSet, int, int); void set*(***); *** get*(); } # # 规则 2:所有继承 ViewGroup / Layout / 常用容器的类同样保留构造 -keepclassmembers class * extends android.view.ViewGroup { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (android.content.Context, android.util.AttributeSet, int, int); } # # 规则 3:CalendarView(angcyo fork 版,XML 中包名仍然是 com.haibin.calendarview) # 本包下所有自定义 View、内部类、attrs 属性全部保留 -keep class com.haibin.calendarview.** { *; } -keepclassmembers class com.haibin.calendarview.** { public (...); ; ; } -dontwarn com.haibin.calendarview.** # # 规则 4:项目内部自定义 View 包(TrackLineView、VerifyEditText、RingChartView 等) # 包路径:com.abbidot.tracker.widget.** -keep class com.abbidot.tracker.widget.** { *; } -keepclassmembers class com.abbidot.tracker.widget.** { public (...); ; ; } # # 规则 5:AndroidX FlexboxLayout(自定义 ViewGroup) -keep class com.google.android.flexbox.** { *; } -keepclassmembers class com.google.android.flexbox.** { public (...); ; ; } -dontwarn com.google.android.flexbox.** # # 规则 6:VannikTech Android Image Cropper(自定义 View + Activity) -keep class com.vanniktech.ui.** { *; } -keep class com.canhub.cropper.** { *; } -keep class * extends androidx.activity.ComponentActivity -dontwarn com.vanniktech.ui.** -dontwarn com.canhub.cropper.** # # 规则 7:Compressor 图片压缩库 -keep class id.zelory.compressor.** { *; } -dontwarn id.zelory.compressor.** # ============================== # 子模块(本地 project 依赖:easyPhotos / FastBleLib / easysocket) # 完全不混淆! # 各子模块自身 build.gradle 已配置 consumerProguardFiles 传递以下规则,这里再写一份做双重保险 # 实际包名(以各子模块 namespace 为准): # FastBleLib → com.clj.fastble # easyPhotos → com.huantansheng.easyphotos # easysocket → com.easysocket # ============================== # ============================== # 子模块 1:FastBleLib(蓝牙库)核心强化规则 # 问题:BleManager.getInstance().isConnected(mac) 执行不正常 # ============================== # 基础包全量 keep -keep class com.clj.fastble.** { *; } -keepclassmembers class com.clj.fastble.** { public (...); protected (...); ; ; } # Parcelable 强化(BleDevice 等):全量 Parcelable CREATOR + FastBle 专属类单独 keep -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; public static final android.os.Parcelable$ClassLoaderCreator *; public (android.os.Parcel); public (android.os.Parcel, java.lang.ClassLoader); public void writeToParcel(android.os.Parcel, int); public int describeContents(); } # 说明:因为上面已经 -keep class com.clj.fastble.** { *; },这些类所有成员已全量保留 # 这里只做显式声明(防止 outer keep 失效时的兜底) -keep class com.clj.fastble.data.BleDevice { *; } -keep class com.clj.fastble.data.BleConnectStateParameter { *; } -keep class com.clj.fastble.data.BleScanState { *; } -keep class com.clj.fastble.data.BleMsg { *; } # 系统蓝牙回调覆写方法(最关键!Binder 回调触发) -keepclassmembers class * extends android.bluetooth.BluetoothGattCallback { public *; protected *; void onConnectionStateChange(...); void onServicesDiscovered(...); void onCharacteristicRead(...); void onCharacteristicWrite(...); void onCharacteristicChanged(...); void onDescriptorRead(...); void onDescriptorWrite(...); void onReliableWriteCompleted(...); void onReadRemoteRssi(...); void onMtuChanged(...); void onPhyUpdate(...); void onPhyRead(...); void onServiceChanged(...); } -keepclassmembers class * implements android.bluetooth.BluetoothAdapter$LeScanCallback { void onLeScan(...); } -keepclassmembers class * extends android.bluetooth.le.ScanCallback { void onScanResult(...); void onBatchScanResults(...); void onScanFailed(...); } # Handler 内部类 handleMessage 保留 -keepclassmembers class * extends android.os.Handler { public void handleMessage(android.os.Message); protected void handleMessage(android.os.Message); void handleMessage(...); } # 枚举类保留 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static ** valueOf(java.lang.Class, java.lang.String); } -keep enum com.clj.fastble.** { *; } -keep class com.clj.fastble.bluetooth.BleBluetooth$LastState { *; } # 静态 Holder 单例 -keep class com.clj.fastble.BleManager$BleManagerHolder { *; } -keepclassmembers class com.clj.fastble.BleManager$BleManagerHolder { static com.clj.fastble.BleManager sBleManager; (...); } -keep class com.clj.fastble.scan.BleScanner$BleScannerHolder { *; } -keepclassmembers class com.clj.fastble.scan.BleScanner$BleScannerHolder { static com.clj.fastble.scan.BleScanner sBleScanner; (...); } # 内部类+匿名内部类(禁止 class merging) -keepattributes InnerClasses,EnclosingMethod -keep class com.clj.fastble.**$* { *; } -keepclassmembers class com.clj.fastble.**$* { (...); ; ; } # 反射支持(BluetoothGatt#refresh) # 说明: # - java.lang.reflect.* / android.bluetooth.BluetoothGatt 均为 Android 系统框架类,R8 不会修改/混淆/优化系统类 # - BluetoothGatt#refresh() 是 @hide 隐藏 API,编译期 SDK(android.jar)中不存在,故无需也无法 keep # - 运行时反射 Class.getMethod("refresh") 可正常查找系统 ROM 中的真实方法,不受 ProGuard/R8 影响 # - 因此这里不需要写任何 -keep 规则,仅保留 -dontwarn 防止反射类的警告 -dontwarn java.lang.reflect.** -dontwarn android.bluetooth.BluetoothGatt # 回调接口保留 -keep interface com.clj.fastble.callback.** { *; } -keepclassmembers interface com.clj.fastble.callback.** { ; } -keep class * implements com.clj.fastble.callback.BleGattCallback { *; } -keep class * implements com.clj.fastble.callback.BleScanCallback { *; } -keep class * implements com.clj.fastble.callback.BleNotifyCallback { *; } -keep class * implements com.clj.fastble.callback.BleWriteCallback { *; } -keep class * implements com.clj.fastble.callback.BleReadCallback { *; } -keep class * implements com.clj.fastble.callback.BleIndicateCallback { *; } # 控制器核心类额外 keep # 说明:BluetoothBLEManager 类不存在于当前 FastBle 代码中,已移除(之前是误加的) -keep class com.clj.fastble.BleManager { *; } -keep class com.clj.fastble.bluetooth.BleBluetooth { *; } -keep class com.clj.fastble.bluetooth.MultipleBluetoothController { *; } -keep class com.clj.fastble.bluetooth.BleConnector { *; } -keep class com.clj.fastble.scan.BleScanner { *; } -keep class com.clj.fastble.scan.BleScanPresenter { *; } -keep class com.clj.fastble.scan.BleScanRuleConfig { *; } -keep class com.clj.fastble.utils.BleLog { *; } -dontwarn com.clj.fastble.** -dontwarn android.bluetooth.** -dontwarn java.lang.reflect.** # ============================== # 子模块 2:easyPhotos(图片选择库)及其依赖的 PhotoView / SubsamplingScaleImageView # 强化:自定义 View 构造函数 + Parcelable + 内部类 + Handler + 反射 # ============================== -keep class com.huantansheng.easyphotos.** { *; } -keepclassmembers class com.huantansheng.easyphotos.** { public (...); protected (...); ; ; } # easyPhotos 自定义 View(XML 反射实例化)保留构造函数 -keepclassmembers class com.huantansheng.easyphotos.** extends android.view.View { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (android.content.Context, android.util.AttributeSet, int, int); void set*(***); *** get*(); } -keepclassmembers class com.huantansheng.easyphotos.** extends android.view.ViewGroup { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (android.content.Context, android.util.AttributeSet, int, int); } # easyPhotos 的 Activity/Fragment(AndroidManifest 注册 & XML 引用) -keep public class * extends androidx.fragment.app.FragmentActivity -keep public class * extends androidx.appcompat.app.AppCompatActivity -keep public class * extends androidx.fragment.app.Fragment # easyPhotos Handler/内部类 -keepattributes InnerClasses,EnclosingMethod -keep class com.huantansheng.easyphotos.**$* { *; } -keepclassmembers class com.huantansheng.easyphotos.**$* { (...); ; ; } # easyPhotos Parcelable -keepclassmembers class com.huantansheng.easyphotos.** implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; public static final android.os.Parcelable$ClassLoaderCreator *; public (android.os.Parcel); public void writeToParcel(android.os.Parcel, int); public int describeContents(); } # Dave Morrissey SubsamplingScaleImageView(长图查看器,自定义 View + 手势) # 说明: # - 已通过 -keep class com.davemorrissey.labs.subscaleview.** { *; } 全量 keep 所有成员 # - 下面 -keepclassmembers class * extends SubsamplingScaleImageView 属于冗余规则,且 IDE 对 external aar 依赖可能解析不到类名(误报 Unresolved) # - 因此删除冗余 extends 规则,仅保留 dontwarn(防止 ProGuard 找不到第三方类的警告) -keep class com.davemorrissey.labs.subscaleview.** { *; } -keepclassmembers class com.davemorrissey.labs.subscaleview.** { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (...); ; ; } -dontwarn com.davemorrissey.labs.subscaleview.** # Chris Banes PhotoView(图片缩放,自定义 View + 手势检测器) -keep class com.github.chrisbanes.photoview.** { *; } -keepclassmembers class com.github.chrisbanes.photoview.** { public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public (...); ; ; } -dontwarn com.github.chrisbanes.photoview.** -dontwarn com.huantansheng.easyphotos.** # ============================== # 子模块 3:easysocket(蓝牙/通用 Socket 通信协议库) # 强化:Parcelable + 接口回调 + 内部类 + Handler + 反射 + OkIO # ============================== -keep class com.easysocket.** { *; } -keepclassmembers class com.easysocket.** { public (...); protected (...); ; ; } # easysocket 回调接口保留(避免动态代理/反射查找失败) -keep interface com.easysocket.** { *; } -keepclassmembers interface com.easysocket.** { ; } -keep class * implements com.easysocket.interfaces.** { *; } # easysocket Parcelable/Serializable -keepclassmembers class com.easysocket.** implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; public static final android.os.Parcelable$ClassLoaderCreator *; public (android.os.Parcel); public void writeToParcel(android.os.Parcel, int); public int describeContents(); } -keepclassmembers class com.easysocket.** implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient ; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # easysocket Handler/消息分发(内部类 handleMessage) -keep class com.easysocket.**$* { *; } -keepclassmembers class com.easysocket.**$* { (...); ; ; } -keepattributes InnerClasses,EnclosingMethod,Signature,*Annotation* -dontwarn com.easysocket.** -dontwarn okio.** -dontwarn org.jetbrains.annotations.** # ============================== # 测试相关(禁止对测试相关包警告) # ============================== -dontnote junit.framework.** -dontnote junit.runner.** -dontwarn android.test.** -dontwarn android.support.test.** -dontwarn org.junit.** # ============================== # 移除冗余日志(只移除 v/d/i,保留 w 和 e!!错误日志不能删) # ============================== -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int d(...); public static int i(...); } # ============================== # 混淆产物输出(方便分析映射关系) # ============================== -printmapping proguardMapping.txt -printseeds proguardSeeds.txt -printusage proguardUsage.txt