当前位置: 首页 > 知识库问答 >
问题:

为什么在我以前从来都不需要的时候开始使用-libraryjars?

乐正宜人
2023-03-14

自从我将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中添加-库罐子的建议,但是我以前从来不需要这样做(我没有改变我的代码中的任何东西,我所做的只是将ProGuard从4.6更新到4.8)。这是否意味着我的开发环境配置有问题?

此外,我还查看了Proguard的疑难解答部分中的“找不到引用的类”:它指的是忘记或忽略通过-libraryjars(我承认),指定一个库,但我从未指定任何库,而且它以前一直工作!什么改变了?

我的前卫。cfg文件BTW以以下内容开头:

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

知道这是怎么回事吗?为什么普罗门卫开始让我这么难过?(我用它平稳地滑行了一年多)我的系统配置中是否缺少一些基本的东西?

顺便说一句,我确实试图添加我一直在使用的库,通过在-Library aryjars行中指定它们,但是ProGuard的行为只会变得更糟:它会失败,而不会给出我上面引用的任何错误日志。

共有3个答案

丌官翰采
2023-03-14

首先,调查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$string在那里?不是源代码,我们现在不关心源代码。是的。有班级档案吗?如果它在文件系统中,它是否在Proguard配置文件中实际引用?确保你知道它应该如何被包括在内;什么是引用com。bta。R$string?您可能会使用javap来解决这个问题。

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

-keep class com.bta.**

考虑library JAR的建议只是一个建议。这显然是对proguard的一种常见误解,因此添加一个注释来指明人们的方向是完全合理的。它没有解决你的问题,但这并不意味着它不是有用的建议。

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

你可能需要那些-库罐条目。他们不会让问题变得更糟。您已经从一个有N个错误的配置(没有指定-图书馆罐)变成了一个有N-1个错误的配置。修复N-1解决方案。如果有的话,它会给出什么错误?如果没有错误,如果您重新打开警告会发生什么?

仅限专家:事实上,您可以在不使用-libraryjars条目的情况下进行有用的配置,但您需要完全了解Proguard在代码中的具体操作。在我的脑海里,除了表现之外,我想不出任何理由来解释你为什么要这么做。

巫化
2023-03-14

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

都建树
2023-03-14

问题解决了。经过在SO中对线索的大量搜索,我终于发现了这个提示,不是别人,正是ProGuard的开发人员自己:

-dontwarn scala.**

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

-dontwarn com.bta.**

成功了。

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

P. S.ProGuard的建议您可能需要指定额外的库jars(使用'-库jars')甚至不是在正确的方向...

更新:While-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工具中的一个bug。它被记录为已经在r17中解决,但我使用的是今天(2012年6月18日)的最新版本,它还没有解决!(见评论24)。注释25还描述了允许我现在继续实际开发的变通方法。

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

 类似资料:
  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 问题内容: 我使用类只有很短的时间,编写方法时,我使所有变量都引用了self,例如self.foo。 但是,我在浏览《 wxPython in Action》 一书时发现,“ self”并没有一直使用。例如: 下面的一个确实使用“自我”。 如果我没记错的话,“自我”是指该类的特定实例,那么什么时候没有必要?有一般的经验法则吗? 问题答案: 您用于引用当前实例的属性。 您用于引用父类的方法。 如果仅

  • 谷歌正在通过电子邮件通知Android位置权限的更改: 我们将于2016年10月15日进行更改,这将影响针对API版本21(Android 5.0、Lollipop)或更高版本的应用程序,这些应用程序使用ACCESS_FINE_LOCATION但没有明确具有“android.hardware.location.gps”用途功能。展望未来,这些应用程序将可安装在没有GPS硬件的设备上。在大多数情况下

  • 问题内容: 当我尝试按照本指南进行SQLAlchemy Relation Example时:基本关系模式 我有这个代码 它运作良好,但是在指南中,该模型应为: 为什么我不需要或在我的示例中?什么时候应该使用其中一个? 问题答案: 如果使用,则无需在第二个表上声明关系。 如果 不 使用,并分别定义,则如果不使用,则sqlalchemy将不知道如何连接关系,因此修改一个也将修改另一个。 因此,在您的示

  • 问题内容: 我如何使用AtomicBoolean?该类的作用是什么? 问题答案: 当有多个线程需要检查并更改布尔值时。例如: 这不是线程安全的。您可以使用以下方法修复它: