DexClassLoader - 添加功能

ole*_*ole 3 android dalvik dexclassloader

我正在使用 DexClassLoader 进行一些测试,看看是否可以使用新功能“更新”我的应用程序。目前我已经有了这个测试方法,它与 testClass 一起使用并运行 test() 方法。我想知道的是,我如何“替换”或“更新”和已经存在的类..?欢迎任何想法或其他建议。

方法:

    public static void loadExtLib(String pathDexFile, Context ctx) {

    String temp = ctx.getDir("temp", 0).toString();


        DexClassLoader classLoader = new DexClassLoader(pathDexFile,
                    temp, null, ctx.getClass().getClassLoader());


          String testClass = "com.mystudio.myapp.TestClass";
          Class<?> libProviderClass = null;
          try {
            libProviderClass = classLoader.loadClass(testClass);
        } catch (ClassNotFoundException e1) {

            e1.printStackTrace();
        }


          try {
            Method m = libProviderClass.getDeclaredMethod("test", null);
            try {
                m.invoke(libProviderClass, null);

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e1) {
            e1.printStackTrace();
        }
          Log.v("loadClass", "loaded: " + testClass);


}
Run Code Online (Sandbox Code Playgroud)

fad*_*den 5

一般来说,您不能“替换”或“更新”一个类;只有由其DexClassLoader或其子加载器之一加载的类才能够看到加载的类。例如,您不能替换java.lang.String为进行恶意操作以规避类中的安全限制的版本。

这在一定程度上降低了加载多个同名类的实用性。另一方面,它确保类加载器 A 的操作独立于类加载器 B 的操作,只要一个类加载器不是另一个类加载器的父级。

使用运行时加载的类的一种可能有用的方法是在基本加载器中定义一个接口,该接口由该类的“旧”版本和“新”版本实现。通过接口引用类的实例,您可以避免“旧”代码看不到“新”类定义的事实。

(考虑这个问题的最好方法是在心里用它的类加载器标记每个类。那么很明显,你不能将 a 传递String'new给为 编写的函数String'old,但如果它们都实现了CharSequence'old,那么你总是可以通过它来引用它们。)

Dalvik 测试中有一些代码练习运行时“替换”,阅读起来可能会有用。请参阅068-classloader测试。src和的内容src-ex内置于单独的 .jar 文件中;后者在运行时加载。