AndroidStudio自定义dex最大方法数

方法数超过64K的处理

随着软件不断增大,原来dex最大方法数65535的限制导致,为了解决这个问题,Google官方提供了多dex的方案,Google官方说明:为方法数超过 64K 的应用启用多 dex 文件

默认情况下,Android Gradle插件会自动统计方法数,并自动决定将哪些类放入到maindex中,这样一来,maindex往往是比较庞大,接近64k的限制,如果需要对apk进行特定的处理(比如国内第三方平台的apk加固)可能会出现问题。

控制每个dex的方法数

只需要在项目程序模块下面的build.gradle文件中增加dexOptions配置即可,配置如下

android {

    // .......
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters = ['--multi-dex',
                                '--set-max-idx-number=30000', //控制maindex里面的最大方法数
                                '--minimal-main-dex' //maindex最小化,有这句会使得maindex只放必须的类,尽量最小化,会比其他dex要小很多
        ]
    }
}

主dex类清单文件

如果不配置主dex类清单文件,编译器会自动进行分配主dex中的类。为了避免分包过程中出现找不到类的情况,可能会需要将特定的类添加到主dex中,可以通过additionalParametersmain-dex-list属性进行配置,他的参数值是文件路径。具体配置如下:

android {

    // .......
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters = ['--multi-dex',
                                '--main-dex-list=maindexlist.txt', // 主dex类清单文件
                                '--minimal-main-dex' //maindex最小化,有这句会使得maindex只放必须的类,尽量最小化,会比其他dex要小很多
        ]
    }
}

注意:类清单文件是文件路径,可以使用相对路径,也可以使用绝对路径;文件中类声明的分隔符使用“/”,后缀为.class。示例:com/test/App.class

注意事项

配置了dexOptions,但dex最大方法数不按配置生效?

  • 检查是否启用了D8编译
    Google官方不断提高AndroidStudio打包生成apk的效率,所以发明D8编译打包,并在Android Gradle插件v3.1.0开始默认在AndroidStudio中启用了。D8会导致这种分包不成功,如果不会按配置的方法数进行分包,可进行以下处理:
  1. 检查项目中使用的Android Gradle插件的版本,可在项目目录下的build.gradle中查看依赖,如下:
buildscript {
    //...

    dependencies {
        classpath "com.android.tools.build:gradle:3.3.0"  // Android Gradle插件

        classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
    }
}
  1. 如果版本是3.1.0之前的版本,可以检查程序模块下的dexOptions配置是否有问题
  2. 如果版本是3.1.0或者更高的版本,可以选择降低版本,或者禁用D8,禁用D8只需要在项目目录下的gradle.properties文件中增加一行配置
android.enableD8=false
  • 检查主dex类清单文件
    如果配置了主dex类清单文件,请检查类清单文件,其中包括清单中类的路径、分隔符、后缀,以及声明的类是否存在。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值