【问题标题】:Proguard complains about missing classes in external JARs. How to solve this correctly?Proguard 抱怨外部 JAR 中缺少类。如何正确解决这个问题?
【发布时间】:2014-08-29 08:14:28
【问题描述】:

我试图混淆一个在 Eclipse 中使用 Dropbox 和 Proguard 的 Android 4+ 应用程序。到目前为止,我还没有使用 Proguard 的经验,因此我在 SO 上使用了不同的教程和答案来配置我的 proguard-project.txt

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

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

当我尝试使用 File/Export.../Export Android Application/... 对话框导出 APK 时,创建失败并出现 Proguard 错误:

[2014-08-29 09:50:30 - MyApp] Proguard returned with error code 1. See console
[2014-08-29 09:50:30 - MyApp] Note: there were 367 duplicate class definitions.
[2014-08-29 09:50:30 - MyApp] Warning: org.apache.commons.logging.impl.ServletContextCleaner: can't find superclass or interface javax.servlet.ServletContextListener
[2014-08-29 09:50:30 - MyApp] Warning: org.apache.http.entity.mime.FormBodyPart: can't find superclass or interface org.apache.james.mime4j.message.BodyPart
...
[2014-08-29 09:50:30 - MyApp] Warning: library class android.net.http.AndroidHttpClient extends or implements program class org.apache.http.client.HttpClient
...
[2014-08-29 09:50:30 - MyApp] Warning: org.bouncycastle.x509.util.LDAPStoreHelper: can't find referenced class javax.naming.directory.DirContext
[2014-08-29 09:50:30 - MyApp]       You should check if you need to specify additional program jars.
[2014-08-29 09:50:30 - MyApp] Warning: there were 223 unresolved references to classes or interfaces.
[2014-08-29 09:50:30 - MyApp]          You may need to specify additional library jars (using '-libraryjars').
[2014-08-29 09:50:30 - MyApp] Warning: there were 1 instances of library classes depending on program classes.
[2014-08-29 09:50:30 - MyApp]          You must avoid such dependencies, since the program classes will
[2014-08-29 09:50:30 - MyApp]          be processed, while the library classes will remain unchanged.
[2014-08-29 09:50:30 - MyApp] Warning: there were 13 unresolved references to program class members.
[2014-08-29 09:50:30 - MyApp]          Your input classes appear to be inconsistent.
[2014-08-29 09:50:30 - MyApp]          You may need to recompile them and try again.
[2014-08-29 09:50:30 - MyApp]          Alternatively, you may have to specify the option 
[2014-08-29 09:50:30 - MyApp]          '-dontskipnonpubliclibraryclassmembers'.
[2014-08-29 09:50:30 - MyApp] java.io.IOException: Please correct the above warnings first.
[2014-08-29 09:50:30 - MyApp]   at proguard.Initializer.execute(Initializer.java:321)
[2014-08-29 09:50:30 - MyApp]   at proguard.ProGuard.initialize(ProGuard.java:211)
[2014-08-29 09:50:30 - MyApp]   at proguard.ProGuard.execute(ProGuard.java:86)
[2014-08-29 09:50:30 - MyApp]   at proguard.ProGuard.main(ProGuard.java:492) 

我尝试的第一件事是添加一些-libraryjars ... 命令:

-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/bcprov-jdk16-146.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/commons-logging-1.1.1.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/dropbox-android-sdk-1.6.1.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/httpclient-4.0.3.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/httpcore-4.0.1.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/httpmime-4.0.3.jar'
-libraryjars 'F:/Path/To/Workspace/Third Party/Dropbox/dropbox-android-sdk-1.6.1/lib/json_simple-1.1.jar'

这并不能解决问题。实际上现在有 2468 个重复的类定义(之前是 367 个......)

接下来我尝试忽略警告:

-dontwarn org.bouncycastle.** 
-dontwarn org.apache.** 

这解决了问题! APK 的创建现在运行没有任何错误。好吧...但是我对此没有很好的感觉。 忽略警告真的是解决此问题的最佳方式吗?这是处理此类问题的“正确”方式吗?

当我在我的设备上运行 APK 并尝试使用 Dropbox 功能时,应用程序崩溃了。但这可以通过添加以下内容来解决:

-keep class org.** { *; }
-keep class com.dropbox.** {*;}

这样可以防止 Dropbox 代码被混淆。但我再次不确定这是否是处理此问题的正确方法。

到目前为止,该应用似乎在此配置下运行良好。但是有什么方法可以确保 Proguard 没有破坏任何东西(除了在每次创建应用程序时对每个应用程序功能进行完整的 beta 测试?)

非常感谢!

【问题讨论】:

    标签: java android eclipse proguard


    【解决方案1】:

    您的第 3 方库正在处理两次。在这种情况下将它们添加到另一个文件夹到lib 并将以下行添加到proguard.cfg 文件中。

     -injars lib/dropbox.jar 
    

    Pro Guard Troubleshooting

    注意:程序/库类的重复定义

    您的程序 jar 或库 jar 包含多个 列出的类。 ProGuard 继续照常处理,仅 考虑第一个定义。该警告可能表明 虽然有些问题,所以建议删除重复项。一种 方便的方法是在输入 jar 上指定过滤器或 图书馆罐子。您可以通过指定 -dontnote 选项。

    如控制台日志中指向ProGuard Troubleshooting page 的链接所示,您应该将project.properties 中的目标更改为包含缺失类的目标。在这种情况下:“android-18”或者可能是“Google Inc.:Google APIs:18”。

    您仍然可以在 AndroidManifest.xml 中指定不同的 minSdkVersion。

    您应该指定任何-libraryjars 选项,因为Android 构建过程已经为您指定了这些选项——您现在只会看到有关重复类的警告。事实上,Android 构建过程也为您指定了大多数其他选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2015-10-31
      • 2018-06-25
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多