Android构建系统报告:“编写输出的麻烦:不应该发生”

时间:2016-03-16 16:54:25

标签: android gradle android-gradle

对内部开发的库(在Bitbucket上托管的Maven存储库中发布)进行一些更改后,我尝试更新Android应用程序以使用新版本的库。在应用程序构建文件中增加库依赖项的版本之后,Gradle无法生成APK,无法完成某些与dex相关的任务(在构建系统的1.2.3版本上它是preDexDebug,它是{1.5}上的transformClassesWithDexForDebug)。更具体地说,报告的错误是:

trouble writing output: shouldn't happen
Error:Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_40\bin\java.exe'' finished with non-zero exit value 2

是的,具体具有讽刺意味。我认为这不是超过65K方法的问题,因为the message would indeed be more specific比“不应该发生”。我之前已经有了support-v4的重复版本(来自Facebook SDK,Android支持设计库等)。那么,还有什么呢?

1 个答案:

答案 0 :(得分:0)

罪魁祸首是一种通用方法。

更准确地说,通用方法似乎无法访问static子句正文中的final else个字段。这样,我的意思是Android构建系统无法正确转换DEX格式的这种情况。当然,构建时一切都很好,因为使用了javac。但是,当涉及DEX时,会弹出该限制,并显示一条难以理解且令人震惊的错误消息。什么不应该发生让开发人员搞乱Java等复杂的语言而不知道他们在做什么。

对于那些仍然难以相信DEX格式已经瘫痪的人来说,这是非常糟糕的。 Java 5的功能(甚至不是6个,7个或8个......我认为这些东西属于Java 5)让我给大家展示一个例子。在我的图书馆,我有以下内容:

private static final String TAG = MyClass.getClass().getSimpleName();

@Override
public <T> T getValue(String key, Class<T> type) {
    String value = null;
    if (data.containsKey(key)) {
        value = data.get(key);
    } else {
        String message = "Error getting a configuration value with key: " + key;
        Log.e(TAG, message);
        return null;
    }
    // ...
}

并且可怕的“不应该发生”的错误信息一直在提高它丑陋的头脑。但是,只需反转if条件:

@Override
public <T> T getValue(String key, Class<T> type) {
    String value = null;
    if (!data.containsKey(key)) {
        String message = "Error getting a configuration value with key: " + key;
        Log.e(TAG, message);
        return null;
    } else {
        value = data.get(key);
    }
    // ,,,
}

我能够让错误消失。