android 方法数64k,4.3、Android Studio突破64K方法限制

当Android应用超过64K方法限制时,会导致构建失败。为解决此问题,可以使用多Dex支持,从Android 5.0开始原生支持加载多个DEX文件。配置多Dex需要在Gradle构建文件中启用,并在AndroidManifest.xml中引用MultiDexApplication。此外,ProGuard可以用来减少未使用的代码以降低方法数。但多Dex也可能带来性能问题,如ANR和内存需求增加,需谨慎优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当利用代码和库代码代码超过64K限制时,初期版本的构建系统会出现以下提示:

Conversion to Dalvik format failed:

Unable to execute dex: method ID not in [0, 0xffff]: 65536

最近版本的构建系统会出现以下提示,指出一样的毛病:

trouble writing output:

Too many field references: 131000; max is 65536.

You may try using --multi-dex option.

其实都是相同的问题,只是提示方式不1样。

关于64K限制

APK文件包括由DEX文件组成的可履行的字节码文件,包括运行app编译后的代码。DEX文件有1个65535个方法的限制,如果超过这个限制,会在构建的时候报错。这些方法包括Android Framework方法,库方法和你自己写的方法。由于65535=64*1024,所以这个限制又被称为64K限制。

Android5.0之前的版本的多dex支持

在Android5.0之前,使用Dalvik运行时来履行利用代码。默许情况下,在每一个APK中,Dalvik限制1个classes.dex 字节码文件。为了突破这个限制,你可使用multidex support library。

注意:如果你的项目配置多dex的最小SDK版本为20乃至更低,Android Stuido将禁用Instant Run。

Android5.0及以上的版本的多dex支持

Android5.0(API level 21)或更高的版本,使用ART运行时在履行利用代码。原生的支持从APK文件中直接载入多个dex文件。

避免64K限制

下面的方法可以帮助你减少dex方法的限制:

1、 查看你的app的直接的或间接的依赖:

尽可能减少没必要要的依赖的援用。

2、 通过ProGuard来减少未使用的代码:

通过配置ProGuard来启用ProGuard,确保你在发布版本的时候启用了紧缩。

用Gradle来配置你的利用的多dex

在Android SDK Build Toos 21.1或更高的版本中,Android的Gradle插件在你的构建配置中提供了multidex的支持。在尝试配置你的multidex之前,确保你的Android SDK Build Tools和Android Support Repository升级到最新版本。

设置你的开发的app使用multidex,你需要对你的开发项目作出1些改动,遵守以下几步:

1、 更改你的Gradle构建配置来启用multidex。

2、 更改你的manifest来添加MultiDexApplication类。

更改你的build.gradle文件配置来添加支持库并且启用multidex输出,以下:

android {

compileSdkVersion 21

buildToolsVersion "21.1.0"

defaultConfig {

...

minSdkVersion 14

targetSdkVersion 21

...

// Enabling multidex support.

multiDexEnabled true

}

...

}

dependencies {

compile 'com.android.support:multidex:1.0.0'

}

在AndroidManifest.xml中,添加MultiDexApplication类:

package="com.example.android.multidex.myapplication">

...

android:name="android.support.multidex.MultiDexApplication">

...

当你添加如上配置到你的app中,Android 构建工具生成1个主要的dex文件(classes.dex)和支持多个(classes2.dex,classes3.dex)。构建系统将它们打包到1个APK中发布。

多Dex支持库的局限

Multidex支持库有1些你需要了解的局限:

1、 在某种情况下可能会致使ANR问题,如果第2个dex文件过大的话。为了避免这个问题产生,你需要使用ProGuard来进行紧缩。

2、 在Android4.0极为初期版本中会遇到1些问题。

3、 利用的multidex配置会需要更大的内存分配,这在Dalvik虚拟机中会致使崩溃。

4、 其他复杂的情形。

优化Multidex开发构建

Multidex配置会显著的增加构建时间,由于构建系统必须来衡量将那些类放到住Dex文件中,那些类放到第2个dex文件中。这就意味着会拖慢开发进程。

为了有效减缓构建multidex输出的时间,你需要使用Android 插件创建两个variantion:

1个开发flavor和1个生产flavor。

以下:

android {

productFlavors {

// Define separate dev and prod product flavors.

dev {

// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin

// to pre-dex each module and produce an APK that can be tested on

// Android Lollipop without time consuming dex merging processes.

minSdkVersion 21

}

prod {

// The actual minSdkVersion for the application.

minSdkVersion 14

}

}

...

buildTypes {

release {

runProguard true

proguardFiles getDefaultProguardFile('proguard-android.txt'),

'proguard-rules.pro'

}

}

}

dependencies {

compile 'com.android.support:multidex:1.0.0'

}

本文作者:宋志辉

个人微博:点击进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值