Android Class.forName не может загрузить класс с загрузчиком классов по умолчанию - PullRequest
0 голосов
/ 07 мая 2019

Я разрабатываю игру для Android с LibGDX, и динамически загружается множество классов, в версии релиза apk я не могу их загрузить, используя:

Class.forName(className);

Я получаю ClassNotFoundException, анализируя apk, который я увидел, что имя классов в файле dex упрощается только до одной буквы, я думаю, поэтому я не могу загрузить. Проект LibGDX состоит из двух частей: ядра и андроида, первая выполняет загрузку, которую я хочу, и у меня нет программных приложений Android, он действительно является депо к проекту андроида, который будет работать внутри действия и использовать функциональные возможности из ядра.

В проекте 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());
    }

Этот код не дает мне никаких исключений, по-видимому, в двух проектах используются загрузчики различных классов, и версия для Android специализирована для этих файлов dex. Этот код не будет работать:

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

Почему это происходит? В документации для Android сказано, что первый пример эквивалентен второму, поэтому не должно быть исключения.

Есть другое решение для меня, чтобы загрузить эти классы? Я думал об интерфейсе, где проект Android будет реализован для загрузки заданного класса по имени, но ни один из вариантов метода forName не работает в интерфейсе.

1 Ответ

1 голос
/ 10 мая 2019

Я нашел источник проблемы, некоторое время спустя я просматривал файлы сборки Gradle и увидел следующую строку:

minifyEabled true

Я поместил это там давным-давно, и это было причиной минифицированных имен, тогда загрузчики классов не могли найти классы, удаление этого заставило все работать

...