迁移到 AndroidX: Execution failed for task ':app:transformClassesWithMultidexlistForAlphaDebug'.

关于 AndroidX,可以参考: Hello world AndroidX

AndroidX 用来统一 Android 中的 support 包,之前我们通过引入 support 包的各个版本来使用支持包,现在我们可以通过使用 AndroidX 来使用支持包。从长远来看这当然是大有好处的,可以避免使用支持包中遇到的版本冲突、升级带来的各种问题。

不过,如果项目完全迁移到 AndroidX 风险还是太大。如果项目紧急的话,引入 AndroidX 成本都有些高,主要是因为一些三方库的原因。虽然一些使用特别多的三方库,比如 Glide 等都已经开始支持 AndroidX。

为了迁移到 AndroidX,Google 给开发者提供了一个工具:在 AS 的 Refactor 中提供了一项 Migrate to AndroidX 的选项。但选择了迁移之后,出现一些问题还需要开发者自己手动解决。

这里我们迁移之后出现了标题的问题:

* What went wrong:
Execution failed for task ':app:transformClassesWithMultidexlistForAlphaDebug'.
> com.android.build.api.transform.TransformException: Error while generating the main dex list.

显然是将 class 转换成 dex 的过程中出现了一些问题,不过只是上面的这行日志我们无法定位问题。所以,我们需要让 gradle 输出更多的错误信息,于是我们执行:

	gradlew build --stacktrace

来让 Gradle 输出错误栈信息:

Caused by: com.android.builder.multidex.D8MainDexList$MainDexListException: com.android.tools.r8.errors.CompilationError: Program type already present: com.a
libaba.android.arouter.routes.ARouter$$Group$$library
        at com.android.builder.multidex.D8MainDexList.generate(D8MainDexList.java:87)
        at com.android.build.gradle.internal.transforms.D8MainDexListTransform.transform(D8MainDexListTransform.kt:131)
        ... 54 more

显然是 ARouter$$Group$$library 类的问题,我们使用 Ctrl+N 来搜索这个类,发现出现了两个同样的类。这个类是使用阿里的 ARouter 的时候在编译期间生成的:

迁移到 AndroidX: Execution failed for task ':app:transformClassesWithMultidexlistForAlphaDebug'.

按照上面的错误提示,该类同时出现在了我们的两个模块 librarieslayout 下面,因而类冲突了。所以,接下来的问题就是要发现为什么会出现类冲突。

经过一层层排查发现是一个地方写错了:

迁移到 AndroidX: Execution failed for task ':app:transformClassesWithMultidexlistForAlphaDebug'.

这个是 layout 模块下面的冲突的类,我们发现它的路由地址是 /library/swipe_back,所以因为路由的地址是 library 的原因它在 layout 的模块下面生成了 ARouter$$Group$$Library。按照正确的写法它应该是出现在 layout 模块下面,并且路由的地址是 /layout/swipe_back,那样就应该被生成到 ARouter$$Group$$Layout 下面,就不会多出一个类 ARouter$$Group$$Library 了。

虽然,最终问题的原因很简单,但是我们看到,发现问题的过程中需要自己有思路的去排查,而不是除了问题立刻 Google 或者 SOF。