# 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 <fields>;
    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 {
    <fields>;
}

# ==============================
# 网络层 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<INetworkService> 的泛型签名
-keep,allowshrinking class * extends com.abbidot.baselibrary.network.base.BaseNetworkApi
# BaseResponse<T> 网络响应泛型基类（Gson 反序列化核心）
-keep class com.abbidot.baselibrary.network.base.BaseResponse { *; }
-keepclassmembers class * extends com.abbidot.baselibrary.network.base.BaseResponse {
    <fields>;
    <init>(...);
}
# 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 <methods>;
    @retrofit2.http.* <methods>;
}
# 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.* <methods>; }
-keep,allowobfuscation interface * { <methods>; }
-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 {
    <init>(...);
    java.lang.reflect.Type getType();
}
# 保留 @SerializedName / @Expose 标记的字段
-keepclassmembers,allowshrinking,allowobfuscation class * {
    @com.google.gson.annotations.SerializedName <fields>;
    @com.google.gson.annotations.Expose <fields>;
}
-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 *;
    <init>(android.os.Parcel);
    <init>(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 { <fields>; <methods>; }
-keepclassmembers class **$Parceler { <fields>; <methods>; }
-dontwarn kotlinx.parcelize.**

# BaseDiffBean：列表 DiffUtil 比较基类（PetBean 等继承）
-keep class com.abbidot.tracker.base.BaseDiffBean { *; }
-keepclassmembers class * extends com.abbidot.tracker.base.BaseDiffBean {
    <init>(...);
    <fields>;
    <methods>;
}

# ==============================
# ViewModel：by viewModels() / Hilt / SavedStateHandle 反射创建
# ==============================
-keep class * extends androidx.lifecycle.ViewModel { *; }
-keepclassmembers class * extends androidx.lifecycle.ViewModel {
    public <init>(...);
    protected <init>(...);
    <fields>;
    <methods>;
}
# ViewModelProvider.Factory：反射创建 ViewModel 的工厂接口（内部类用 $ 分隔）
-keep class * implements androidx.lifecycle.ViewModelProvider$Factory { *; }
-keepclassmembers class * implements androidx.lifecycle.ViewModelProvider$Factory {
    public <init>(...);
    <fields>;
    <methods>;
}
# 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.** {
    <fields>;
    <methods>;
}
-dontwarn kotlinx.coroutines.**
-dontwarn kotlin.coroutines.**

# ==============================
# Kotlin 伴生对象 / 单例 INSTANCE：ViewUtil.instance / SRBleUtil.instance / ConstantString.Companion 等
# ==============================
-keepclassmembers class **$Companion {
    <fields>;
    <methods>;
    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 <init>(...);
    <fields>;
    <methods>;
    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 *;
    <fields>;
    <methods>;
}

# ==============================
# 自定义 View/控件（37个：TrackLineView、VerifyEditText、MyBluetoothAnimView 等，所有 XML inflate）
# ==============================
-keep class com.abbidot.tracker.widget.** { *; }
-keepclassmembers class com.abbidot.tracker.widget.** {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(android.content.Context, android.util.AttributeSet, int, int);
    public <init>(...);
    <fields>;
    <methods>;
    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 <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(android.content.Context, android.util.AttributeSet, int, int);
    void set*(***);
    *** get*();
}
#
# 规则 2：所有继承 ViewGroup / Layout / 常用容器的类同样保留构造
-keepclassmembers class * extends android.view.ViewGroup {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(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 <init>(...);
    <fields>;
    <methods>;
}
-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 <init>(...);
    <fields>;
    <methods>;
}
#
# 规则 5：AndroidX FlexboxLayout（自定义 ViewGroup）
-keep class com.google.android.flexbox.** { *; }
-keepclassmembers class com.google.android.flexbox.** {
    public <init>(...);
    <fields>;
    <methods>;
}
-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 <init>(...);
    protected <init>(...);
    <fields>;
    <methods>;
}

# 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 <init>(android.os.Parcel);
  public <init>(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;
    <init>(...);
}
-keep class com.clj.fastble.scan.BleScanner$BleScannerHolder { *; }
-keepclassmembers class com.clj.fastble.scan.BleScanner$BleScannerHolder {
    static com.clj.fastble.scan.BleScanner sBleScanner;
    <init>(...);
}

# 内部类+匿名内部类（禁止 class merging）
-keepattributes InnerClasses,EnclosingMethod
-keep class com.clj.fastble.**$* { *; }
-keepclassmembers class com.clj.fastble.**$* {
    <init>(...);
    <fields>;
    <methods>;
}

# 反射支持（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.** { <methods>; }
-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 <init>(...);
    protected <init>(...);
    <fields>;
    <methods>;
}
# easyPhotos 自定义 View（XML 反射实例化）保留构造函数
-keepclassmembers class com.huantansheng.easyphotos.** extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(android.content.Context, android.util.AttributeSet, int, int);
    void set*(***);
    *** get*();
}
-keepclassmembers class com.huantansheng.easyphotos.** extends android.view.ViewGroup {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(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.**$* {
    <init>(...);
    <fields>;
    <methods>;
}
# 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 <init>(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 <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(...);
    <fields>;
    <methods>;
}
-dontwarn com.davemorrissey.labs.subscaleview.**

# Chris Banes PhotoView（图片缩放，自定义 View + 手势检测器）
-keep class com.github.chrisbanes.photoview.** { *; }
-keepclassmembers class com.github.chrisbanes.photoview.** {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public <init>(...);
    <fields>;
    <methods>;
}
-dontwarn com.github.chrisbanes.photoview.**
-dontwarn com.huantansheng.easyphotos.**

# ==============================
# 子模块 3：easysocket（蓝牙/通用 Socket 通信协议库）
# 强化：Parcelable + 接口回调 + 内部类 + Handler + 反射 + OkIO
# ==============================
-keep class com.easysocket.** { *; }
-keepclassmembers class com.easysocket.** {
    public <init>(...);
    protected <init>(...);
    <fields>;
    <methods>;
}
# easysocket 回调接口保留（避免动态代理/反射查找失败）
-keep interface com.easysocket.** { *; }
-keepclassmembers interface com.easysocket.** { <methods>; }
-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 <init>(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 <fields>;
    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.**$* {
    <init>(...);
    <fields>;
    <methods>;
}
-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
