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

时间:2012-06-12 23:33:13

标签: android adt proguard

由于我将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文件BTW以:

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

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

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

3 个答案:

答案 0 :(得分:15)

问题解决了。 在SO搜索线索之后,我终于找到了this hint,而不是Proguard的开发者本人:

-dontwarn scala.**

我没有使用任何包含“scala”的东西,我不知道scala是什么。但这让我想到了{{1>} 我自己的应用程序包

-dontwarn

这就是诀窍。

对于记录,导致我找到此提示的搜索词组是:proguard admob "can't find referenced class"

P.S。 Proguard的建议-dontwarn com.bta.** 甚至没有朝着正确的方向发展......

更新虽然You may need to specify additional library jars (using '-libraryjars')允许生成已签名的APK,但在我尝试使用以下内容时,它就会崩溃:

-dontwarn com.bta.**

什么样的恶梦。

更新2: ClassNotFoundException: com.bta.myapp.MyAppActivity in loader dalvik.system.PathClassLoader[/data/app/com.bta.myapp.myapp-1.apk]. 原来过于包容。我把它改为:

-dontwarn com.bta.**

现在一切顺利,没有发生任何事故。 真是个噩梦。

在浪费太多时间调试那些应该保存时间的工具之后,我发现了问题的根源。的 It's a bug in the Android SDK tools 即可。据记载已在r17中解决,但我使用的是今天的最新版本(2012年6月18日),尚未解决!(见评论24)。 Comment 25还描述了允许我现在继续进行实际开发的变通方法。

错误是复杂系统中的事实。但事实上,Proguard和为Proguard提供输入的构建工具都无法提供任何有用的错误信息(事实上它们恰恰相反),这表明Android开发工具的“方法论”中有些内容被打破recommended by Google

答案 1 :(得分:1)

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

答案 2 :(得分:1)

首先,调查一下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.**

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

  顺便说一下,我确实尝试通过指定添加我一直在使用的库   所有这些都在-libraryjars行,但Proguard的行为只有   更糟糕的是:如果不提供我引用的任何错误日志,它将会失败   上方。

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

仅限专家:事实上,您可以在没有-libraryjars条目的情况下使用有用的配置,但是您需要完全理解完全 Proguard正在对您的代码执行的操作。在我的头脑中,除了表现之外,我想不出为什么你想要这样做。