自从我将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的行为只会变得更糟:它会失败,而不会给出我上面引用的任何错误日志。
首先,调查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在代码中的具体操作。在我的脑海里,除了表现之外,我想不出任何理由来解释你为什么要这么做。
在SDK和ADT的最新更新之后,我遇到了类似的问题,最终要求我从头开始检查我的项目。尝试签出项目的新副本,看看是否有效。
问题解决了。经过在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?该类的作用是什么? 问题答案: 当有多个线程需要检查并更改布尔值时。例如: 这不是线程安全的。您可以使用以下方法修复它: