我在我的项目中使用multidex解决方案。我找到了几个用于multidex的库(https://github.com/casidiablo/multidex,https://github.com/jayway/maven-android-plugin/pull/425)。它们都基于修改ClassLoader的pathList字段 反映。
一切都好。次要dex中的活动效果很好。但是当我调用方法时 在Application的onCreate()方法中的二级dex中,ClassDefNotFound异常会 得到了,虽然我之前加载了次要的dex。
我非常确定pathList已成功修改。使用Class.forName(“”),类中的 可以找到次要的dex。
谁知道为什么?等待你的答复。非常感谢。
在二级dex中调用方法,像这样,
public class CustomizedApplication extends Application {
@Override
public void onCreate() {
// load secondary dex here
Dexter.loadAllDexes(this);
super.onCreate();
//invoke method in secondary dex
ClassInSecondaryDex.foo();
}
}
答案 0 :(得分:0)
这不起作用,因为类初始化之前应该知道类中使用的所有类。您可以使用反射从辅助dex调用方法。因此,如果要在MyApplication中调用任何其他类,则应将MyApplication添加到mainDexList并使用Class.forName(“com.package.YourClass”)调用其他类,并使用反射创建对象和调用方法。您必须仅在MyApplication类中执行此操作,因为您在其中加载了其他类。如果您调用一些带有几个依赖项的简单类,请考虑将这些依赖项添加到mainDexList
答案 1 :(得分:0)
我不是JVM类加载的专家,但根据我的经验,我知道在类初始化时应该知道类中使用的所有类(以正常方式 - 而不是通过反射),我认为它比搜索所有类更快调用它们时由类加载器。因此,您必须在这种情况下使用反射,但在您的活动中,所有类都将在活动初始化之前加载,以便它可以工作。当您使用Class.forName()类加载器搜索类时,它不像普通的非反射代码那样工作,因为它实际上效率不高。
试试这个
public class CustomizedApplication extends Application {
@Override
public void onCreate() {
// load secondary dex here
Dexter.loadAllDexes(this);
super.onCreate();
//invoke method in secondary dex
ClassInSecondaryDex.foo();
try{
Class<?> clazz= Class.forName("your.package.ClassInSecondaryDex");
clazz.getMethod("foo").invoke(clazz);
}catch(Exception e)
{
e.printStackTrace();
}
}