日期:2026-07-31
状态:已实施,待实机压力验收
在无法修改 DeviceSDK-80.1.10.12.20260129.aar 的前提下,主页进入后台时不再停止或重建 SDK 接收线程,也不再直接修改 SDK 的 mReadThread、mCacheLen 和 isListening。应用只解绑业务监听器,返回主页时重新绑定监听器并复用原接收线程。
该方案从应用侧移除了导致 mCacheLen 被并发改成 -29 的写入路径,同时保留设置页通过现有串口输出流发送红外命令的能力。
目标版本为 2.3.5,设备为 Android 11、arm64-v8a。核心崩溃为:
ArrayIndexOutOfBoundsException: dstPos=-29 length=1024 PC681ScaleManager.addDataToCache(...)
mCacheLen 管理串口缓存。pause() 与 SDK 接收线程并发清零缓存,可产生 0 - 29 = -29。stopListening() 会关闭输入输出流,设置页需要保留输出流。release() 存在 JNI 字段契约风险,不能用于普通页面切换。HomeActivity.onStop() 继续调用封装层 pause()。pause() 只将 hardwareListener 置空。hardwareListener 增加 volatile,保证跨线程绑定和解绑的可见性。
volatile。pause() 改为只解绑业务监听。YoukateHardwareManagerPauseTest 回归测试。未修改 AAR、主页业务流程、设置页命令协议或资源文件。
回归测试在旧实现上先失败,失败点为旧 pause() 修改了 SDK 监听状态;修改后同一定向测试通过。
JAVA_HOME=$(/usr/libexec/java_home -v 1.8) \ ./gradlew --no-daemon :app:testDebugUnitTest :app:assembleDebug --console=plain
结果:BUILD SUCCESSFUL in 38s。本地单元测试 13 项,0 失败、0 错误、0 跳过;Debug APK 已生成。
dstPos=-29 崩溃。代码回归测试、全量单元测试和 Debug 构建已通过。硬件并发时序无法由本地 JVM 完整模拟,最终结论需实机压力测试确认。