关于appBinding的注意事项

2024-05-29 09:40:40    文子    320

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