Android Proguard兼容性库

4
你好,我正在编写一个应用程序,使用了兼容性库,并在应用中使用了视图分页器。同时我还使用了一个操作栏库,我从这个链接获取了该库。

https://github.com/johannilsson/android-actionbar

我的proguard.cfg文件长这样

-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

#keep all classes that might be used in XML layouts
-keep public class * extends android.view.View
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v4.Fragment


#keep all public and protected methods that could be used by java reflection
-keepclassmembernames class * {
    public protected <methods>;
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}


-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-dontwarn **CompatHoneycomb
-dontwarn org.htmlcleaner.*

然后我的defualt.properties看起来像这样

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-8
android.library.reference.1=../android-actionbar/actionbar
proguard.config=proguard.cfg

然而,当我运行编译和签名我的应用程序时,出现一个对话框,上面写着“Proguard返回错误代码1。请参阅控制台。”
因此,我查看了我的控制台,上面写着以下内容。
[2011-11-01 01:48:39 - Test App] Proguard returned with error code 1. See console
[2011-11-01 01:48:39 - Test App] proguard.ParseException: Unknown option 'Manager' in argument number 9
[2011-11-01 01:48:39 - Test App]    at proguard.ConfigurationParser.parse(ConfigurationParser.java:170)
[2011-11-01 01:48:39 - Test App]    at proguard.ProGuard.main(ProGuard.java:491)

但是对我来说这并没有太多意义,我不知道该怎么做才能让它工作?有什么想法吗?我之前在一个没有使用兼容库的应用程序上使用过那个proguard脚本,但是,我从那个脚本中得到的信息说它应该与兼容库一起使用,但实际上并没有?有人有任何想法吗?非常感谢。
===编辑===
从我的构建路径中删除空格后,我能够进展一点,但仍然失败了,出现错误1,控制台现在有一个新的错误列表,看起来像这样。
[2011-11-01 14:01:20 - TestApp] Proguard returned with error code 1. See console
[2011-11-01 14:01:20 - TestApp] Warning: android.support.v4.os.ParcelableCompatCreatorHoneycombMR2: can't find superclass or interface android.os.Parcelable$ClassLoaderCreator
[2011-11-01 14:01:20 - TestApp] Warning: android.support.v4.os.ParcelableCompatCreatorHoneycombMR2: can't find referenced class android.os.Parcelable$ClassLoaderCreator
[2011-11-01 14:01:20 - TestApp] Warning: android.support.v4.os.ParcelableCompatCreatorHoneycombMR2: can't find referenced class android.os.Parcelable$ClassLoaderCreator
[2011-11-01 14:01:20 - TestApp] Warning: there were 3 unresolved references to classes or interfaces.
[2011-11-01 14:01:20 - TestApp]          You may need to specify additional library jars (using '-libraryjars'),
[2011-11-01 14:01:20 - TestApp]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-11-01 14:01:20 - TestApp] java.io.IOException: Please correct the above warnings first.
[2011-11-01 14:01:20 - TestApp]     at proguard.Initializer.execute(Initializer.java:308)
[2011-11-01 14:01:20 - TestApp]     at proguard.ProGuard.initialize(ProGuard.java:210)
[2011-11-01 14:01:20 - TestApp]     at proguard.ProGuard.execute(ProGuard.java:85)
[2011-11-01 14:01:20 - TestApp]     at proguard.ProGuard.main(ProGuard.java:499)
2个回答

5

我猜测你的项目路径包含空格(在这种情况下为单词Manager)。最新的Eclipse Android插件(ADT R14)仍存在将包含空格的路径传递给ProGuard的问题。替代解决方案:

  • 使用基于Ant的命令行构建。该问题应该得到解决。
  • 安装ProGuard 4.7 beta2(或更高版本)。它对包含空格的文件名缺少引号更加宽容。您只需下载发布版,并将jars从proguard/lib复制到android-sdk/tools/proguard/lib中。
  • 使用没有空格的项目路径。

请看我的编辑,我按照你的建议从我的项目路径中删除了空格,并且这次能够进展一些了,但仍然失败并显示错误代码1,这打印了一些新消息到我的控制台,我已经在上面编辑了我的问题。感谢你们两位迄今为止的帮助。 - user577732
我按照你的建议安装了4.7 beta2,并在控制台中得到了与我的上述编辑相同的错误和输出。 - user577732
4
第二个错误是由于Android兼容库引用了仅存在于较新版本Android API中的类所致。在这种情况下,这是可以接受的,您可以通过添加“-dontwarn android.support.**”让ProGuard接受它。 - Eric Lafortune
非常感谢,我已经编译成功并进行了代码混淆。再次感谢您的帮助。 - user577732
@EricLafortune非常感谢你提供的-dontwarn android.support.**代码行。如果您能在答案中包含它,那将是太棒了! - Anand Sainath
我正在使用Proguard来混淆我的Android库。我在我的库项目中使用带有片段的操作栏。如何混淆库文件?我需要特定的代码行适用于我的应用程序。现在,我遇到了“找不到超类或接口android.app.Fragment”、“找不到超类或接口android.app.ActionBar$TabListener”等错误。 - Karthick

0

可能有几个原因,但我在遇到这个问题时所做的是:

  • 更新Eclipse的ADT插件
  • 在android-sdk/tools/proguard中安装最新版本的ProGuard
  • 在Eclipse中创建一个新项目,并将所有类和资源复制到新项目中
  • 在新项目中配置proguard
  • 导出!

我不知道之前的项目为什么不起作用,但我知道这个技巧对我有效。希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接