Android原生PinyinIME的Subtype相关调查(手头没有源码,明天补上...)

这篇博客探讨了在Android 4.4上遇到的一个关于Google PinyinIME的CTS测试失败问题,原因是输入法的SubtypeCount为0。作者通过源码分析,发现输入法的subtype解析和添加是通过资源文件完成的,并且在不同版本的Android中对此有不同的处理。通过跟踪源码,找到了问题的原因在于`InputMethodInfo.java`中Subtype的解析方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在处理Android源码中Google PinyinIME的一些问题。在Android4.4上遇到了一个比较奇怪的问题。 

CTS测试无法通过,因为Android4.4 的CTS测试项中增加了一个对系统输入法SubtypeCount的检测断言,如果getSubtypeCount的值小于1(即系统输入法支持的subtype为0),则CTS测试失败。而Google PinyinIME的subtypeCount就是为0。

一直都在处理APP侧的问题,对输入法FW端的源码也不熟悉。刚拿到这个问题,想当然的认为肯定是FW端的问题。一番排查无果。

其实Google PinyinIME的subtypeCount一直都为0,只是4.4之前没有对subtype有严格的检测罢了。这是为什么呢?


最终通过查找跟踪源码,找到了原因。在FW端的InputMethodInfo.java中,我们看到了subtype是如何解析并添加subtype list中的,getSubtypeCount其实就是返回这个list的size()。


1) 我们看到解析过程都是一个资源文件路径: com.android.internal.R.

这个资源路径从哪可以找到呢? 直接查找FW肯定是找不到的。

2)我们找到了它在out下的对应文件:out/target/common/R/com/android/internal/R.java

3)然后通过查看2)中文件的内容。我们发现,其实InputMethodInfo.java中com.android.internal.R.之后的名称,对应的都是另外一个名称。然后在FW下查找这个名称。我们发现它其实对应的是:

frameworks/base/core/res/res/values/attrs.xml
终于找到了!

查看attrs.xml文件的内容,我们发现其中的InputMethod_Subtype下边定义了一些字段。
查找这些字段就会发现,它们其实是在各个输入法app端的res/xml/method.xml中定义的。

4)于是你就会发现,PinyinIME的res/xml/method.xml并没有定义subtype的值对。而其它系统输入法都有。
仿照别的系统输入法的写法,加上。问题解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值