我正在尝试混淆在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测试?)
非常感谢你!
答案 0 :(得分:1)
您的第三方库正在处理两次。在这种情况下将它们添加到另一个文件夹lib
并将以下行添加到proguard.cfg
文件。
-injars lib/dropbox.jar
注意:程序/库类的重复定义
您的程序罐或库罐包含多个定义 列出的课程。 ProGuard仅继续照常处理 考虑第一个定义。警告可能是一个迹象 虽然有些问题,但建议删除重复项。一个 这样做的便捷方法是在输入罐或上指定过滤器 图书馆罐子。您可以通过指定来关闭这些音符 -dontnote选项。
如控制台日志中ProGuard Troubleshooting page的链接所示,您应该将project.properties
中的目标更改为包含缺失类的目标。在这种情况下:" android-18"或者可能"谷歌公司:谷歌API:18"。
您仍然可以在AndroidManifest.xml
中指定不同的minSdkVersion。
您应该不指定任何-libraryjars
选项,因为Android构建过程已经为您指定了这些选项 - 您现在只会看到有关重复类的警告。实际上,Android构建过程也为您指定了大多数其他选项。