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的机制, 插件应该完全可以通过反射调用宿主的类以及方法
一 问题:
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的机制, 插件应该完全可以通过反射调用宿主的类以及方法
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories