问题表现:SDK内部崩溃。
log日志堆栈:
[DEBUG] Read self maps instead! map: 0x0 #00 pc 0000000000037aa4 /apex/com.android.runtime/lib64/bionic/libc.so (abort+180) #01 pc 000000000001ec70 /apex/com.android.runtime/lib64/bionic/libc.so (ifree+576) #02 pc 000000000001eeec /apex/com.android.runtime/lib64/bionic/libc.so (je_free+108) #03 pc 0000000000033c00 /data/app/~~p3uiA9tnE4Ux9994vj5M3w==/??/lib/arm64/libDWIMECore.so #04 pc 000000000003988c /data/app/~~p3uiA9tnE4Ux9994vj5M3w==/??/lib/arm64/libDWIMECore.so #05 pc 00000000000001b0 /data/app/~~p3uiA9tnE4Ux9994vj5M3w==/??/oat/arm64/base.odex
表面看起来是因为SDK内部内存操作出错了,经我们分析,是因为在某些情况下没有调用 appBinding 造成的。
解决办法:必须确保在init 前初调用一次appBinding。
在安卓系统里有些用户会在 Application 的 Create 方法调用一次 appBinding,其它地方不再调用。对于输入法这种做法可能会存在漏洞,输入法是一个Service,它很可能在某些特殊情况下没有启动 Application就启动了 Service。这种就造成使用SDK接口时 appBinding 并没有执行过,这样就引起了一些意外情况造成崩溃。
建议按以下方法改进一下,示例代码:
// 在调用 init 前就做一次调用。为了优化性能,可以做一下判断,避免重复调用 boolean m_appBinding = false; // 全局变量,做状态记录 void myAppBinding() { if (!m_appBinding) { appBinding(参数); m_appBinding = true; } } void initPY() { // 先尝试调用 appBinding myAppBinding(); // 初始化输入模式 init(lang, kbType, im); }
PS:在v5.0.9.4以后的版本里我们会改进这个问题,尽量避免崩溃,但仅防止崩溃,如果没有执行appBinding就调用SDK,SDK是无法正常工作的。