gpt4 book ai didi

android - 为什么将 'debuggable true' 添加到我的 Android 版本构建类型会消除神秘错误?

转载 作者:行者123 更新时间:2023-11-29 02:37:19 25 4
gpt4 key购买 nike

我已经在应用程序上开发了一段时间,并针对调试构建类型进行了测试,没有构建问题。今天,我尝试构建发布构建类型,但出现错误

错误:预期资源类型为 drawable [ResourceType]

此错误发生在 Butterknife 生成的 .java 文件中。经过大量的反复试验(包括清理缓存和使缓存无效)后,我发现如果我将 debuggable true 添加到我的应用程序 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,但无济于事。老实说,我不想使用这样的解决方案投入生产。)

最佳答案

我觉得您遇到了混淆问题。Proguard 用于在安装前删除死代码并缩小包大小。通常在发布版本上 minifyEnabled = true。使其可调试可能会阻止它执行此操作。

有一个 proguards 规则文件告诉它进行异常(exception)处理。这是它的工作原理。

Proguard 梳理您的代码并查找未使用的代码(如“lint”),然后将其删除,因为从来没有人调用过该代码。

但是,Bus 或 Butterknife 等工具使用反射或注解来访问代码。这使 IDE 和 LINT 认为它未被使用并被删除。因此,代码将无法在发布中正确编译,因为它将缺少项目运行所需的组件。

考虑设置 minifyEnable = false或者尝试将其添加到您的混淆器规则文件中

-keep class butterknife.*
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }

如果还是不行,你可能还有其他事情要做。奇怪的是缺少“资源”部分,这让我觉得未使用的资源也由于 butterknife 而被删除。所以我不会将 debuggable 留在那里,如果上述解决方案无法修复它,我只会设置 minifyEnabled = false。

如果这不起作用,请尝试运行:

bash gradlew assembleRelease --debug 并从那里寻找实际的投诉和问题。

祝你好运,希望这能解决你的问题。

关于android - 为什么将 'debuggable true' 添加到我的 Android 版本构建类型会消除神秘错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com