插件中使用了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插件中使用Intent传递Serializable数据时遇到的问题,详细解释了底层原理,包括objectInputStream查找和生成类的过程,以及如何通过调用dalvik的native方法classforname来加载类。文章最后介绍了如何通过JNI接口和libdvm.so库实现清除已加载类的方案,提供了解决问题的具体步骤和代码示例。
1695

被折叠的 条评论
为什么被折叠?



