当其中一个模块使用Multidex时,在两个模块的运行配置之间切换而不使用Clean

时间:2016-07-23 08:53:12

标签: android android-studio multidex

在我的Android Studio项目中,我有几个模块,其中只有两个是应用程序模块(让我们称之为 A B ),以及其他是图书馆模块,有些用于 A B 对于模块 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应用程序会运行,但会在运行时立即失败,并说它无法找到我的自定义 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 用法,因为我坚信这就是问题所在,因为如果我为两个项目打开它,就不会弹出错误,也不需要清理

总而言之,有没有办法解决这个问题,以便可以避免干净的步骤?

1 个答案:

答案 0 :(得分:1)

在android studio中,multidex存在问题。但是从gradle 1.4.0-beta这个问题得到解决。请参阅here的正式发布说明。

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

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

仅为了您的信息,Android studio 2.1.0存在一些严重的安全问题。所以推荐新版本的android studio。