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

同步/部署会崩溃: NullPointerException, Config.getSharedDataDir() #334

Closed StephanoGeorge closed 4 years ago

StephanoGeorge commented 4 years ago

这是同步的日志, 部署也是 NullPointerException

03-22 09:47:43.982 I/ActivityManager(22499): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.osfans.trime/.Pref (has extras)} from uid 10303
03-22 09:47:44.037 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/android.widget.FrameLayout com.osfans.trime/android.widget.FrameLayout
03-22 09:47:44.089 I/ActivityManager(22499): Start proc 6170:com.osfans.trime/u0a307 for activity com.osfans.trime/.Pref
03-22 09:47:44.353 I/ActivityManager(22499): Displayed com.osfans.trime/.Pref: +370ms
03-22 09:47:44.359 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-22 09:47:44.520 W/SurfaceFlinger(751): Attempting to set client state on removed layer: Splash Screen com.osfans.trime#0
03-22 09:47:44.520 W/SurfaceFlinger(751): Attempting to destroy on removed layer: Splash Screen com.osfans.trime#0
03-22 09:47:45.849 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/android.app.Dialog com.osfans.trime/android.app.Dialog
03-22 09:47:50.347 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-22 09:48:03.061 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-22 09:48:03.076 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-22 09:48:03.398 W/SurfaceFlinger(751): Attempting to set client state on removed layer: thumbnail anim: AppWindowToken{a805c2 token=Token{13d020d ActivityRecord{bd064a4 u0 com.osfans.trime/.Pref t8616}}}#0
03-22 09:48:03.399 W/SurfaceFlinger(751): Attempting to destroy on removed layer: thumbnail anim: AppWindowToken{a805c2 token=Token{13d020d ActivityRecord{bd064a4 u0 com.osfans.trime/.Pref t8616}}}#0
03-22 09:48:04.007 D/ActivityInfoProvider(22338): setLatestComponent: com.osfans.trime/android.app.Dialog com.osfans.trime/android.app.Dialog
03-22 09:48:04.632 E/Pref    (6170): Sync Exceptionjava.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.osfans.trime.Config.getSharedDataDir()' on a null object reference
03-22 09:48:04.636 D/SurfaceFlinger(751): duplicate layer name: changing com.osfans.trime/com.osfans.trime.Pref to com.osfans.trime/com.osfans.trime.Pref#1
03-22 09:48:04.652 W/InputDispatcher(22499): channel '5bb9333 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
03-22 09:48:04.652 E/InputDispatcher(22499): channel '5bb9333 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Channel is unrecoverably broken and will be disposed!
03-22 09:48:04.655 W/InputDispatcher(22499): channel '6cfe8e9 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
03-22 09:48:04.656 E/InputDispatcher(22499): channel '6cfe8e9 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Channel is unrecoverably broken and will be disposed!
03-22 09:48:04.657 I/ActivityManager(22499): Process com.osfans.trime (pid 6170) has died: fore TOP 
03-22 09:48:04.657 W/ActivityManager(22499): Force removing ActivityRecord{bd064a4 u0 com.osfans.trime/.Pref t8616}: app died, no saved state
03-22 09:48:04.661 I/WindowManager(22499): WIN DEATH: Window{6cfe8e9 u0 com.osfans.trime/com.osfans.trime.Pref}
03-22 09:48:04.661 W/InputDispatcher(22499): Attempted to unregister already unregistered input channel '6cfe8e9 com.osfans.trime/com.osfans.trime.Pref (server)'
03-22 09:48:04.668 I/WindowManager(22499): WIN DEATH: Window{5bb9333 u0 com.osfans.trime/com.osfans.trime.Pref}
03-22 09:48:04.668 W/InputDispatcher(22499): Attempted to unregister already unregistered input channel '5bb9333 com.osfans.trime/com.osfans.trime.Pref (server)'
03-22 09:48:04.669 W/SurfaceFlinger(751): Attempting to set client state on removed layer: com.osfans.trime/com.osfans.trime.Pref#1
03-22 09:48:04.669 W/SurfaceFlinger(751): Attempting to destroy on removed layer: com.osfans.trime/com.osfans.trime.Pref#1

第一次使用即如此, 即使重新安装也如此

Android 9
trime 3.1.3-20190930
rime 1.5.3-8-g3b5dbf6-arm64-v8a
cognition9144 commented 4 years ago

已知 Bug,目前的设计就是这样,因为初始化的时候没有自动生成配置文件放进去。可以试着手动重置一下先。

重置的时候会执行: https://github.com/osfans/trime/blob/8fad97bb05a14cc11e5fb84a814c8bea7d27cc2d/app/src/main/java/com/osfans/trime/ResetDialog.java#L44 这里会把 https://github.com/osfans/trime/tree/develop/app/src/main/assets/rime 的默认配置(仅 trime 自己的)复制到配置目录下,然后 build。

可以看到,每次启动 trime 的时候都会初始化 Config,并会调用 prepareRime()https://github.com/osfans/trime/blob/8fad97bb05a14cc11e5fb84a814c8bea7d27cc2d/app/src/main/java/com/osfans/trime/Config.java#L72

如果是第一次开启 trime,应该会落入 prepareRime()isOverwrite 条件下 https://github.com/osfans/trime/blob/8fad97bb05a14cc11e5fb84a814c8bea7d27cc2d/app/src/main/java/com/osfans/trime/Config.java#L101 因为最初 pref manager 里是不会有 version 记录的 https://github.com/osfans/trime/blob/8fad97bb05a14cc11e5fb84a814c8bea7d27cc2d/app/src/main/java/com/osfans/trime/Function.java#L240

所以现在已经划定好了应该初始化的情况,只要除了 trime 的配置外再加上 rime 的就行了。既然现在已经有推荐词库,完全可以 git subvolume 或者即时下载。

StephanoGeorge commented 4 years ago

我没有阅读过源代码

最后一句话没看懂

所以现在已经划定好了应该初始化的情况

什么意思?

只要除了 trime 的配置外再加上 rime 的就行了

比如指什么文件?

另外, 我在电脑上已经设置好了整套配置, 同步到了 Android 端的 sync, 如何直接运行?

cognition9144 commented 4 years ago

所以现在已经划定好了应该初始化的情况

指如果之后要做开箱即用体验的话,只需要加入几行复制文件的代码。判断是第一次安装或需要覆盖配置文件的条件已经写好了。

只要除了 trime 的配置外再加上 rime 的就行了

现在只有 trime.yaml。还需要 default.yaml、字典等等。

另外, 我在电脑上已经设置好了整套配置, 同步到了 Android 端的 sync, 如何直接运行?

Storage 下新建 rime、 rime/sync 文件夹,把电脑端 sync 目录下随机命名的文件夹复制到手机 rime/sync里。同时 default.yaml 也需要复制。在 trime 里点同步就行了。

Bambooin commented 4 years ago

@Denis-Oakley 可以试试已经整理好的配置文件 https://github.com/Bambooin/rimerc

另外最好下载最新的安装包 https://github.com/osfans/trime/tree/gh-pages

cognition9144 commented 4 years ago

@Bambooin 配置文件不含 build,新安装的话直接放进去仍然会闪退。有没有可能考虑一下内置这个配置文件呢?

Bambooin commented 4 years ago

@xcffl build 是部署后自动生成的目录,不需要自己创建

按照 https://github.com/Bambooin/rimerc 的步骤操作应该不会有问题。

cognition9144 commented 4 years ago

@Bambooin 实际上是不会的,你可以试试

的确是有执行finalize并调用maintenance thread,究竟为啥不会新建目录我还没研究清楚。

Bambooin commented 4 years ago

按照文档做了一遍,一切正常,生成 build 和luna_pinyin.userdb 目录

最新的 APK ,Android 9.0,没有生成,可能是部署失败了,手机内存要大点

部署要好久,生成大概 55M 的 build 目录

Bambooin commented 4 years ago

怀疑你的部署失败了,可以看看是不是有部署失败的日志。

StephanoGeorge commented 4 years ago

没明白...

恢复所有默认设置后, 提示成功, 将电脑上的相应文件放到 sync/<id>, 更改 installation.yaml 中的 id, 同步会崩溃

同时 default.yaml 也需要复制

sync/<id> 中的 default.yaml 复制到 rime 目录, 同步仍会崩溃

恢复所有默认设置后, 提示成功, 挑选内置方案会崩溃, 不过方案生效了

我现在试一下 3.1.3-14-g8fad97b-20200318

cognition9144 commented 4 years ago

@Bambooin 部署是失败的,和这个 issue 的 reporter 一样。左边是重置过后可以正常部署的日志,右边是部署立即闪退的。可以正常部署的时候倒挺快的,几秒就好了。

> sdiff /tmp/good /tmp/bad -s --width 190

I WindowManager: WIN DEATH: Window{123456 u0 com.osfans.trime/com.osfans.trime.Pref}          | I libprocessgroup: Successfully killed process cgroup uid 123465 pid 1234 in 0ms
W InputDispatcher: Attempted to unregister already unregistered input channel '123456 com.osf | W ActivityTaskManager: Force removing ActivityRecord{123456 u0 com.osfans.trime/.Pref 123456}
I libprocessgroup: Successfully killed process cgroup uid 123456 pid 1234 in 0ms          <
E InputDispatcher: Window handle Window{123456 u0 com.osfans.trime/com.osfans.trime.Pref} has <
I WindowManager: WIN DEATH: Window{123456 u0 com.osfans.trime/com.osfans.trime.Pref}          <
W ActivityTaskManager: Force removing ActivityRecord{123456 u0 com.osfans.trime/.Pref 123456} | W InputDispatcher: Attempted to unregister already unregistered input channel '123456 com.osf
W ActivityManager: setHasOverlayUi called on unknown pid: 1234                    | E InputDispatcher: Window handle Window{123456 u0 com.osfans.trime/com.osfans.trime.Pref} has
W ThreadPoolDumper: Queue length for executor EventBus is now 11. Perhaps some tasks are too  / W WindowManager: Failed looking up window callers=com.android.server.wm.WindowManagerService.
I StreamController: registerScope: nowcards-15-41959f8-8a78                   <

内存6GB,已使用4.8GB还是足够的吧。 3.1.3-14-g8fad97b-20200318 Android 10

我尝试断点看一下

StephanoGeorge commented 4 years ago

3.1.3-14-g8fad97b-20200318 的行为还是这样, 会崩溃...

Bambooin commented 4 years ago

@Denis-Oakley 先不要管你电脑的配置,先把以前的配置备份,按照下面的步骤执行

https://github.com/Bambooin/rimerc#%E6%AD%A5%E9%AA%A4

Bambooin commented 4 years ago

很多人使用过,我刚才又验证了一次,这个配置应该没问题,

@Denis-Oakley @xcffl

cognition9144 commented 4 years ago

@Bambooin 啊没错的,这个指南里说了「要重置」。重置过后是可以的,但其实应当是 Deploy 就应该调用 Maintanance (和电脑上逻辑一样)。 这个我上面已经跟 @Denis-Oakley 说了,Ta 也通过重置成功使用了。

StephanoGeorge commented 4 years ago

按照 rimerc 的步骤, 第4步重新部署崩溃, 这是日志

03-23 15:47:09.440 D/ActivityInfoProvider(6679): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-23 15:47:09.446 D/ActivityInfoProvider(6679): setLatestComponent: com.osfans.trime/com.osfans.trime.Pref com.osfans.trime/com.osfans.trime.Pref
03-23 15:47:09.760 W/SurfaceFlinger(751): Attempting to set client state on removed layer: thumbnail anim: AppWindowToken{284e066 token=Token{297d0c1 ActivityRecord{8772da8 u0 com.osfans.trime/.Pref t8766}}}#0
03-23 15:47:09.760 W/SurfaceFlinger(751): Attempting to destroy on removed layer: thumbnail anim: AppWindowToken{284e066 token=Token{297d0c1 ActivityRecord{8772da8 u0 com.osfans.trime/.Pref t8766}}}#0
03-23 15:47:14.045 D/SurfaceFlinger(751): duplicate layer name: changing com.osfans.trime/com.osfans.trime.Pref to com.osfans.trime/com.osfans.trime.Pref#1
03-23 15:47:14.065 D/ActivityInfoProvider(6679): setLatestComponent: com.osfans.trime/android.app.ProgressDialog com.osfans.trime/android.app.ProgressDialog
03-23 15:47:14.674 W/InputDispatcher(4804): channel '226316a com.osfans.trime/com.osfans.trime.Pref (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
03-23 15:47:14.674 E/InputDispatcher(4804): channel '226316a com.osfans.trime/com.osfans.trime.Pref (server)' ~ Channel is unrecoverably broken and will be disposed!
03-23 15:47:14.683 W/InputDispatcher(4804): channel '338d711 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
03-23 15:47:14.684 E/InputDispatcher(4804): channel '338d711 com.osfans.trime/com.osfans.trime.Pref (server)' ~ Channel is unrecoverably broken and will be disposed!
03-23 15:47:14.689 I/ActivityManager(4804): Process com.osfans.trime (pid 27498) has died: fore TOP 
03-23 15:47:14.690 W/ActivityManager(4804): Force removing ActivityRecord{8772da8 u0 com.osfans.trime/.Pref t8766}: app died, no saved state
03-23 15:47:14.691 I/WindowManager(4804): WIN DEATH: Window{338d711 u0 com.osfans.trime/com.osfans.trime.Pref}
03-23 15:47:14.691 W/InputDispatcher(4804): Attempted to unregister already unregistered input channel '338d711 com.osfans.trime/com.osfans.trime.Pref (server)'
03-23 15:47:14.709 I/WindowManager(4804): WIN DEATH: Window{226316a u0 com.osfans.trime/com.osfans.trime.Pref}
03-23 15:47:14.709 W/InputDispatcher(4804): Attempted to unregister already unregistered input channel '226316a com.osfans.trime/com.osfans.trime.Pref (server)'
03-23 15:47:14.868 W/SurfaceFlinger(751): Attempting to set client state on removed layer: com.osfans.trime/com.osfans.trime.Pref#1
03-23 15:47:14.868 W/SurfaceFlinger(751): Attempting to destroy on removed layer: com.osfans.trime/com.osfans.trime.Pref#1
03-23 15:47:14.871 W/SurfaceFlinger(751): Attempting to destroy on removed layer: AppWindowToken{284e066 token=Token{297d0c1 ActivityRecord{8772da8 u0 com.osfans.trime/.Pref t8766}}}#0
cognition9144 commented 4 years ago

@Denis-Oakley 所以你没有生成 build 文件夹?这里要点是「恢复默认设置」而不是「部署」

Bambooin commented 4 years ago

Android 9.0 LineageOS 16.0 即使没有重置那一步,也是可以部署,不过没法转换简体而已 添加的重置那一步仅仅是为了完善步骤

Bambooin commented 4 years ago

搜索了一下那个报错,似乎其他长时间执行的应用也会出现 目前怀疑可能是 ROM 把占用大内存的应用杀死导致的 不知道是不是 ROM 厂商设置的内存规则导致的报错 是不是可以在 ROM 的设置里面修改一下内存规则

cognition9144 commented 4 years ago

不知道是不是 ROM 厂商设置的内存规则导致的报错

Android 10.0 LOS 17.0 同样问题。 只是删除 build 的话是会重建。但整个文件夹删除,只填入 rimerc 的内容的话是不行的。

即使没有重置那一步,也是可以部署,不过没法转换简体而已

opencc的问题我已经在 PR 里修复了(也许)。确实跟标题的那个报错有关,但是跟闪退无关。在重置的时候才会调用 copyFileOrDir()把 Assets 里的 build 目录复制过去

StephanoGeorge commented 4 years ago

@Denis-Oakley 所以你没有生成 build 文件夹?这里要点是「恢复默认设置」而不是「部署」

https://github.com/Bambooin/rimerc#%E6%AD%A5%E9%AA%A4

  1. 重置
  2. 部署 重置后就已经生成了 build, userdb, opencc 即使不重置, 部署时也会崩溃 不过有时部署时会显示几秒的加载框(还没发现出现的规律), 但仍崩溃

不知道是不是 ROM 厂商设置的内存规则导致的报错

我用的是类原生系统

cognition9144 commented 4 years ago

@Denis-Oakley 现在版本的「正常」状况是,完成这四步骤之后,在第四步 trime 会卡一下然后退出。在这之后就算完成部署了,输入法应该可以弹出。你的状况是这样之后输入法还不会弹出吗? 日志上因为很多地方没有设置日志点,你的日志跟正常状况一样

Bambooin commented 4 years ago

@Denis-Oakley 你按照步骤还是无法部署,无法使用吗? 还是怀疑部署过程内存占用太大,导致应用被强制退出

StephanoGeorge commented 4 years ago

在第四步 trime 会卡一下然后退出

我这里的情况是加载框有时出现, 然后退回桌面, 没有 toast

你的状况是这样之后输入法还不会弹出吗

只重置不部署都能弹出输入法, 部署(崩溃)后, 没发现输入法模样有变化, 不知道是否部署成功了

重置时的用时相差很大. 有次用时不到1s, 但只生成了 opencc

内存8GB, 重置(只生成了 opencc), 重启, 部署, 只生成了 build, 其中只有2个文件

最近一次部署(崩溃)后, 同文的最高内存使用量是 1.3GB, 而其他内存测试应用可以占用 4.3GB

cognition9144 commented 4 years ago

前两个问题已知,并且已经在我的pr里修复了。内存使用量问题我还没研究,但不应使用那么多内存的。

StephanoGeorge commented 4 years ago

20200330 版本, 部署还是会崩溃, 日志如同 https://github.com/osfans/trime/issues/334#issuecomment-602437267, 没有 Exception

我搜索了一下, 似乎还有其他原因, 可以参见: https://stackoverflow.com/questions/12459719/why-i-am-getting-error-channel-is-unrecoverably-broken-and-will-be-disposed

StephanoGeorge commented 4 years ago

Hi, 这个问题仍未解决

cognition9144 commented 4 years ago

我目前花比较多的时间在我在用的项目上,暂时无精力修这个,欢迎其它人看看

StephanoGeorge commented 4 years ago

好, 建议重新 open issue