Как загрузить класс на Android без dex

Я пытаюсь загрузить файл .jar, скомпилированный без Android SDK (поэтому классы не объединяются в dex). Я провел много часов, пробуя все возможные способы (Javassist, системный загрузчик классов по умолчанию...), и только сейчас я обнаружил, что мне нужно использовать DexClassLoader, но (логически) он может загружать только декодированные классы. Есть ли способ загрузить неиндексированный класс? В основном я думаю, что нет, потому что Android работает на Dalvik, который может запускать только dex.

я использовал

URLClassLoader child = new URLClassLoader(new URL[]{file.toURI().toURL()}, BotLoader.class.getClassLoader());
return Class.forName(className, true, child);

но это работало только с классами, включенными или скомпилированными с проектом.

я также использовал

DexClassLoader classLoader = new DexClassLoader(
                pathToJar, tmp.getAbsolutePath(), null, BotLoader.class.getClassLoader());
        return classLoader.loadClass(className);

но я понятия не имею, как получить optimizedDirectory.

Если я не могу использовать неиндексированные классы, может кто-нибудь сказать мне, как я могу преобразовать мои существующие классы (.class в .jar) в новый пакет jar?

Спасибо.


person Martin    schedule 02.08.2018    source источник


Ответы (1)


Хорошо, я закончил с командой

cd "C:\Android_Studio\Android\Sdk\build-tools\27.0.3"
dx --dex --output="C:\Users\Intel i5\Desktop\ExamplePlugin\out\artifacts\plugin_main_jar\classes.dex" "C:\Users\Intel i5\Desktop\ExamplePlugin\out\artifacts\plugin_main_jar\plugin_main.jar"

который генерирует class.dex, и я вручную добавляю их в plugin_main.jar. Я попробовал это в приложении, и это работает.

В приложении я использовал:

final File tmpDir = new File(activity.getCacheDir().toString());

tmpDir.mkdirs();

DexClassLoader classLoader = new DexClassLoader(
        pathToJar, tmpDir.getAbsolutePath(), null, BotLoader.class.getClassLoader());
return classLoader.loadClass(className);

Код activity.getCacheDir() помогает оптимизироватьDirectory.

person Martin    schedule 02.08.2018