android dex 具有方法数限制的具体原因

首先看一个 invoke 指令

115748_phLh_255456.png

该指令是dalvik 和 art虚拟机的字节码指令,这个指令的第二个参数是一个方法索引(unsigned short类型,16位),通过索引指定要调用的方法;

在普通的hotspot虚拟机的invoke 指令不是这样的, 是通过符号(一个包含类名、方法名的字符串)指定要调用的方法的,在类加载的 链接过程 中,把符号链接换成实际的内存地址(在java 内存的方法区)。


方法索引是在将class文件转化成dex文件时产生的,保存在dex文件中,目的是为了加快 类加载 过程的链接过程,即把索引链接换成方法在内存中的地址。因为invoke指令 的 方法索引参数是一个unsigned short 类型,所以索引必须在

 [0, 0xffff] 内,所以一个dex文件内的方法数最多是 65536 ,当然不包括jni 方法。


因为dex文件加载后会把索引换成实际的地址, 因此方法数的限制在虚拟机内是不存在的,虚拟机可以加载多个dex文件;这种限制只是在编译阶段生成dex文件时才会有。


解决的方法有两个,

一是修改字节码指令表,这个目前只能呵呵;

二是使工程生成多个dex文件,并能动态加载。目前新版的android原生支持加载多dex,旧版本需要使用multidex工具;





转载于:https://my.oschina.net/u/255456/blog/386571

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值