随着Android版本的越来越高,手机搭配的Android版本也越来越高,我们在开发做测试的时候都会采用版本较高的手机进行开发,反而会忽视了低版本的测试,做好了高版本的适配,但低版本反而会与高版本发生冲突,明明在 gradle 中将 minSdkVersion 设置为21以下,自我感觉完全可以运行在5.0以下的手机上,确实有的可以运行,但有的安装在5.0以下的手机时莫名其妙的就崩溃了,这个时候就让我们非常头疼,当我们查看 log 日志的时候莫名其妙的说我们用的某个类或者方法不存在,之前我们明明好好的运行出来了,难道我们设置的最低版本不管用了,不用着急,我们有办法,因为我们遇到了配置方法数超过64k的问题。
那到底什么是64k呢?官网也给了我们明确的解释:
Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,其中包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”。
(1)Android5.0以前:如果您的项目配置时所面向的 Dalvik 可执行文件分包使用的是 minSdkVersion 20
或更低版本,并且您将其部署到运行 Android 4.4(API 级别 20)或更低版本的目标设备上,则 Android Studio 会停止运行;
(2)如果将应用的 minSdkVersion
设置为 21 或更高值,使用 Instant Run 时,Android Studio 会自动将应用配置为进行 Dalvik 可执行文件分包。由于 Instant Run 仅适用于调试版本的应用,您仍需配置发布构建进行 Dalvik 可执行文件分包,以规避 64K 限制。
这种情况下我们就要在我们的代码中加一些配置:
android { defaultConfig { ... multiDexEnabled true } }
dependencies { ... compile 'com.android.support:multidex:1.0.1' }
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { MultiDex.install(this); } }