wuhgit/CustomPinyinDictionary

Magisk 模块似乎不支持多用户

qianbinbin opened this issue · 21 comments

在主用户下安装了模块,Gboard 中显示有词库
其他用户下的 Magisk 也显示模块已安装,但 Gboard 中没有词库,重启无效

这应该是正常现象。

多用户的状态下,每个用户的应用都有自己独立的数据文件,如果你在主用户安装,主用户 Gboard 的数据肯定不能被其它用户运行的 Gboard 读取。

而 Magisk 的数据是在一个单独的文件夹里,似乎是 /data/abd/magisk/ (这会我手机不在身边暂时没法验证),这个位置的数据所有用户都可以读取。但这里存放的只是一些模块相关的信息,比如哪个模块被安装了,哪个模块可以升级了之类的。

对于我这个模块而言,词库数据是需要写入应用数据文件夹的,因为 Gboard 只能读取相关的位置,在多用户状态下,应该是哪个用户安装了模块哪个用户就有相关的词条数据,就如同你的描述。

要不你试试在别的用户下再安装一遍模块?注意,这仅仅是我的推想,可能会有用。

Magisk 模块应该是所有用户共享的,Gboard 词库数据是各用户独立的
我完全删除了模块,并在其他用户下重新安装,结果仍然是只有主用户下 Gboard 有词库
是否应该在生成词库数据时,写入到所有用户的 Gboard 相关目录下?

写入到所有用户相关目录不是好的方法,因为现在这个模块的安装卸载已经不是magisk的标准方式了,如果全部写入会制造很多未知的麻烦。

最好的方式还是各个用户独立安装,但又因为magisk是统一的数据,某一用户的安装卸载就会影响到别的用户……

至于你刚刚试验的结果,应该是我模块里的数据路径问题,我一直没考虑过多用户的情况,这个还有待验证。

Magisk 下面有一个“多用户模式”,你这个是什么设置?

Magisk 下面有一个“多用户模式”,你这个是什么设置?

每个用户有独立的超级用户规则

我还在测试,如果可行,应该会更新一版来做到支持安装到当前用户的数据目录下,即每个需要词库的子用户独立按需安装,但现在还有一些问题需要解决。

好,谢谢

已更新。
子用户独立按需安装或卸载即可。

我完全删除了模块,并在其他用户下重新安装,结果仍然是只有主用户下 Gboard 有词库

新版本重复以上步骤,结果还是一样

这个功能要是不太好做就算了
我看脚本的功能就是把 data/db 复制到 Gboard 数据库目录下的 PersonalDictionary.db,那我直接手动复制就可以了

你确认新版本结果还是一样?
奇怪了,我这边两台设备都测试成功了。
你手机系统版本是多少?安装的时候模块信息显示的是给“主用户”还是“用户XX”?

Android 12,Lineage OS 19.1
安装的时候只显示主用户,工作用户是用 Shelter 创建的

……
我以为你说的多用户是系统自带的这个:

Screenshot_20221006-184546_设置

Shelter 这类的应用创建的“多用户”是另外一种概念……

呃,那尴尬了,怪我没说清楚

Shelter 和 Island 这类应用创建的其实不能算做多用户,它更像是给应用创建了另外一个配置文件让它去读取不同的数据,和 Android 系统自带的多用户还是有很大的区别。

由于这类应用创建的数据位置因为使用者的自定义而形式各异,为了考虑到模块最大程度的兼容性,我目前并没有一个泛用的方式来实现数据写入,所以……你只能是自己手动复制数据了,注意数据库权限。

不过你倒是也提醒了我,我之前更新的时候只是说多用户,也没有明确是什么途径实现的多用户,还是需要在介绍里面声明一下。

好,谢谢

补一个说明
@qianbinbin

经过测试,Shelter 可以用,但因为运行 Magisk 的系统帐号还是主帐号(只有使用 Android 系统创建的多用户下才能识别是哪一个帐号),所以模块在判断的时候不能识别出 Shelter 的用户,解决方法是手动处理这个步骤。

你在 /data/adb/wuhgit/CustomPinyinDictionary/ 这个目录下创建一个文件名为 10 的空文件,然后再安装模块即可。

下次安装更新的时候也会同步更新主用户和 Shelter 用户,如果 Shelter 这个用户不想用了,删除刚刚创建的那个空文件即可。

Screenshot_20221008-101111_Gboard

试了一下,安装时确实可以,但卸载时不会删除,不过这已经满足我的需要了
再做个补充:10 应该是类似 userid 的东西,如果多次创建可能会递增

卸载不会删除还是相同的原因,运行在主帐号的 Magisk 无法识别当前的用户,即便把 Magisk 应用安装到 Shelter 中也是如此,所以要手动删除那个空白文件。

10 的确是 userid ,但 Shelter 似乎只能创建这一个,当然我没做太多的测试,有待观察。

系统自带的多帐号就是递增,不过后者的识别就没有问题,我测试过同时创建数个帐号都可以正确识别。

Shelter 的也会递增,我以前有次变成了 11,忘了是怎么弄的了。。

先在 adb shell 中执行一次 ls /data/user(需要 su 提权),按实际情况添加空白文件即可。