虽然我之前加载了dex,但是无法在Application的onCreate()方法中调用辅助dex中的方法

时间:2014-09-29 03:13:44

标签: java android dalvik

我在我的项目中使用multidex解决方案。我找到了几个用于multidex的库(https://github.com/casidiablo/multidexhttps://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();

}

}

2 个答案:

答案 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();
}

}