低版本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 文件;
- 如果不替换 Application 类,请修改清单文件以设置 标记中的 android:name 为
但是,这些也是有局限性的;
我遇到的问题就是 在 android手机4.4版本中一直安装不了,报method ID not in [0, 0xffff]: 65536 错误; 估计就是
LinearAlloc
问题了;
主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构建脚本;- 及时查看官方文档;
- 向网上大神们学习,知其然知其所以然;