64k方法数限制原理与解决
Android开发的朋友,遇到很多这样的情况,随着功能的增加,方法数增多,就会出现所谓的64k方法数问题。
产生原因
Android APK文件本质上是一个压缩文件,它包含的classes.dex文件是Dalvik字节码文件,这个dex文件中存放的就是编译后的Java代码。Dalvik可执行文件规范限制了单个.dex文件最多引用的方法数是65536个。
MultiDex的使用
google为了规避上述问题,推出了MultiDex解决方案解决方法数超限问题
配置build.gradle
android { compileSdkVersion 21 buildToolsVersion "21.1.0"//必须使用21或之后的版本 defaultConfig { ... minSdkVersion 14 targetSdkVersion 21 ... // Enabling multidex support. multiDexEnabled true } ... } dependencies { compile 'com.android.support:multidex:1.0.0' }
配置Application
如果用户没有重写Application,只需修改Manifest文件中的内容:
<application ... android:name="android.support.multidex.MultiDexApplication"> ... </application>
如果用户继承变重写了Application,可以将继承的Application换成MultiDexApplication。
或者重写attachBaseContext() 方法,
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
特别注意,如果没有实现这部分代码,运行时会出现NoClassDefFoundError的错误,尤其是在依赖三方函数库时。
解决原理
Android5.0
之前Dalvik在5.0之前,为每一个APK只生成一个classes.dex,所以会有上述所说的方法数超限的问题,如果我们可以将一个dex文件分成多个,在应用启动时,加载第一个(主dex)dex文件,当启动以后,再依次加载其他dex文件。这样就可以规避上述问题了。MultiDex即是实现了这样的功能。
Android5.0之后
Android5.0及更高版本使用支持从apk中加载多个dex文件的ART运行时机制,在应用安装时,加载classed(…N).dex文件并编译成一个.oat文件以支持在Android设备上运行。
发布评论
热门评论区: