代码之家  ›  专栏  ›  技术社区  ›  Martin

如何在没有dex的Android上加载类

  •  1
  • Martin  · 技术社区  · 6 年前

    我尝试加载没有android sdk编译的.jar文件(这样类就不会合并到dex)。我花了很多时间尝试各种可能的方法(javassist、系统默认类加载器…),现在我发现我需要使用dexClass加载器,但是(逻辑上)它只能加载dexed类。是否有可能加载非索引类?基本上我认为没有,因为安卓系统运行的是dalvik,它只能运行dex。

    我用过

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

    但这只适用于包含在Project中或与Project一起编译的类。

    我也用过

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

    但我不知道怎么去 optimizedDirectory .

    如果我不能使用非索引类,有人能告诉我如何将现有类(.class in.jar)索引到新的jar包中吗?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Martin    6 年前

    好吧,我得到命令了

    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"
    

    它生成classes.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() 执行optimizedDirectory的技巧。