手机装上 Release 包,内嵌 Go 核心启动失败。我之前在模拟器上跑过不少测试,回头一查,那些测试连的是外部核心,包里的 ARM 核心还没真正走过这条启动流程。
最初我怀疑 R8 把桥接方法裁掉了,mapping 里也没找到预期入口。于是去翻最终 APK 的 DEX,结果方法就在里面,前后两个包都有。我沿着调用处继续查,才找到反射签名的参数类型。
gomobile 会把 Go 的 int 映射成 Java 的 long,原来的反射查找却写成了 int。方法名和参数数量都对,运行时依然找不到。
我改为直接调用生成的接口,把端口参数写成 0L:
Mobile.startWithParamsAndDirs(
endpoint, accessKey, secretKey, bucket,
useSsl, 0L, logDir, cacheDir
);这样参数类型不匹配就会在编译时暴露。Android Context 的初始化也补齐,ABI 检查放到原生调用前面。失败日志保留阶段和异常类型,连接凭据与密钥都不输出,界面再把异常转成启动提示。
重编 Release 后,我在实际 ARM 手机上安装,核对版本和签名,从手机本地端口读取核心与存储健康状态,再解锁、读远端目录、切文件列表和网格。这回包内核心才算真正跑通了。