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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


插件中使用了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类似的跳转功能,挺好用的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值