背景说明:
Android原生的开发包是直接通过gradle加载aar使用,由于客户需要模块的cordova插件,于是只能引用aar解压出来的jar包,通过cordova创建项目,指定Android平台,引入插件,然后编译安装(此时创建的项目可以通过AndroidStudio打开)
Cordova创建的项目 在Android6.0上跑报如下错误,字面上看java编译器拒绝编译这个类
Rejecting class com.speedata.cordova.plugin.XinLianQilian because it failed compile-time verification (declaration of 'com.speedata.cordova.plugin.XinLianQilian' appears in /data/app/com.speedata.cordova-2/base.apk)
at com.speedata.cordova.Main2Activity.onCreate(Main2Activity.java:16)
Cordova创建的项目 在android8.1上跑报如下入错
java.lang.VerifyError: Verifier rejected class com.speedata.cordova.plugin.XinLianQilian: byte[] com.speedata.cordova.plugin.XinLianQilian.read_area(int, int, int, java.lang.String) failed to verify: byte[] com.speedata.cordova.plugin.XinLianQilian.read_area(int, int, int, java.lang.String): [0x1DE] register v4 has type Conflict but expected Integer (declaration of 'com.speedata.cordova.plugin.XinLianQilian' appears in /data/app/com.speedata.cordova-whImE-msI6T_RN_xfg8RdA==/base.apk)
所有报错都指向这一个类,分析是不是jar有问题,于是有下面尝试
AndroidStudio直接创建项目 引用导出的jar包 在Android6.0上安装报错(这个报错看起来就舒服多了,至少知道是哪里的问题了)
不过还有个疑惑,aar在6.0上跑就没问题。。。。
Default interface methods are only supported starting with Android N (--min-api 24): int com.speedata.libuhf.IUHFService.getDwellTime()
AndroidStudio直接创建项目 引用导出的jar包 在8.1上调用接口和cordova创建的项目一样,指向read_area这个方法
查看这个方法有很多枚举判断,将此部分注释后编译通过
总结
1.Interface 接口定义里面有很多其他模块不必实现的抽象方法,这些方法用default声明,其他模块就没有实现,但是default是在Android 24以后才支持,这个报错在cordova里面报错很隐晦,新建原生项目才提示,类似场景可以通过适配器来解决,避免使用default
3.大量枚举判断可能会造成 java.lang.VerifyError ??
4. java.lang.VerifyError 需要检查报错所指向的类