简介
开发过程中,查看Bugly时,发现在部分机型(酷派,说的就是你),只要点击了自定义的InputConnection
的WebView
,程序就会直接Crash,Bugly中崩溃日志如下:
java.lang.AbstractMethodError |
故名思议,得知是由于没有实现接口方法performYLPrivateCommand
,但是实际上Android标准的InputConnection
接口并没有这个方法。经Google,在你要知道的N个Android适配问题中找到了相似问题。
分析
既然找到了原因,是由于某些坑爹的厂商(酷派:怪我咯~)在InputConnection
接口中新增了一个performYLPrivateCommand
方法,那么,对于解决,只要实现这个方法就好。对于Android,只要子类定义了这个方法,那么就算是实现了,加不加Override注解不影响源码的解析。在InputConnection
中添加如下方法:
public boolean performYLPrivateCommand(String action, Bundle data) { |
经测试,失败。┑( ̄Д  ̄)┍
通过Jeb反编译自己代码,并没有找到任何与performYLPrivateCommand
相关代码,此时想到,应该是项目构建时,会把未使用的无用代码移除,不会打包进入Apk中,想到的解决方案是,自定义一个接口封装performYLPrivateCommand
方法,同时实现InputConnection
接口和自定的接口。代码如下:
public interface IExtraInputConnection { |
class TapInputConnection implements InputConnection, IExtraInputConnection { |
打包,测试,还是失败。
反编译,
实现已经存在,只是被混淆了。此时应该防止被混淆,否则会找不到这个方法,在混淆文件中添加如下代码:
-keep interface com.iwyatt.IExtraInputConnection { |
经测试,成功。
总结
- 自定义接口封装
performYLPrivateCommand
- 实现
InputConnection
接口的同时实现自定义的接口 - 使自定义接口不被混淆
代码
public interface IExtraInputConnection { |
class TapInputConnection implements InputConnection, IExtraInputConnection { |
-keep interface com.iwyatt.IExtraInputConnection { |