自从我将 ADT 从 16 更新到 18(这要求 Proguard 从 4.6 更新到 4.8),Proguard 一直表现得很奇怪(而且不一致?)。
最新的此类问题是当我尝试导出已签名(发布)的 APK 时,我收到以下错误:
Proguard returned with error code 1. See console
Warning: com.bta.LibProj2: can't find referenced class com.bta.R$string
Warning: com.bta.MyDlg1: can't find referenced class com.bta.R$string
Warning: com.bta.MyMenu: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$attr
Warning: com.bta.R: can't find referenced class com.bta.R$drawable
Warning: com.bta.R: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$string
Warning: com.bta.myapp.MyAppActivity$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$ELicenseResponse: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.R$array: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$layout: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$xml: can't find referenced class com.bta.myapp.R
Warning: there were 49 unresolved references to classes or interfaces.
You may need to specify additional library jars (using '-libraryjars').
java.io.IOException: Please correct the above warnings first.
at proguard.Initializer.execute(Initializer.java:321)
at proguard.ProGuard.initialize(ProGuard.java:212)
at proguard.ProGuard.execute(ProGuard.java:87)
at proguard.ProGuard.main(ProGuard.java:493)
我确实注意到了在 proguard.cfg 中添加 -libraryjars
的建议,但我以前从来不需要这样做(而且我没有更改我的代码中的任何内容,我所做的只是更新 Proguard从 4.6 到 4.8)。这是否表明我的开发环境配置有问题?
此外,我还查看了 Proguard 的故障排除部分中的 Can't find referenced class : 它指的是忘记或忽略通过 -libraryjars
指定一个库(我承认),但我从未指定任何库并且它总是以前有效!发生了什么变化?
顺便说一下,我的 proguard.cfg 文件开头是:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
知道发生了什么事吗?为什么 Proguard 开始给我带来如此困难? (我已经用了一年多了,非常顺利)我的系统配置中是否缺少一些基本的东西?
顺便说一句,我确实尝试通过在 -libraryjars
行中指定所有库来添加我一直在使用的库,但是 Proguard 的行为只会变得更糟:它会在不提供任何错误日志的情况下失败我在上面引用过。
最佳答案
问题解决了。 在 SO 中寻找线索后,我终于找到了 this hint除了 Proguard 的开发者本人:
-dontwarn scala.**
我没有使用任何包含“scala”的东西,我也不知道 scala 是什么。但这让我想到了在我自己的应用程序包上放置一个-dontwarn
:
-dontwarn com.bta.**
成功了。
根据记录,导致我找到此提示的搜索短语是:proguard admob "can't find referenced class" .
附言Proguard 的建议 You may need to specify additional library jars (using '-libraryjars')
甚至不是正确的方向......
更新:虽然 -dontwarn com.bta.**
允许生成签名的 APK,但当我尝试使用以下命令启动它时它立即崩溃了:
ClassNotFoundException: com.bta.myapp.MyAppActivity in loader dalvik.system.PathClassLoader[/data/app/com.bta.myapp.myapp-1.apk].
什么样的恶梦。
更新 2: -dontwarn com.bta.**
结果太包容了。我改成了:
-dontwarn com.bta.myapp.MyAppActivity.R**
现在一切顺利,没有发生任何事故。
真是一场噩梦。
在调试本应节省我时间的工具上浪费了太多时间之后,我发现了问题的根源。 <强> It's a bug in the Android SDK tools 强>。它被记录为已在 r17 中解决,但我使用的是今天(2012 年 6 月 18 日)的最新版本,它尚未解决!(请参阅评论 24)。 Comment 25还描述了允许我现在继续我的实际开发的解决方法。
错误是复杂系统中不可或缺的事实。但事实上,无论是 Proguard 还是向 Proguard 提供输入的构建工具都无法提供任何有用的错误消息(事实上,它们所做的恰恰相反)表明 Android 开发工具的“方法论”存在问题 recommended by Google .
关于android - 为什么在我以前不需要时开始使用 -libraryjars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11006305/