Android Class.forName 无法使用默认 class 加载程序加载 class

Android Class.forName can't load class with default class loader

我正在用 LibGDX 开发一个 android 游戏,有很多 classes 是动态加载的,在 apk 的发布版本中我无法加载它们使用:

Class.forName(className);

我得到 ClassNotFoundException,分析 apk 我看到 dex 文件中的 classes 名称被简化为只有一个字母,我想这就是我无法加载的原因。 LibGDX 项目有两部分:核心和 android,第一个是我想要的加载,没有 android API deps,他确实是 android 项目 运行 在 activity 中并使用核心功能。

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

中加载 classes
    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());
    }

这段代码没有给我任何例外,显然这两个项目使用不同的 class 加载程序,而 android 版本专门用于此 dex 文件。 此代码无效:

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

为什么会这样? 在 android 文档中,据说第一个示例等同于第二个示例,因此不应有例外。

加载这些 classes 有另一种解决方案吗? 我在考虑一个界面,其中 android 项目将实现通过名称加载给定的 class,但是 forName 方法的变体在界面中都不起作用。

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

minifyEabled true

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