为什么在我以前从未需要它时开始使用-libraryjars?

自从我将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的故障排除部分找不到引用的类 :它指的是忘记或忽略通过-libraryjars指定一个库(我承认),但我从未指定任何库,它总是在以前工作! 改变了什么?

我的proguard.cfg文件BTW以:

 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

知道发生了什么事吗? Proguard为什么开始给我这么艰难的时间? (我现在用它已经用了一年多的时间非常顺利)我的系统配置中是否有一些基本的东西?

顺便说一句,我确实尝试通过在-libraryjars行中指定所有库来添加我一直使用的库,但是Proguard的行为只会变得更糟:如果没有给出我上面引用的任何错误日志,它将会失败。

问题解决了。 在SO搜索线索之后,我终于发现了Proguard的开发者本人的暗示 :

 -dontwarn scala.** 

我没有使用任何包含“scala”的内容,我不知道scala是什么。 但是这给了我一个在我自己的应用程序包上放置-dontwarn的想法:

 -dontwarn com.bta.** 

这就是诀窍。

为了记录,导致我find这个提示的搜索短语是: proguard admob“找不到引用的类” 。

PS 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** 

现在一切顺利,没有发生任何事故。 什么样的恶梦。

在浪费了太多时间调试那些本来可以节省时间的工具之后,我发现了问题的根源。 这是Android SDK工具中的一个错误 。 据记载已在r17中解决,但我使用的是今天(2012年6月18日)的最新版本,但尚未解决! (见评论24)。 评论25还描述了允许我现在继续进行实际开发的变通方法。

错误是复杂系统中的生命现实。 但事实上,无论是Proguard还是为Proguard提供输入的构建工具都无法提供任何有用的错误信息(事实上它们恰恰相反),这表明Google推荐的Android开发工具的“方法论”中存在某些问题。

最新的SDK和ADT更新后,我遇到了类似的问题,最终要求我从头开始检查我的项目。 尝试检查项目的新副本,看看是否有效。

首先,调查Proguard告诉你的事情:

 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 

它找不到com.bta.R $ string。 为什么不? 是com.bta.R $字符串吗? 不是源代码,我们此时并不关心源代码。 是.class文件吗? 如果它在文件系统中,它是否在Proguard配置文件中实际引用? 确保你知道应该如何包含它; 什么是引用com.bta.R $ string? 您可能会使用javap来解决这个问题。

在这种情况下使用的更好的大锤不是要关闭警告(因为它们实际上警告你有关重要的事情),这是告诉Proguard保留缺少的com.bta类,如下所示:

 -keep class com.bta.** 

考虑图书馆jar子的建议只是一个建议。 这显然是对proguard的一个常见错误配置,所以在这个方向添加一个注释指向人是完全合理的。 它并没有解决你的问题,但这并不意味着它没有用处。

顺便说一句,我确实尝试通过在-libraryjars行中指定所有库来添加我一直使用的库,但是Proguard的行为只会变得更糟:如果没有给出我上面引用的任何错误日志,它将会失败。

您可能需要那些-libraryjars条目。 它们不会使问题变得更糟。 您已经从具有N个错误的配置(未指定-libraryjars)转变为具有N-1个错误的配置。 修复N – 1解决方案。 它有什么错误,如果有的话? 如果没有错误,如果重新打开警告会发生什么?

仅限专家:实际上,您可以在没有-libraryjars条目的情况下进行有用的配置,但是您需要完全了解Proguard对您的代码所做的事情。 除了表现之外,我无法想到为什么你想要这样做的原因。