对内部开发的库(在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支持设计库等)。那么,还有什么呢?
答案 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);
}
// ,,,
}
我能够让错误消失。