mckero
3e25e1aa2f
fix(cw): keep ai.onnxruntime.** through R8 to stop native crash
...
根因定位(确定性): release 构建开启 R8 混淆 (convention 插件的
PluginSetupUtils 设 isMinifyEnabled=true), 但 onnxruntime-android 的 AAR
不含 proguard consumer rules (仅 aar-metadata.properties)。于是 R8 把
ai.onnxruntime.* 的类重命名/裁剪, 而 ONNX Runtime 的 Java 绑定走 JNI、
native 侧按原始类名/方法名解析 —— 类名对不上即 native 崩溃, 不产生
任何 Java 堆栈, 正好解释"闪退回桌面、无任何日志"。
此前的所有内存/线程修复都无效, 因为崩溃点根本不在 Java 层。
修复:
1. app/proguard-rules.pro 新增 (ONNX Runtime 官方文档要求):
-keep class ai.onnxruntime.** { *; }
-dontwarn ai.onnxruntime.**
2. app/build.gradle.kts 的 release buildType 引用该规则文件。
3. onnxruntime 1.28.0 -> 1.25.1: 1.28.0 为 2026-07-25 发布(仅三周),
1.25.1 更成熟; 同时排除 SIGILL 类骁龙 bug (该 bug 在 1.24.4 修复,
Android AAR 对应 1.25.0+)。
验证: 服务器完整管线 (真实20s音频->频谱->ONNX->CTC) 解码逐字符正确,
与手机端同一份代码逻辑。R8 keep 规则为官方文档明确要求项。
2026-08-13 03:46:14 +00:00
mckero
5f297f9233
fix(cw): stop the waterfall crashing and cut APK size by 87MB
...
三个真机实测暴露的问题:
1. 闪退 (给权限后 3-4 秒必崩, 且注入日志抓不到堆栈)
CwWaterfallState 用 mutableIntStateOf 记录重绘版本号, 却从音频采集线程
写入。Compose 快照状态只能在合成线程修改, 从后台线程写会在运行时崩溃 ——
崩在 Compose 内部, 所以业务类的日志注入抓不到。
改用 MutableStateFlow (本身线程安全), Canvas 侧 collectAsState 读取。
2. 同一状态的跨线程数据竞争
pushSamples 在采集线程写 rows/pending, snapshot() 在绘制线程读, 而
ArrayDeque 非线程安全 —— 并发 removeFirst()/toList() 会抛
ConcurrentModificationException 或 IndexOutOfBoundsException。
两侧统一加锁; FFT 计算放在锁外, 只有队列追加持锁。
3. APK 从 8.4MB 暴涨到 135MB
onnxruntime-android 的 AAR 自带 4 个架构原生库: arm64 28M + armv7 20M +
x86 33M + x86_64 34M = 115MB。上次提交移除 abiFilters 时把 x86 系列也
打包了进去 (仅模拟器需要)。
重新加上 abiFilters, 保留 arm64-v8a + armeabi-v7a 两个真机 ABI,
预计降至约 43MB。注意这与上次"恢复 64 位"不冲突: 那次删的是只留
armeabi-v7a 的限制, 这次是排除 x86 系列。
另外两处加固:
- CwDeepDecoder 的模型加载从 init{} 移入惰性 ensureLoaded(): 加载会触发
ONNX Runtime 原生库装载, 失败时抛 UnsatisfiedLinkError; 在构造函数中抛出
会连带崩掉创建它的 composable, try-catch 也救不回来。移到首次使用时执行,
失败经 errorMessage 上报给 UI。
- ONNX 会话限制 intraOp 线程数为 (核数-1) 且上限 4, 给音频采集和 UI 留出
余量, 默认行为会铺满所有核心。
验证:
./gradlew :feature:cw:compileDebugKotlin :core:data:compileDebugKotlin => 通过
./gradlew :core:domain:test => 79 个测试全绿
2026-08-12 13:55:03 +00:00
mckero
86ab1b26b7
feat(cw): vendor DeepCW ONNX model with full AGPL-3.0 compliance
...
背景:
DeepCW (e04/deepcw-engine) 是基于 CTC 的神经网络 CW 解码模型。本地实测
弱信号解码率显著优于传统 DSP 方案: SNR<0dB 时 CER 16.0% vs ggmorse 52.6%;
SNR>=0dB 时两者均接近 0%。模型 400-1200Hz 固定频窗自带定频, 无需频谱峰值
跟踪与噪声门。
改动:
- assets/deepcw/model.onnx 15,139,839 字节, 原样收录未作修改
- assets/deepcw/model.onnx.json 模型元数据 (采样率 3200, FFT 256, hop 48,
65 个频段, log1p 归一化, 42 类含 CTC blank)
- licenses/DeepCW-AGPL-3.0.txt AGPL-3.0 许可证全文
- licenses/NOTICE.md 来源仓库/作者/取用 commit/SHA-256/
许可证兼容性说明/复现步骤
- app/build.gradle.kts: androidResources.noCompress += "onnx"
关于 noCompress:
ONNX Runtime 通过 mmap 直接读取 assets, 压缩后无法内存映射, createSession
会失败。该配置只在打包 APK 的 app 模块生效, 在 feature 库模块声明无效。
许可证:
Look4Sat 为 GPL-3.0-or-later, DeepCW 模型为 AGPL-3.0-only。GPL v3 第 13 条
明确允许两者合并分发。推理完全在本地设备进行, 不通过网络向远程用户提供
模型功能, 故 AGPL 第 13 条的网络源码提供义务不被触发。本仓库公开, 完整
对应源码提供义务已满足。
上游取用 commit: 8e264d243bbd4467bd19f3f28292219405b47e0e
模型 SHA-256: ef120799457bca042d4690944f0faf93268eb4654e7f50f28784ad63bdc1fe02
2026-08-12 11:47:02 +00:00
mckero
de6c964136
build!: drop armeabi-v7a abiFilters, restore 64-bit builds
...
背景:
abiFilters=armeabi-v7a 的唯一成因是 Morse Expert 的 32 位
libnativedecoderjni.so, 该 .so 已在上一提交删除。此前整个应用被迫以
32 位运行: 64 位设备走兼容层、寻址受限, 且不满足应用市场的 64 位要求。
原注释称"用户设备为 32 位软件"已与实际不符 (测试机为 64 位)。
改动:
- app/build.gradle.kts: 移除 defaultConfig.ndk.abiFilters 及相关注释
- feature/cw/build.gradle.kts: 移除 abiFilters; 移除 constraintlayout 依赖
(仅被已删除的 activity_main.xml 使用); 移除 UTF-8 JavaCompile 配置
(模块已无 Java 源码)
- feature/cw 改为依赖 core:domain + core:data (DeepCW 前后处理落在 core)
验证:
grep -rn 'abiFilters|jniLibs' --include=*.kts . (排除 build/) => 无匹配
APK ABI 覆盖将在 CI 产物中验证 (预期含 arm64-v8a)
2026-08-12 11:44:54 +00:00
mckero
f7a3dbaa2d
fix(i18n): use AGP9 localeFilters for language keep-list
...
resourceConfigurations is rejected by AGP 9.3 ("When localeFilters
are specified, resourceConfigurations cannot include locale
qualifiers"). Switch to androidResources.localeFilters.
Verified: :app:mergeReleaseResources + :app:processReleaseResources
BUILD SUCCESSFUL.
2026-08-04 16:34:39 +00:00
mckero
c525f3a11f
fix(i18n): force-keep in/id locale configs via resourceConfigurations
...
Root cause of Indonesian not matching: release build has
isShrinkResources=true and R8 was dropping the Indonesian resource
configs entirely - aapt dump badging showed locales only
'--_--' es ru si tr uk zh (no in, no id). values-in/values-id were
merged at merge time but stripped before packaging.
Fix: explicit resourceConfigurations in app/build.gradle.kts keeping
en zh tr in id es ru si uk. Verified: :app:mergeReleaseResources
BUILD SUCCESSFUL.
2026-08-04 16:28:39 +00:00
mckero
544515feba
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.
2026-08-04 04:56:41 +00:00
mckero
7bb0bbbb46
build: load release signing config from local keystore.properties
...
Conditionally applies the BG7NTA signingConfig when keystore.properties exists (gitignored). CI signs via apksigner with GitHub Secrets, so this only affects local builds.
2026-08-03 09:25:53 +00:00
Arty Bishop
8c1df334d8
Added even more tweaks to convention plugins setup
2026-03-28 20:03:11 +00:00
Arty Bishop
082b52c58b
Added more tweaks to convention plugins setup
2026-03-18 15:59:55 +00:00
Arty Bishop
4d88214c1d
Added basic convention plugins setup for modularization
2026-03-01 20:02:30 +00:00
Arty Bishop
de99e09f5e
v4.1.0 - Remote freq control for Hamlib/SDR++, by londre7
2026-02-22 13:51:58 +00:00
Arty Bishop
7adbf951bc
v4.0.4 - R4UAB source priority, Chinese translation fixes
2026-02-14 14:12:36 +00:00
Arty Bishop
64137473b3
v4.0.3 - KeepScreenOn for RadarScreen, translation fixes
2026-02-10 15:25:28 +00:00
Arty Bishop
ed71c8148b
v4.0.2 - Custom data import by londre7, minor UI tweaks
2026-02-07 17:22:42 +00:00
Arty Bishop
8e42f81ea3
Added tweaks to components, updated dependencies
2026-02-07 12:30:46 +00:00
Arty Bishop
a6a59877a8
v4.0.1 - Hotfix for RadarScreen track projection display
2026-01-31 13:55:44 +00:00
Arty Bishop
9e765a3575
Added various tweaks to dependencies and translations
2026-01-16 14:59:21 +00:00
Arty Bishop
65a0c33007
Migrated AGP to v9.0.0, tweaked gradle.properties
2026-01-16 13:54:13 +00:00
Arty Bishop
c370d9febd
Added more tweaks to components and dependencies
2025-12-27 15:02:15 +00:00
Arty Bishop
a68e466040
Restructured SettingsScreen layout, tweaked components
2025-12-27 15:02:15 +00:00
Arty Bishop
bfbe437ab1
Cleaned up classes and resources, updated dependencies
2025-12-27 15:02:15 +00:00
Arty Bishop
10fc88364f
Integrated fixes from release v3.2.1, updated dependencies
2025-12-27 15:01:47 +00:00
Arty Bishop
aa9365b2fd
Updated to API 36 (Android 16), bumped dependencies
2025-12-27 15:01:47 +00:00
Arty Bishop
fcec36ec68
Updated dependencies and gradle plugin, minor fixes
2025-12-27 15:01:47 +00:00
Rico Beier-Grunwald
483d846233
Improvised solution to transmit frequencies to IC705
2025-12-27 15:01:47 +00:00
Arty Bishop
fdbdc513f1
Implemented a basic map data card on MapScreen
2025-12-27 15:01:47 +00:00
Arty Bishop
86512a44d2
Updated dependencies and gradle plugin, minor fixes
2025-12-27 15:01:47 +00:00
Arty Bishop
2b6a892a50
Updated dependencies and gradle plugin, minor fixes
2025-12-27 15:01:46 +00:00
Arty Bishop
630fa2877f
Integrated fixes from release v3.1.4 (leap year bug)
2025-12-27 15:01:46 +00:00
Arty Bishop
ae53e5dc35
Added minor fixes to EntriesDialog and passes view
2025-12-27 15:01:45 +00:00
Arty Bishop
213ac7c278
Switched to gradle version catalog for dependencies
2025-12-27 15:01:45 +00:00
Arty Bishop
a1d5cda998
Updated dependencies, bumped the minSdk to 26
2025-12-27 15:01:45 +00:00
Arty Bishop
a6b5498f55
Added type reset for satellite selection screen
2025-12-27 15:01:45 +00:00
Arty Bishop
4b63882c70
Fixed display and font size scaling for MainActivity
2025-12-27 15:01:45 +00:00
Arty Bishop
19d0c1b108
Added more frequency data fields to Radio class
2025-12-27 15:01:45 +00:00
Arty Bishop
b9ade5f243
Cleaned up SharedPreferences keys and values
2025-12-27 15:01:45 +00:00
Arty Bishop
e100484810
Updated gradle plugin, removed BuildConfig usages
2025-12-27 15:01:45 +00:00
Arty Bishop
dca3f2c773
Updated compileSdk and targetSdk to Android 14
2025-12-27 15:01:45 +00:00
Arty Bishop
fc0b995bac
Added various minor fixes, cleaned up classes
2025-12-27 15:01:45 +00:00
Arty Bishop
5a8108384f
Added minor fixes to resources and build scripts
2025-12-27 15:01:45 +00:00
Arty Bishop
7191e02f99
Updated gradle plugin and dependencies versions
2025-12-27 15:01:45 +00:00
Arty Bishop
1719f8cc2e
Updated gradle wrapper and cleaned up files
2025-12-27 15:01:45 +00:00
Arty Bishop
3580854479
Migrated project build files to use kotlin script
2025-12-27 15:01:45 +00:00