Android方法数超过65535的解决办法

Android方法数超过65535的解决办法_第1张图片
欢迎在我的公众号aserbao给我留言,无偿服务!同时,欢迎大家来加入交流讨论群,一起讨论Android开发技术!群二维码定时在我公众号更新!
Android方法数超过65535的解决办法_第2张图片

文章目录

    • How解决呢?
    • How避免65535?
    • How to 分包?
      • 1. 将multiDexEnabled 设置为 true
      • 2. 导包
      • 3. 代码配置
    • Dalvik 可执行文件分包支持库的局限性
    • 参考文章

来来来,各位看官,看一看,瞧一瞧,随便评论点个赞!走过路过千万不要错过,之前没遇到今后一定会遇到,之前遇到了加深一下印象也不错。

大家好,我是小朱,听哥一句劝,在开发的时候能自己写的尽量别用别人的,能用小的包替代的,咱们就不用大包替代。这不,一不小心方法数就超过65535了。,如何解决这个问题,且听我慢慢道来。

首先你开发一段时间过后,你可能会遇到如下异常,没遇到你今后也会遇到的:

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.

可能还会有其他异常,不一一列举,但凡出现65535这个数字,八九不离十都是同一个原因造成的,那就是恭喜你:你的方法总数超过65535了!俗称“64K引用限制”

How解决呢?

在Android 5.0之前的版本Dalvik可执行文件必须使用分包支持。也就是导入multidex包,后面会详细讲解。

注意 :如果您的项目配置时所面向的 Dalvik 可执行文件分包使用的是 minSdkVersion 20 或更低版本,并且您将其部署到运行 Android 4.4(API 级别 20)或更低版本的目标设备上,则 Android Studio 会停用 Instant Run。

在Android5.0及之后的版本,因为使用ART运行,原生支持从 APK 文件加载多个 DEX 文件。ART 在应用安装时执行预编译,扫描 classesN.dex 文件,并将它们编译成单个 .oat 文件,供 Android 设备执行。因此,如果您的 minSdkVersion 为 21 或更高值,则不需要 Dalvik 可执行文件分包支持库。

当minSdkVersion 为 21 或更高值时,使用Instant Run时,Android Studio 还是会自动将应用配置给Dalvik虚拟机,由于 Instant Run 仅适用于调试版本的应用,您仍需配置发布构建进行 Dalvik 可执行文件分包,以规避 64K 限制。

说来说去还是得,无论你minSdkVersion的版本多少,只要你超过方法数超过64K,你就得分包,否则你调试不了。区别在于,如果你不分包,一个可以打包运行,一个不行。

How避免65535?

怎么优化?两点很重要:

  • 检查自己的项目第三方包,能不用就不用,能自己写就自己写,能用小包代替就用小包,比如Google Guava这种类库,包含13e3个方法。尽量使用一些小而精简的库。
  • 使用代码压缩移除不使用的代码。怎么各移法呢?简单来说就是运行ProGuard让交付的APK中不包含有未使用的代码。

How to 分包?

既然无法避免,该来的总要来,那么兄弟,这个异常就要对不住了,我要开始解决你了 。
Android方法数超过65535的解决办法_第3张图片

1. 将multiDexEnabled 设置为 true

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

如果您的minSdkVersion 设置为21及更高,那么现在就结束了。如果您的 minSdkVersion 设置为 20 或更低值,那么不好意思,你还要多走几步,往下看。

2. 导包

如果您的 minSdkVersion 设置为 20 或更低值,那么需要引入multidex包。操作如下:

 android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

3. 代码配置

配置有两种方式:

第一种:继承MultiDexApplication

public class AserbaoApplication extends MultiDexApplication {
……
}

第二种,在Application的attachBaseContext()方法中声明:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

Dalvik 可执行文件分包支持库的局限性

  1. 启动期间在设备数据分区中安装 DEX 文件的过程相当复杂,如果辅助 DEX 文件较大,可能会导致应用无响应 (ANR) 错误。在此情况下,您应该通过 ProGuard 应用代码压缩以尽量减小 DEX 文件的大小,并移除未使用的那部分代码。
  2. 由于存在 Dalvik linearAlloc 错误,使用 Dalvik 可执行文件分包的应用可能无法在运行的平台版本早于 Android 4.0(API 级别 14)的设备上启动。如果您的目标 API 级别低于 14,请务必针对这些版本的平台进行测试,因为您的应用可能会在启动时或加载特定类群时出现问题。代码压缩可以减少甚至有可能消除这些潜在问题。
  3. 由于存在 Dalvik linearAlloc 限制(,因此,如果使用 Dalvik 可执行文件分包配置的应用发出非常庞大的内存分配请求,则可能会在运行期间发生崩溃。尽管 Android 4.0(API 级别 14)提高了分配限制,但在 Android 5.0(API 级别 21)之前的 Android 版本上,应用仍有可能遭遇这一限制。

参考文章

官方链接之-配置方法数超过 64K 的应用

你可能感兴趣的:(Android)