问题表现: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是无法正常工作的。