Android Class.forName无法使用默认的类加载器加载类

时间:2019-05-07 20:18:48

标签: java android release dex

我正在用LibGDX开发一个Android游戏,并且动态加载了许多类,在apk的发行版中,我无法使用以下方式加载它们:

Class.forName(className);

我得到ClassNotFoundException,分析了apk,我发现dex文件中的类名仅简化为一个字母,我猜这就是为什么我无法加载的原因。 LibGDX项目包含两个部分:核心和android,第一部分执行我想要的加载,并且没有android API deps,他确实是android项目的dep,他将在活动中运行并使用核心功能。

在android项目上,我可以使用此示例代码在onCreate中加载类:

    try {
        Class clazz = Class.forName("game.ui.TreasureChest");
        TreasureChest chest = (TreasureChest)clazz.newInstance();
        chest.update(0.0f);
    }catch(Exception ex){
        Log.v("loadClassses", "exception: " + ex.getMessage());
    }

这段代码没有给我任何例外,显然这两个项目使用了differents类加载器,而android版本专用于该dex文件。 这段代码无法正常工作:

        Class clazz = Class.forName("game.ui.TreasureChest", true, this.getClass().getClassLoader());

为什么会这样? 在android docs中,据说第一个示例与第二个示例等效,因此不应有例外。

我还有另一种方法来加载这些类吗? 我在一个界面中思考,其中android项目将实现通过名称来加载给定类,但是forName方法的任何变体都不能在该界面中使用。

1 个答案:

答案 0 :(得分:1)

我找到了问题的根源,一段时间后,我正在查看gradle构建文件并看到以下行:

minifyEabled true

我很久以前就把它放在那儿了,这是名称缩小的原因,然后类加载器找不到类,将其删除使一切正常工作