首先看一個 invoke 指令:html
該指令是dalvik 和 art虛擬機的字節碼指令,這個指令的第二個參數是一個方法索引(unsigned short類型,16位),經過索引指定要調用的方法;java
在普通的hotspot虛擬機的invoke 指令不是這樣的, 是經過符號(一個包含類名、方法名的字符串)指定要調用的方法的,在類加載的 連接過程 中,把符號連接換成實際的內存地址(在java 內存的方法區)。android
方法索引是在將class文件轉化成dex文件時產生的,保存在dex文件中,目的是爲了加快 類加載 過程的連接過程,即把索引連接換成方法在內存中的地址。由於invoke指令 的 方法索引參數是一個unsigned short 類型,因此索引必須在ide
[0, 0xffff] 內,因此一個dex文件內的方法數最可能是 65536 ,固然不包括jni 方法。工具
由於dex文件加載後會把索引換成實際的地址, 所以方法數的限制在虛擬機內是不存在的,虛擬機能夠加載多個dex文件;這種限制只是在編譯階段生成dex文件時纔會有。code
解決的方法有兩個,htm
一是修改字節碼指令表,這個目前只能呵呵;索引
二是使工程生成多個dex文件,並能動態加載。目前新版的android原生支持加載多dex,舊版本須要使用multidex工具;內存