该问题主要出现在使用Cordova插件时,由于插件中使用了jar库,而在Android中,jar库的类加载方式是通过dex包的方式,该包中包含着Java字节码,但是由于Android的优化机制,dex包中相同的Java字节码只会被保留一个,而其他的则会被忽略掉,从而导致类无法加载的问题。
为了解决这个问题,有以下两种方案可供参考:
1.自定义gradle插件:
apply plugin: 'java'
class ConfigClass {
}
class ClassPathLoader {
}
task jarTask(type: Jar) {
}
jar {
manifest {
attributes 'Main-Class': 'example.Main'
}
from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
exclude 'META-INF/*'
}
}
jarTask.dependsOn classes
jar {
baseName = 'example'
version = '1.0.0'
from files(sourceSets.main.output.classesDir)
from files(sourceSets.main.output.resourcesDir)
from jarTask.archivePath
}
apply plugin: 'example-plugin'
buildscript {
dependencies {
classpath 'com.example:example-plugin:1.0.0'
}
}
task exampleTask() {
}
task myBuildTask(dependsOn : [exampleTask]) {
}
2.使用R8或ProGuard等混淆工具进行优化:
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
}
-keep class com.example.** { *; }
这样做可以在混淆时确保相关类不会被优化掉。
以上两种方案都可以解决非确定性类加载问题,选择哪种方式主要取决于实际需求和环境。