dalvik缓存class及清空已加载类.


插件中使用了intent来传Serializable的数据,在退出插件重进,重新new dexclassLoader来加载插件的类;最终在再次getintent中获取之前放入的Serializable的实例转换对应得类时,报class cast出错;

跟到底层是用到objectInputStream中负责查找和生成类,再继续跟进到class.java中使用了native 方法classforname,而该方法是在dalvik中实现,

其中java_lang_Class.cpp实现该方法;继续在dalvic/vm/oo/class.cpp中使用dvmAddClassToHash来加入新的类,同时也提供了删除方法removeClassFromHash;

因此想要调用删除dalvik已加载的类,需要调用removeClassFromHash的方法来把对应的类清除,具体实现是写个jni的接口,并合入libdvm.so的库,里面调用该方法,然后包装下给java层调用就可清空已加载的类。


在查看问题时,需要浏览Android的源码,一下为Andriod源码浏览的网址:

http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

http://124.16.141.166/lxr-0710/source/?v=android-4.0.4

http://code.metager.de/source/xref/android/

其中最后一个可以想sourceInsight类似的跳转功能,挺好用的。


你可能感兴趣的:(android)