【问题标题】:Proguard problems with apk creation创建 apk 的 Proguard 问题
【发布时间】:2023-04-12 20:39:01
【问题描述】:

好吧,这让我快疯了一天。我主要是一个 iOS 人,所以我对 Proguard 和其他东西不太了解。我制作了一个包含 Dropbox 和 Google Drive API 的 Android 应用程序。如果我通过 Eclipse 将它部署在手机上,该应用程序运行良好,但是当我尝试导出应用程序以生成 apk 文件时,我在控制台上遇到了一个令人讨厌的错误。 我的 project.properties 文件是这样的......

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt:proguard-google-api-client.txt

# Project target.
target=android-17
android.library=false

错误对话框是这样的... PROJECT_FOLDER_NAME/proguard-project.txt 不存在或不是常规文件

所以我编辑了我的 project.properties 并删除了 proguard-project.txt 部分。

现在在创建 apk 时,我在控制台上收到这些错误...

[2013-05-15 18:48:28 - BackMyAppUp] Proguard returned with error code 1. See console
[2013-05-15 18:48:28 - BackMyAppUp] Note: there were 367 duplicate class definitions.
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.commons.logging.impl.ServletContextCleaner: can't find superclass or interface javax.servlet.ServletContextListener
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.FormBodyPart: can't find superclass or interface org.apache.james.mime4j.message.BodyPart
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.HttpMultipart: can't find superclass or interface org.apache.james.mime4j.message.Multipart
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.MinimalField: can't find superclass or interface org.apache.james.mime4j.parser.Field
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.content.AbstractContentBody: can't find superclass or interface org.apache.james.mime4j.message.SingleBody
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.content.ContentBody: can't find superclass or interface org.apache.james.mime4j.message.Body
[2013-05-15 18:48:28 - BackMyAppUp] Warning: org.apache.http.entity.mime.content.ContentBody: can't find superclass or interface org.apache.james.mime4j.descriptor.ContentDescriptor
[2013-05-15 18:48:28 - BackMyAppUp] Warning: library class android.net.http.AndroidHttpClient extends or implements program class org.apache.http.client.HttpClient
[2013-05-15 18:48:28 - BackMyAppUp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced class com.google.android.gms.R
[2013-05-15 18:48:28 - BackMyAppUp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced class com.google.android.gms.R$string
[2013-05-15 18:48:28 - BackMyAppUp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced class com.google.android.gms.R$string
[2013-05-15 18:48:28 - BackMyAppUp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced class com.google.android.gms.R$string

还有大约 300 条类似的行。

如果我使用从 bin 文件夹生成的 apk,谷歌驱动器功能在手机中不起作用,但如果我通过 Ecipse 部署它就可以使用。 请帮帮我。

【问题讨论】:

标签: java android eclipse duplicates proguard


【解决方案1】:

FWIW,在升级到 ADT 22 后,我遇到了 800 多个类似的错误,而 Proguard 配置以前运行良好,该应用程序在没有 Proguard 的情况下在设备上也崩溃了,出现 ClassDefNotFound 错误。

最终的解决方案是在我的主项目及其所有库项目的构建路径编辑器的 Order and Export 选项卡上勾选“Android Private Libraries”。

【讨论】:

  • 它已经打勾了,我添加了一些 -dontwarn 的东西,现在 apk 已创建,但应用程序在 Google Drive 上传部分崩溃了。
【解决方案2】:

您要么想使用 Proguard(优化、混淆等),要么不使用。

如果您不想要,只需在 project.properties 中注释(用 # 号)指向您的 proguard 配置的部分:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt:proguard-google-api-client.txt

如果您愿意,解决方案是保持该行不变,并创建以下文件:proguard-project.txt 和 proguard-google-api-client.txt

对于 proguard-google-api-client.txt,您可以在此处找到示例: https://google-api-java-client.googlecode.com/hg/google-api-client-assembly/proguard-google-api-client.txt

对于 proguard-project.txt,这取决于您在归档另一个文件后遇到的错误。 您可能需要添加几个:

-libjars <path_to_a_jar_used_in_app>

和其他一些 -dontwarn,取决于您收到的警告...

【讨论】:

  • 如果我不通过在项目 txt 中注释来使用 proguard,则保管箱部分可以正常工作,但 Google 驱动器部分不能。
  • 好的,所以,另一个疯狂的猜测。在您的 project.properties 中尝试以下行: proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-google-api-client.txt 在 proguard-google-api-client 中。 txt (如果需要,创建它),复制我在上一个答案中给出的 proguard 配置。如果它不工作,请说明它是否在构建过程中不工作,在模拟器上执行,或者在你的物理手机上。
  • 简短说明:您的-libjars 提示帮助我解决了我的问题,但正确的命令是-libraryjars。也许这有助于其他人避免几分钟的困惑和搜索:-)
【解决方案3】:

这感觉有点愚蠢,3 天以来我一直在使用 proguard,但问题是我在发布 apk 中使用了调试密钥库 SHA1 密钥,因此 Google 驱动器应用程序崩溃了,我在 Google API 中使用了正确的 SHA1 密钥控制台来解决它。

【讨论】: