您的位置:首页 > 移动开发 > Android开发

android插件化学习笔记(一)

2016-07-04 11:55 465 查看
DexClassLoader:

一 问题:

     DexClassLoader作为插件中一个重要部分,需要进行合理管理,否则每当插件进程增加一个类new DexClassLoader 会出现class cast异常。

classloader过程如下

protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {

    Class<?> clazz = findLoadedClass(className);

    if (clazz == null) {

        try {

            clazz = parent.loadClass(className, false);

        } catch (ClassNotFoundException e) {

            // Don't want to see this.

        }

        if (clazz == null) {

            clazz = findClass(className);

        }

    }

    return clazz;

}

JVM 及 Dalvik 对类唯一的识别是 ClassLoader id + PackageName + ClassName,所以一个运行程序中是有可能存在两个包名和类名完全一致的类而产生异常。

二 解决:

   对classLoader做hash存储。通过hashmap实现对插件classloader的管理,来避免该问题出现.

HashMap<String, String> mClassLoaderMap = new HashMap<String, String>();

ClassLoader getClassLoader(String plugin){
DexClassLoader dexClassLoader = (DexClassLoader)mClassLoaderMap.get(plugin);
return dexClassLoader;

}

三 总结:

     插件和宿主是否在同一个进程,都可以。取决于实际项目。

    另外,跟据classloader的机制, 插件应该完全可以通过反射调用宿主的类以及方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 插件