android - 为什么在我以前不需要时开始使用 -libraryjars?

标签 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 文件开头是:

-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/

相关文章:

java - java中的简单异构k-ary树(用于创建网络模拟器)

java - 混淆 Android 库项目/apklib

android - 在 Kitkat 的 WebView 中播放 youtube 视频

java - 在外部存储中创建文件夹

ImageView矩阵中的Android中心位图

android - 我怎样才能告诉 proguard 假设一个包没有被使用?

android - 如何找到哪个库正在使用缺少的类并导致 Proguard 错误?

android - DateTimeParseException - 无法在索引 15 处进行解析

java - 如何正确使用 Java 泛型来实现 ADT 的数组

java - 无法实例化 Activity ComponentInfo; java.lang.NullPointerException