osfans / trime

同文安卓輸入法平臺3.x/Android-rime/Rime Input Method Engine for Android
http://osfans.github.io/trime/
GNU General Public License v3.0
3.09k stars 372 forks source link

调用set_option导致App卡死 #637

Closed tumuyan closed 6 months ago

tumuyan commented 2 years ago

Describe the bug 部分操作会导致App卡死,且软件盘不弹出。

To Reproduce 待收集

Expected behavior 崩溃Log指向set_option。 在trime类中有如下代码,注释中提及了在Rime.onMessage中調用set_option会卡死,看上去set_option的调用需要更加谨慎。需要收集更多的信息来优化

  /** Must be called on the UI thread */
  public void initKeyboard() {
    reset();
    setNavBarColor();
    textInputManager.setShouldUpdateRimeOption(true); // 不能在Rime.onMessage中調用set_option,會卡死
    bindKeyboardToInputView();
    // loadBackground(); // reset()调用过resetCandidate(),resetCandidate()一键调用过loadBackground();
    updateComposing(); // 切換主題時刷新候選
  }

Log Log并未指明崩溃的原因

 java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: thread Thread[1,tid=2900,Native,Thread*=0xb4000070f6123c00,peer=0x73285558,"main"] using JNIEnv* from thread Thread[24,tid=3804,Runnable,Thread*=0x70039ea000,peer=0x13680ef8,"DefaultDispatcher-worker-1"]
    java_vm_ext.cc:577]     in call to FindClass
    java_vm_ext.cc:577]     from void com.osfans.trime.Rime.set_option(java.lang.String, boolean)
iovxw commented 2 years ago

因为 Rime.set_option 会触发 Rime.onMessage 的回调,如果再调用 set_option 会死循环

有一个 Rime.setOption 是包装过的,内部有检查,应该使用这个

set_option 应该改为 private 的