2014-08-29 108 views
1

我想在Eclipse中混淆使用Dropbox和Proguard的Android 4+应用程序。到目前为止,我有使用ProGuard没有经验,因此我用不同的教程和答案在这里SO配置我proguard-project.txtProguard抱怨外部JAR中缺少类。如何正确解决这个问题?

-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/...对话框的创建失败的Proguard的错误导出APK:

[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代码不被obfruscated。但是我不确定这是否是正确的处理方法。

到目前为止,该应用似乎对此配置正常工作。但有什么办法,我可以肯定的Proguard的没有爆发什么

感谢您非常(运行的所有应用功能的完整的beta测试每次应用程序创建?旁边)!

回答

1

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

-injars lib/dropbox.jar 

Pro Guard Troubleshooting

Note: duplicate definition of program/library class

Your program jars or library jars contain multiple definitions of the listed classes. ProGuard continues processing as usual, only considering the first definitions. The warning may be an indication of some problem though, so it's advisable to remove the duplicates. A convenient way to do so is by specifying filters on the input jars or library jars. You can switch off these notes by specifying the -dontnote option.

正如在控制台日志的链接ProGuard Troubleshooting page表示,你应该在project.properties改变目标,以包含缺少的类的对象。在这种情况下:“android-18”或者“Google Inc.:Google APIs:18”。

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

你应该指定任何-libraryjars选项,因为Android编译过程中就已经规定了你的选择 - 你只看到重复类的警告了。实际上,Android构建过程也为您指定了大多数其他选项。