From 544515feba82d65c35e919631ba4961f9c437099 Mon Sep 17 00:00:00 2001 From: QIU Date: Tue, 4 Aug 2026 04:56:41 +0000 Subject: [PATCH] fix(cw): restore app label, fix R8 code stripping, force 32-bit ABI Three release-breaking issues found in the v4.5.0 APK (app crashed on launch, label showed "Morse Expert", dex shrank to 282KB vs 3.5MB): 1. app_name: the ported app_values.xml shipped a "Morse Expert" app_name string which overrode Look4Sat Pro's label during resource merging - removed (no other string collisions). 2. R8 stripped nearly all code: the in-app sun.misc.Unsafe/Cleaner stubs clashed with android.jar library classes. Moved stubs to com.rtbishop.look4sat.feature.cw.suncompat and updated k3.d/s/r imports (k3.r keeps the reflective Class.forName("sun.misc.Unsafe") string, which returns null on Android hidden-API limits). 3. proguard-rules.pro added (AGP 9 variant-level CanProduceConsumerProguardFiles): keep pas.** (JNI RegisterNatives resolves by class name) plus all ported CW classes. 4. app-level ndk abiFilters forced to armeabi-v7a: the ported libnativedecoderjni.so is v7a-only, so a multi-ABI APK would crash with UnsatisfiedLinkError on arm64 devices. Verified: :feature:cw:compileDebugKotlin BUILD SUCCESSFUL. --- app/build.gradle.kts | 7 +++++ feature/cw/build.gradle.kts | 13 ++++++++ feature/cw/proguard-rules.pro | 31 +++++++++++++++++++ .../feature/cw/suncompat}/Cleaner.java | 2 +- .../feature/cw/suncompat}/Unsafe.java | 2 +- feature/cw/src/main/java/k3/d.java | 2 +- feature/cw/src/main/java/k3/r.java | 2 +- feature/cw/src/main/java/k3/s.java | 4 +-- feature/cw/src/main/res/values/app_values.xml | 1 - 9 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 feature/cw/proguard-rules.pro rename feature/cw/src/main/java/{sun/misc => com/rtbishop/look4sat/feature/cw/suncompat}/Cleaner.java (85%) rename feature/cw/src/main/java/{sun/misc => com/rtbishop/look4sat/feature/cw/suncompat}/Unsafe.java (98%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 85667cdf..9d1381c3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,6 +11,13 @@ val keystoreProperties = Properties().apply { } android { + // CW 解码 native 库仅 armeabi-v7a(照搬 Morse Expert 1.15): 全 ABI 打包会在 + // arm64 设备 loadLibrary 失败, 强制 32 位兼容(用户设备为 32 位软件) + defaultConfig { + ndk { + abiFilters += listOf("armeabi-v7a") + } + } signingConfigs { if (keystoreProperties["storeFile"] != null) { create("release") { diff --git a/feature/cw/build.gradle.kts b/feature/cw/build.gradle.kts index 9da47f26..3a781ca9 100644 --- a/feature/cw/build.gradle.kts +++ b/feature/cw/build.gradle.kts @@ -1,3 +1,6 @@ +import com.android.build.api.dsl.LibraryExtension +import com.android.build.api.variant.CanProduceConsumerProguardFiles + plugins { alias(libs.plugins.convention.featurePlugin) } @@ -15,6 +18,16 @@ android { } } +// CW 类保持规则(JNI 按类名注册 + 照搬混淆类保逻辑), 由 app 的 R8 消费 +// AGP 9: consumer 规则走 variant 级 CanProduceConsumerProguardFiles +androidComponents { + onVariants(selector().all()) { variant -> + (variant as? CanProduceConsumerProguardFiles)?.consumerProguardFiles?.add( + project.layout.projectDirectory.file("proguard-rules.pro") + ) + } +} + dependencies { implementation("androidx.constraintlayout:constraintlayout:2.2.1") } diff --git a/feature/cw/proguard-rules.pro b/feature/cw/proguard-rules.pro new file mode 100644 index 00000000..28fe39ab --- /dev/null +++ b/feature/cw/proguard-rules.pro @@ -0,0 +1,31 @@ +# Look4Sat Pro — CW 解码模块(照搬 Morse Expert 1.15)混淆规则 +# 所有 CW 类保持原名: pas.* 通过 RegisterNatives 按类名注册 JNI(混淆即崩); +# 其余为照搬的混淆名类(命名已无混淆意义, 保持以保逻辑完整)。 + +# JNI 引擎(RegisterNatives 按类名/方法名查表) +-keep class pas.** { *; } + +# 照搬的解码/UI 类(全部保持) +-keep class com.ve3nea.morse_expert.** { *; } +-keep class H2.** { *; } +-keep class I2.b { *; } +-keep class J2.** { *; } +-keep class k3.** { *; } +-keep class i3.** { *; } +-keep class g3.** { *; } +-keep class j3.** { *; } +-keep class s.** { *; } +-keep class d1.AbstractC1518b { *; } +-keep class B0.b { *; } +-keep class B.RunnableC0001b { *; } +-keep class D.n { *; } +-keep class E2.g { *; } +-keep class F2.a { *; } +-keep class I0.d { *; } +-keep class K1.a { *; } +-keep class j1.C1646n { *; } + +# sun.misc stub(Android 无此类, 仅编译期; 防止 R8 异常处理) +-dontwarn sun.misc.** +-keep class sun.misc.Unsafe { *; } +-keep class sun.misc.Cleaner { *; } diff --git a/feature/cw/src/main/java/sun/misc/Cleaner.java b/feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Cleaner.java similarity index 85% rename from feature/cw/src/main/java/sun/misc/Cleaner.java rename to feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Cleaner.java index dc981f5f..d6e10aaf 100644 --- a/feature/cw/src/main/java/sun/misc/Cleaner.java +++ b/feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Cleaner.java @@ -1,4 +1,4 @@ -package sun.misc; +package com.rtbishop.look4sat.feature.cw.suncompat; /** * 编译期 stub:Android 无 sun.misc.Cleaner(照搬 Morse Expert 1.15 k3 FFT 库的清理回调, diff --git a/feature/cw/src/main/java/sun/misc/Unsafe.java b/feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Unsafe.java similarity index 98% rename from feature/cw/src/main/java/sun/misc/Unsafe.java rename to feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Unsafe.java index cf8f389e..fc90ae2f 100644 --- a/feature/cw/src/main/java/sun/misc/Unsafe.java +++ b/feature/cw/src/main/java/com/rtbishop/look4sat/feature/cw/suncompat/Unsafe.java @@ -1,4 +1,4 @@ -package sun.misc; +package com.rtbishop.look4sat.feature.cw.suncompat; /** * 编译期 stub:Android 无 sun.misc.Unsafe(运行时通过反射获取,失败时 k3.r.f12109a 为 null)。 diff --git a/feature/cw/src/main/java/k3/d.java b/feature/cw/src/main/java/k3/d.java index 50b490f5..06bd755f 100644 --- a/feature/cw/src/main/java/k3/d.java +++ b/feature/cw/src/main/java/k3/d.java @@ -1,6 +1,6 @@ package k3; -import sun.misc.Cleaner; +import com.rtbishop.look4sat.feature.cw.suncompat.Cleaner; /* loaded from: classes.dex */ public final class d extends g { diff --git a/feature/cw/src/main/java/k3/r.java b/feature/cw/src/main/java/k3/r.java index a53ffe1a..fa9bbf88 100644 --- a/feature/cw/src/main/java/k3/r.java +++ b/feature/cw/src/main/java/k3/r.java @@ -3,7 +3,7 @@ package k3; import java.lang.reflect.Field; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import sun.misc.Unsafe; +import com.rtbishop.look4sat.feature.cw.suncompat.Unsafe; /* loaded from: classes.dex */ public abstract class r { diff --git a/feature/cw/src/main/java/k3/s.java b/feature/cw/src/main/java/k3/s.java index 333b9f81..e0176656 100644 --- a/feature/cw/src/main/java/k3/s.java +++ b/feature/cw/src/main/java/k3/s.java @@ -2,8 +2,8 @@ package k3; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import sun.misc.Cleaner; -import sun.misc.Unsafe; +import com.rtbishop.look4sat.feature.cw.suncompat.Cleaner; +import com.rtbishop.look4sat.feature.cw.suncompat.Unsafe; /* loaded from: classes.dex */ public final class s extends g { diff --git a/feature/cw/src/main/res/values/app_values.xml b/feature/cw/src/main/res/values/app_values.xml index f032936d..49c0e442 100644 --- a/feature/cw/src/main/res/values/app_values.xml +++ b/feature/cw/src/main/res/values/app_values.xml @@ -2,7 +2,6 @@ #ff6200ee 18 - Morse Expert Idle Waterfall display Frequency scale