我想知道是否可以打包(或序列化)ClassLoader以通过消息将其发送到Android中的另一个进程. ClassLoader
没有实现Parcelable / Serializable.
关于如何执行此 *** 作的任何提示?提前致谢!
解决方法:
类加载器
类加载器基本上是一个哈希表,其条目由类名称键入,并指向虚拟机中加载的字节码.由于Java不允许您 *** 纵代码,因此在VM本身中加载的字节代码当然是Java进程的限制.请注意,字节码已由JIT VM编译为特定于cpu的代码,并将包含内存位置和其他低级构造.
可以在同一VM中共享类加载器(通过序列化或其他方式),因为类加载器仍将能够指向原始字节码.但是,为了序列化然后反序列化到另一个VM中,类加载器将不得不序列化字节码.还有问题.
序列化类加载器
作为一个思想实验,我们如何序列化代码,以便其他进程可以反序列化它?
我们必须将其作为类大小的块来处理,以便序列化的实体具有整个类接口.我们必须将字节码中的指针“解析”为符号.我们还必须复制该类的整个字符串和符号表,以便自省继续进行.
我们刚刚定义的是类文件本身(稍有不同的是类成员的初始化与序列化)
让我重复一遍:类文件是类的序列化版本.
DEX难题
但是,AndroID将类文件预编译到DEX中.这是一个包含JAR优化版本的单个文件-类彼此预先链接,并且所有字符串符号都位于相同的共享字符串/符号池中.因此,在AndroID中,最小的可共享组件是DEX.
在许多情况下,应用程序或设备制造商都会创建ODEX文件.这是一个DEX文件,已编译为特定的cpu和体系结构(包括big-endian或little-endian系统).
在AndroID中,您可以将ODEX文件视为序列化的类加载器.
远程类加载
问题的症结在于一个进程如何加载原始进程可见的类文件. yorkw建议他/他发现了class loader,这与我的建议类似.该方法是第一个进程实现一个类查找服务,返回类字节码.但是,由于上面列出的DEX问题,这将无法直接在AndroID上运行.
解?
因此,您实现的任何解决方案都将基于(O)DEX.基本上,您需要让客户端与服务器对话并请求(O)DEX文件,然后将其作为单个实体加载.加载它将返回新的类加载器
现在,我从未做到过,AndroID完全有可能只加载一个DEX文件,从而破坏了这种方法.青年汽车
我希望这个讨论对您有帮助…
TL; DR您无法序列化类加载器;但是,您也许可以说服另一个进程加载(O)DEX文件,该文件将产生相同的结果.
总结以上是内存溢出为你收集整理的android-包裹/序列化ClassLoader全部内容,希望文章能够帮你解决android-包裹/序列化ClassLoader所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)