luckybilly / CC

业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.
https://luckybilly.github.io/CC-website/
Apache License 2.0
4.04k stars 636 forks source link

DexIndexOverflowException: field ID not in [0, 0xffff]: 65536 #78

Closed hhyy1986 closed 5 years ago

hhyy1986 commented 5 years ago

项目中有个lib的基础库,别的lib依赖于这个基础库都没有问题,但是只要是cc的组件依赖这个库就会报此错误,而且这个组件基本上是空的,我当前用的是cc2.0,这个错误是field ID not in [0, 0xffff]: 65536不是们常见的method ID not in [0, 0xffff]: 65536,而且我在项目中已经用了google提供的multidex方式分包

luckybilly commented 5 years ago

经沟通排查,这个问题是由以下情况导致:

  1. 基础库common_base引用了大量第三方库 (不推荐的做法)
  2. app module中使用了multidex
  3. home_component module中未使用multidex

在给app module打apk包时正常,而在给home_component module打apk包时就会出现65535的问题

解决问题的方式:

  1. 如果确定组件不需要单独打包运行,请在组件module加上:ext.alwaysLib=true
  2. 如果要以apk方式编译运行,请在组件module/build.gradle中加上multidex支持:
    android {
    defaultConfig {
        if (runAsApp) {
            applicationId "com.xxx.yyy"
            multiDexEnabled true
        }
        //.....
    }
    }
    dependencies {
    //...
    if (runAsApp) {
        api 'com.android.support:multidex:x.x.x'
    }
    }
  3. (推荐做法)将臃肿的common_base分解,不要为了图方便将使用到的所有第三方库依赖都放在这个基础库中,将三方库的依赖放在各个组件中(不要担心重复依赖,gradle会处理好),从根本上解决给组件打apk包时的65535问题
hhyy1986 commented 5 years ago

自己cc框架理解不深,和cc无关