我一直在应用程序上开发一段时间并针对调试构建类型进行测试而没有构建问题。今天,我尝试构建发布版本类型,我收到了错误
错误:drawable [ResourceType]类型的预期资源
Butterknife生成的.java文件中发生此错误。经过相当多的试验和错误(包括执行干净和无效的缓存)后,我发现如果我将debuggable true
添加到我的app build.gradle文件中的发布版本类型,构建会成功,因此:
release {
debuggable true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
如果我注释掉其他属性,它也会构建:
release {
debuggable true
//minifyEnabled true
//proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
但如果我也注释掉debuggable true
,那么构建会像以前一样失败。所以看来无论我需要在我的发布版本中使用debuggable true
,即使我不想在那里。
任何可能导致此问题的想法?更重要的是,任何想法如何在没有debuggable true
且没有抑制lint警告的情况下让错误消失?
(我已经尝试在手工编码的.java文件中抑制特定声明上的lint错误ResourceType但是没有用.TBH,我不想用这样的解决方案投入生产。)
答案 0 :(得分:0)
听起来像你正面临混淆问题。 Proguard用于在安装之前删除死代码并缩小包大小。通常,版本构建时minifyEnabled = true。使其可调试可能会阻止它这样做。
有一个proguards规则文件,告诉它做出异常。这是它的工作原理。
Proguard梳理您的代码并查找未使用的代码,如“lint”,然后删除它,因为没有人调用代码。
但是,像Bus或Butterknife这样的工具使用反射或注释来访问代码。这使得IDE和LINT相信它未被使用并被删除。因此,代码将无法在发布中正确编译,因为它将缺少项目运行所必需的组件。
考虑设置minifyEnable = false 要么 尝试将此添加到您的proguard规则文件
-keep class butterknife.*
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }
如果仍然无效,您可能还有其他事情发生。奇怪的部分是缺少“资源”的部分,它让我觉得由于奶油刀也会删除未使用的资源。所以我不会在那里留下debuggable,如果上面的解决方案没有修复它,我会设置minifyEnabled = false。
如果这不起作用,请尝试运行:
bash gradlew assembleRelease --debug并从那里寻找实际的投诉和问题。
祝你好运,希望能解决你的问题。