From aac4bd7baa118342c79af6f8b0e05835ba07bb33 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 23 Jun 2026 13:35:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(proguard):=20=E5=90=84=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=BC=80=E5=90=AF=20R8=20=E6=B7=B7=E6=B7=86=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20proguard-rules.pro=20=E4=BF=9D=E7=95=99=E5=85=AC?= =?UTF-8?q?=E5=BC=80=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- sdk-bugcollect/build.gradle.kts | 16 +++++++++++++++- sdk-bugcollect/consumer-rules.pro | 8 ++++++++ sdk-bugcollect/proguard-rules.pro | 22 ++++++++++++++++++++++ sdk-core/build.gradle.kts | 10 ++++++++++ sdk-core/proguard-rules.pro | 29 +++++++++++++++++++++++++++++ sdk-im/build.gradle.kts | 10 ++++++++++ sdk-im/proguard-rules.pro | 11 +++++++++++ sdk-license/build.gradle.kts | 10 ++++++++++ sdk-license/proguard-rules.pro | 15 +++++++++++++++ sdk-push/build.gradle.kts | 10 ++++++++++ sdk-push/proguard-rules.pro | 13 +++++++++++++ sdk-update/build.gradle.kts | 10 ++++++++++ sdk-update/proguard-rules.pro | 11 +++++++++++ sdk-webview/build.gradle.kts | 10 ++++++++++ sdk-webview/proguard-rules.pro | 8 ++++++++ 15 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 sdk-bugcollect/consumer-rules.pro create mode 100644 sdk-bugcollect/proguard-rules.pro create mode 100644 sdk-core/proguard-rules.pro create mode 100644 sdk-im/proguard-rules.pro create mode 100644 sdk-license/proguard-rules.pro create mode 100644 sdk-push/proguard-rules.pro create mode 100644 sdk-update/proguard-rules.pro create mode 100644 sdk-webview/proguard-rules.pro diff --git a/sdk-bugcollect/build.gradle.kts b/sdk-bugcollect/build.gradle.kts index f0dc9ec..59aa3d6 100644 --- a/sdk-bugcollect/build.gradle.kts +++ b/sdk-bugcollect/build.gradle.kts @@ -8,7 +8,21 @@ group = rootProject.group android { namespace = "com.xuqm.sdk.bugcollect" compileSdk = 36 - defaultConfig { minSdk = 24 } + defaultConfig { + minSdk = 24 + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + publishing { singleVariant("release") { withSourcesJar() } } compileOptions { diff --git a/sdk-bugcollect/consumer-rules.pro b/sdk-bugcollect/consumer-rules.pro new file mode 100644 index 0000000..a12c880 --- /dev/null +++ b/sdk-bugcollect/consumer-rules.pro @@ -0,0 +1,8 @@ +# BugCollect is accessed via reflection from sdk-webview — keep in consuming app +-keep class com.xuqm.sdk.bugcollect.BugCollect { + public *; + static ; +} +-keep public class com.xuqm.sdk.bugcollect.LogLevel { public *; } +-keep public class com.xuqm.sdk.bugcollect.Breadcrumb { public *; } +-keep public class com.xuqm.sdk.bugcollect.FunnelTracker { public *; } diff --git a/sdk-bugcollect/proguard-rules.pro b/sdk-bugcollect/proguard-rules.pro new file mode 100644 index 0000000..2389d6c --- /dev/null +++ b/sdk-bugcollect/proguard-rules.pro @@ -0,0 +1,22 @@ +# BugCollect object: accessed via reflection from sdk-webview (captureError, INSTANCE) +-keep class com.xuqm.sdk.bugcollect.BugCollect { + public *; + static ; +} + +# Public types passed to / returned from BugCollect public API +-keep public class com.xuqm.sdk.bugcollect.Breadcrumb { public *; } +-keep public class com.xuqm.sdk.bugcollect.LogLevel { public *; } +-keep public class com.xuqm.sdk.bugcollect.IssueEvent { *; } +-keep public class com.xuqm.sdk.bugcollect.LogEvent { *; } +-keep public class com.xuqm.sdk.bugcollect.FunnelTracker { public *; } + +# ContentProvider: class name referenced in AndroidManifest — must not be renamed +-keep class com.xuqm.sdk.bugcollect.internal.BugCollectInitProvider + +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod + +# Gson field names in log payloads +-keepclassmembers class com.xuqm.sdk.bugcollect.** { + @com.google.gson.annotations.SerializedName ; +} diff --git a/sdk-core/build.gradle.kts b/sdk-core/build.gradle.kts index 2c1e7b4..fd6e706 100644 --- a/sdk-core/build.gradle.kts +++ b/sdk-core/build.gradle.kts @@ -19,6 +19,16 @@ android { consumerProguardFiles("consumer-rules.pro") } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-core/proguard-rules.pro b/sdk-core/proguard-rules.pro new file mode 100644 index 0000000..0f358d1 --- /dev/null +++ b/sdk-core/proguard-rules.pro @@ -0,0 +1,29 @@ +# ── Public API entry points ─────────────────────────────────────────────────── +-keep public class com.xuqm.sdk.XuqmSDK { public *; } +-keep public class com.xuqm.sdk.XuqmLoginSession { public *; } +-keep public class com.xuqm.sdk.XuqmUserInfo { public *; } +-keep public class com.xuqm.sdk.core.** { public *; } +-keep public class com.xuqm.sdk.file.FileSDK { public *; } +-keep public class com.xuqm.sdk.file.FileUploadResult { public *; } + +# Compose UI components referenced directly by consumers +-keep public class com.xuqm.sdk.ui.** { public *; } + +# ContentProviders: class names referenced in AndroidManifest — must not be renamed +-keep class com.xuqm.sdk.internal.XuqmInitializerProvider +-keep class com.xuqm.sdk.internal.XuqmMergedProvider + +# Kotlin & Annotation metadata +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod + +# Kotlinx serialization +-keepclassmembers @kotlinx.serialization.Serializable class ** { *; } +-keep class kotlinx.serialization.** { *; } + +# Gson field names used in network models +-keepclassmembers class com.xuqm.sdk.** { + @com.google.gson.annotations.SerializedName ; +} + +# Retrofit: keep service interfaces +-keep,allowobfuscation interface com.xuqm.sdk.network.** { *; } diff --git a/sdk-im/build.gradle.kts b/sdk-im/build.gradle.kts index d3f702a..073dc97 100644 --- a/sdk-im/build.gradle.kts +++ b/sdk-im/build.gradle.kts @@ -17,6 +17,16 @@ android { consumerProguardFiles("consumer-rules.pro") } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-im/proguard-rules.pro b/sdk-im/proguard-rules.pro new file mode 100644 index 0000000..5ba1b2e --- /dev/null +++ b/sdk-im/proguard-rules.pro @@ -0,0 +1,11 @@ +# Public API +-keep public class com.xuqm.sdk.im.ImSDK { public *; } +-keep public class com.xuqm.sdk.im.model.** { public *; } +-keep public interface com.xuqm.sdk.im.listener.** { public *; } + +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod + +# IM message payloads use Gson +-keepclassmembers class com.xuqm.sdk.im.** { + @com.google.gson.annotations.SerializedName ; +} diff --git a/sdk-license/build.gradle.kts b/sdk-license/build.gradle.kts index 879d964..c013c88 100644 --- a/sdk-license/build.gradle.kts +++ b/sdk-license/build.gradle.kts @@ -18,6 +18,16 @@ android { consumerProguardFiles("consumer-rules.pro") } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-license/proguard-rules.pro b/sdk-license/proguard-rules.pro new file mode 100644 index 0000000..71fcb6b --- /dev/null +++ b/sdk-license/proguard-rules.pro @@ -0,0 +1,15 @@ +# Public API +-keep public class com.xuqm.sdk.license.LicenseSDK { public *; } +-keep public interface com.xuqm.sdk.license.LicenseCallback { public *; } +-keep public class com.xuqm.sdk.license.LicenseConfig { public *; } +-keep public class com.xuqm.sdk.license.LicenseResult { public *; } +-keep public class com.xuqm.sdk.license.model.** { public *; } + +# ContentProvider: class name referenced in AndroidManifest — must not be renamed +-keep class com.xuqm.sdk.license.internal.LicenseInitializerProvider + +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod + +# Kotlinx serialization (used by this module) +-keepclassmembers @kotlinx.serialization.Serializable class ** { *; } +-keep class kotlinx.serialization.** { *; } diff --git a/sdk-push/build.gradle.kts b/sdk-push/build.gradle.kts index a304074..0c2003f 100644 --- a/sdk-push/build.gradle.kts +++ b/sdk-push/build.gradle.kts @@ -20,6 +20,16 @@ android { manifestPlaceholders["XUQM_HONOR_APP_ID"] = "" } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-push/proguard-rules.pro b/sdk-push/proguard-rules.pro new file mode 100644 index 0000000..c91109a --- /dev/null +++ b/sdk-push/proguard-rules.pro @@ -0,0 +1,13 @@ +# Public API entry point +-keep public class com.xuqm.sdk.push.PushSDK { public *; } +-keep public class com.xuqm.sdk.push.model.** { public *; } +-keep public class com.xuqm.sdk.push.PushNotificationChannelManager { public *; } + +# Service / Receiver classes registered in AndroidManifest — must NOT be renamed +-keep class com.xuqm.sdk.push.fcm.XuqmFirebaseMessagingService +-keep class com.xuqm.sdk.push.honor.XuqmHonorPushService +-keep class com.xuqm.sdk.push.huawei.XuqmHuaweiPushService +-keep class com.xuqm.sdk.push.xiaomi.XuqmXiaomiPushReceiver +-keep class com.xuqm.sdk.push.vivo.XuqmVivoPushReceiver + +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod diff --git a/sdk-update/build.gradle.kts b/sdk-update/build.gradle.kts index aa11e7c..3200e73 100644 --- a/sdk-update/build.gradle.kts +++ b/sdk-update/build.gradle.kts @@ -17,6 +17,16 @@ android { consumerProguardFiles("consumer-rules.pro") } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-update/proguard-rules.pro b/sdk-update/proguard-rules.pro new file mode 100644 index 0000000..7796794 --- /dev/null +++ b/sdk-update/proguard-rules.pro @@ -0,0 +1,11 @@ +# Public API +-keep public class com.xuqm.sdk.update.UpdateSDK { public *; } +-keep public interface com.xuqm.sdk.update.UpdateListener { public *; } +-keep public class com.xuqm.sdk.update.model.** { public *; } + +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod + +# Gson model fields in update info payload +-keepclassmembers class com.xuqm.sdk.update.** { + @com.google.gson.annotations.SerializedName ; +} diff --git a/sdk-webview/build.gradle.kts b/sdk-webview/build.gradle.kts index 247d35a..463f4ca 100644 --- a/sdk-webview/build.gradle.kts +++ b/sdk-webview/build.gradle.kts @@ -18,6 +18,16 @@ android { consumerProguardFiles("consumer-rules.pro") } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 diff --git a/sdk-webview/proguard-rules.pro b/sdk-webview/proguard-rules.pro new file mode 100644 index 0000000..29f49c8 --- /dev/null +++ b/sdk-webview/proguard-rules.pro @@ -0,0 +1,8 @@ +# All webview classes are public API consumed directly by app code +-keep public class com.xuqm.sdk.webview.** { public *; } + +# XWebViewActivity is registered in AndroidManifest — must not be renamed +-keep class com.xuqm.sdk.webview.XWebViewActivity + +# Compose @Composable functions require annotation and signature retention +-keepattributes *Annotation*, Signature, InnerClasses, EnclosingMethod