手册
1. DWIMECore
1.1  SDK使用流程图
1.2  getEngineVersion
1.3. 数据加载
1.3.1  dataAdd
1.3.2  dataMap
1.3.3  dataFile
1.3.4  dataClear
1.3.5  dataExist
1.3.6  数据ID定义
1.4. 键盘模块
1.4.1  init
1.4.2  deinit
1.4.3  reset
1.4.4  setPYFuzzy
1.4.5  setOption
1.4.6  customPYFuzzy
1.4.7  setCorrect
1.4.8  addCorrect
1.4.9. 输入
1.4.9.1  processKey
1.4.9.2  processKeys
1.4.9.3  associateKey
1.4.9.4  setCandSelect
1.4.9.5  setSyllableSelect
1.4.10. 输出
1.4.10.1  getCandCount
1.4.10.2  getSyllableCount
1.4.10.3  getInputString
1.4.10.4  getCompString
1.4.10.5  getCompCorrectCount
1.4.10.6  getCompCorrectInfo
1.4.10.7  getFormatPinyin
1.4.10.8  getCandString
1.4.10.9  getSyllableString
1.4.10.10  getSyllableSelectedInfo
1.4.10.11  getCommitString
1.4.10.12  getCandCode
1.4.10.13  getCandAttr
1.4.11. 查询
1.4.11.1  getLanguage
1.4.11.2  getInputMode
1.4.11.3  getKBType
1.4.11.4  isCanCommit
1.4.11.5  isAssociateMode
1.5. 手写模块
1.5.1  hwInit
1.5.2  hwDeinit
1.5.3  hwReset
1.5.4  hwSetOption
1.5.5  hwRecognize
1.5.6  功能设置项定义
1.5.7  手写识别模式定义
1.6. 记忆模块
1.6.1  userDBCopy
1.6.2  userDBFree
1.6.3  userDBGetPhr
1.6.4  userDBGetCode
1.6.5  userDBGetCount
1.6.6  userDBDelPhr
1.6.7  userDBDelPhr2
1.6.8  userDBIsNewPhr
1.6.9  userDBItemExisted
1.6.10  userDBAdd
1.6.11  userDBAdd2
1.6.12  userDBGetAttr
1.6.13  userDBImportContacts
1.7. 授权模块
1.7.1  appBinding (C/C++)
1.7.2  appBinding (Android)
1.7.3  appBinding (iOS)
1.7.4  getLicense
1.8. 宏定义
1.8.1  语言定义
1.8.2  键盘类型定义
1.8.3  输入模式定义
1.8.4  按键定义
1.8.5  按键动作定义
1.8.6  模糊音定义
1.8.7  错误码定义
1.8.8  记忆数据类型dbType定义
1.8.9  输入法功能开关定义
1.9. 具体问题与例子
1.9.1  关于appBinding的注意事项
1.9.2  什么是细胞词库?
1.9.3  如何使用细胞词库功能?
1.9.4  如何开启表情跟随功能?
1.9.5  如何关闭/开启纠错功能?
1.9.6  如何实现流行热词更新?
1.9.7  如何使用标点跟随功能?
1.9.8  如何使用云拼音功能?
1.9.9  如何使用模糊音功能?
1.9.10  联想功能开关?
1.9.11  开启/关闭中英混合功能
1.9.12  五笔模式开启拼音功能
1.9.13  五笔模式打开编码提示
1.9.14  手写识别各种模式切换

关于appBinding的注意事项

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

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