android - 当其中一个模块使用 Multidex 时,在没有 Clean 的情况下在两个模块的运行配置之间切换

标签 android android-studio android-multidex

在我的 Android Studio 项目中,我有几个模块,其中只有两个是应用程序模块(我们称它们为 AB),其他都是库模块,一些由 AB 使用。
对于模块 A,multidex 已启用,而对于 B 则未启用。

我遇到的问题是,当从一种配置(运行 按钮旁边的下拉菜单)切换到另一种配置时,我总是会遇到一些错误。让它发挥作用的唯一方法是清理整个项目。

当从 A 切换到 B 而没有清理时,我收到以下错误:

    UNEXPECTED TOP-LEVEL EXCEPTION:
java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:215)
    at java.util.zip.ZipFile.<init>(ZipFile.java:145)
    at java.util.zip.ZipFile.<init>(ZipFile.java:159)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:672)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
8 errors; aborting (all are similar to the one above, so I omitted them)
Error:Execution failed for task ':Bapp'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

当从 B 切换到 A 时,A 应用程序随后运行,但在运行时立即失败,说它找不到我的自定义 Application APK 中的类:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.kushtrim.mobile, PID: 3457
              java.lang.RuntimeException: Unable to instantiate application com.kushtrim.application.MyAApplication: java.lang.ClassNotFoundException: Didn't find class "com.kushtrim.application.MyAApplication" on path: DexPathList[[zip file "/data/app/com.kushtrim.mobile-1/base.apk"],nativeLibraryDirectories=[/data/app/com.kushtrim.mobile-1/lib/x86, /data/app/com.kushtrim.mobile-1/base.apk!/lib/x86, /vendor/lib, /system/lib]]
                  at android.app.LoadedApk.makeApplication(LoadedApk.java:578)
                  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680)
                  at android.app.ActivityThread.-wrap1(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:148)
                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我指定了 Multidex 用法,因为我坚信这就是问题所在,因为如果我为两个项目都打开它,则不会弹出任何错误,也不需要清理。

总而言之,有没有办法解决这个问题,从而避免清理步骤?

最佳答案

在android studio 中,multidex 有问题。但是从 gradle 1.4.0-beta 这个问题得到解决。请参阅来自 here 的官方发行说明.

问题是,项目正在生成不同的可模拟的 android.jar。哪个冲突 multidex 构建。

但是从 gradle 1.4.0 开始:多个模块(例如 app 和 lib)现在共享同一个可模拟的 android.jar(用于单元测试),它只生成一次。删除 $rootDir/build 以重新生成它。

仅供引用,Android studio 2.1.0 存在一些严重的安全问题。所以推荐新版本的android studio。

关于android - 当其中一个模块使用 Multidex 时,在没有 Clean 的情况下在两个模块的运行配置之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539957/

相关文章:

java - 如何从 firebase 实时数据库中获取字符串数组

android - Xamarin Forms 图像不显示

AndroidX 与 Android.support RuntimeException

android - 在没有 Gradle 的情况下为您的应用程序配置 Multidex

android - Gradle 在 linux box 上构建失败,出现 "Malformed input or input contains unmappable characters"

java - 无法在Android上的外部存储上创建文件夹

java - Android 构建时代号一个 Dex 问题?

android-studio - Android Studio - 更新到 4.1 后启动时出现插件错误消息

android - NDKBuild 失败

android - resValue 梯度错误 : Unsupported type "String" in "generated.xml"