问题记录: 高版本正常安装,低版本出现 DexIndexOverflowException method ID not in [0, 0xffff]: 65536

低版本android手机 method ID not in [0, 0xffff]: 65536


在开发中一直使用高版本手机开发,没有发现问题,测试阶段使用android版本4.4的手机试了一下,发现一直安装不了,且报的错误是method ID not in [0, 0xffff]: 65536; 查询了资料,记录一下过程,结果和一些疑问;

官方主要说明文档: multidex tips

如果是规避64k问题:
在这里插入图片描述
其中,对于高版本手机64k 应该是有很成熟的兼容写法了,但是一直不知道低版本的 LinearAlloc Limit的问题;

对于一般手机配置 mulitdex步骤:

  • 模块级gradle 中 android - defaultConfig 块 中添加multiDexEnabled true ;
  • 模块级gradle 中 dependencies 块中添加 compile 'com.android.support:multidex:1.0.3' 依赖;
  • 是否替换 Application
    • 如果不替换 Application 类,请修改清单文件以设置 标记中的 android:name 为 android.support.multidex.MultiDexApplication
    • 如果替换 Application 类,更改application 后设置 ;
      • 请对Application 进行更改以继承 MultiDexApplication(如果可能)
      • 或者如果无法更改基类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用多 dex 文件;

但是,这些也是有局限性的;
在这里插入图片描述

我遇到的问题就是 在 android手机4.4版本中一直安装不了,报method ID not in [0, 0xffff]: 65536 错误; 估计就是 LinearAlloc问题了;

根据 下面两篇分包文章参考:
配置dex参数
dex拆分包

主app build.gradle配置afterEvaluate :

  • –multi-dex 表示当方法数越界时则生成多个dex 文件
  • –main-dex-list 参数是一个类列表的文件,在该文件中的类会被打包在第一个 dex 中(主dex), 其中指定打包文件与build.gradle同一文件夹。
  • –minimal-main-dex 表明–main-dex-list所指定的类才能打包到主dex 中

在与build.gradle 建立一个dex.txt 文件指明打包到主dex中的类;

    afterEvaluate {
        tasks.matching {
            it.name.startsWith('dex')
        }.each { dx ->
            if (dx.additionalParameters == null) {
                dx.additionalParameters = []
            }
            dx.additionalParameters += '--multi-dex'
            dx.additionalParameters += '--set-max-idx-number=48000'
            dx.additionalParameters += "--main-dex-list=$projectDir/dex.txt".toString()
            dx.additionalParameters += "--minimal-main-dex"
        }
    }

类列表文件格式

//主dex的全限定名(内部类用$分割)

// multidex
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/ZipUtil.class
android/support/multidex/ZipUtil$CentralDirectory.class

通过限定每个dex包的方法数,将某些类打包到主dex包中,防止noClassFoundError , 没毛病啊

另外参考下 另外几位大神的文章,受益匪浅:
filed 65536

但是,最后一个但是,我的问题是release环境下正常,甚至打的包在低版本下安装也是成功的,只是debug下无法安装一直是报64k错误;所以最后的解决方法是:

buildTypes{ ..
debug {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

在debug中使用混淆并设置userProguard可以开启压缩器压缩代码
然后debug就可以正常安装了 [手动尴尬]

在这里插入图片描述


结论:

  • gradle 很重要,要学习gradle构建脚本;
  • 及时查看官方文档;
  • 向网上大神们学习,知其然知其所以然;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值