当我的应用程序使用 ProGuard 构建时,它会失败并显示以下消息。 我使用 Android SDK 生成的默认 proguard.cfg 和一些 -libraryjar。 我能为它做什么?
[2011-03-17 09:27:04 - MyProject] Proguard returned with error code 1. See console
[2011-03-17 09:27:04 - MyProject] Note: there were 4247 duplicate class definitions.
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.AnimationDrawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.BitmapDrawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] Warning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser
[2011-03-17 09:27:04 - MyProject] You should check if you need to specify additional program jars.
[2011-03-17 09:27:04 - MyProject] Warning: there were 9 instances of library classes depending on program classes.
[2011-03-17 09:27:04 - MyProject] You must avoid such dependencies, since the program classes will
[2011-03-17 09:27:04 - MyProject] be processed, while the library classes will remain unchanged.
[2011-03-17 09:27:04 - MyProject] java.io.IOException: Please correct the above warnings first.
[2011-03-17 09:27:04 - MyProject] at proguard.Initializer.execute(Initializer.java:321)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.initialize(ProGuard.java:211)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.execute(ProGuard.java:86)
[2011-03-17 09:27:04 - MyProject] at proguard.ProGuard.main(ProGuard.java:492)
显然,org.xmlpull.v1.XmlPullParser 不是一个程序类。 我已将 ProGuard 更新到最新版本(4.6),但有相同的警告。
将此行添加到 proguard-project.txt
-dontwarn org.xmlpull.v1.**
将此行添加到project.properties
proguard.config=proguard-project.txt
我使用 proguard 文件中的设置解决了这个问题:
-dontwarn org.kobjects.**
-dontwarn org.ksoap2.**
-dontwarn org.kxml2.**
-dontwarn org.xmlpull.v1.**
-keep class org.kobjects.** { *; }
-keep class org.ksoap2.** { *; }
-keep class org.kxml2.** { *; }
-keep class org.xmlpull.** { *; }
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontoptimize
-dontpreverify
我认为你的jar包包含了
XmlPullParser
类,并且android.jar也包含了这个。
所以可以把jar包中的org.xmlpull.*
类去掉,重新构建。
我还没有通过 eclipse for android 运行 proguard 的解决方案,但是如果您从命令行手动运行 proguard,您可以将以下内容放入您的
proguard.cfg
:
-basedirectory /home/pjv/workspace/collectionista-repo/collectionista-main
-injars /tmp/android_4500371803543847111.jar
-injars libs/joda-time-1.6.jar(!META-INF/MANIFEST.MF)
-injars libs/FlurryAgent.jar(!META-INF/MANIFEST.MF)
-injars libs/veecheck-2.0.jar(!META-INF/MANIFEST.MF)
-injars libs/commons-lang-2.4.jar(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt)
-injars libs/OIAbout-lib-temporary.jar(!META-INF/MANIFEST.MF)
-injars libs/libGoogleAnalytics.jar(!META-INF/MANIFEST.MF)
-injars libs/xstream-1.3.1.jar(!META-INF/MANIFEST.MF)
-injars libs/ZQL_custom.jar(!META-INF/MANIFEST.MF)
-injars libs/xpp3_min-1.1.4c.jar(!META-INF/MANIFEST.MF)
-injars libs/GoogleAdMobAdsSdk-4.1.0.jar(!META-INF/MANIFEST.MF)
-injars libs/bugsense-trace.jar(!META-INF/MANIFEST.MF)
-outjars /tmp/android_1348923171424559204.jar
-libraryjars /opt/android-sdk/android-sdk-linux_x86-1.6_r1/platforms/android-12/android.jar(!org/xmlpull/v1/XmlPullParser.class,!org/xmlpull/v1/XmlPullParserException.class)
注意如何从 Android API jar 中过滤
XmlPullParser.class
。
暂时不用担心与
XmlPullParser
相关的警告。首先修复错误和其他警告,如果必须,请在 -ignorewarnings
中使用 proguard.cfg
。
根据您提供的部分日志,Android运行时类org.xmlpull.v1.XmlPullParser已最终出现在您的程序代码中。您应该确保它不存在于 bin/classes 或 lib 中的某些 jar 中,因为它已经存在于库 jar android.jar 中。
此外,您还有 4247 个重复的类定义。这可能是由于指定了您提到的“some -libraryjars”。我猜这些库 jar 已经由构建脚本自动包含,所以您不应该再次指定它们。
有时,当您将测试库之一包含为常规模块依赖项时,就会发生这种情况。例如,不要这样做:
implementation 'com.android.support.test:runner:1.0.2' //wrong!!
做:
androidTestImplementation 'com.android.support.test:runner:1.0.2' //right (:
来自Google问题评论:
这是构建设置中的一个问题,该设置具有定义 XmlPullParser 类的代码,但该类是 Android bootclasspath 的一部分,在程序和 bootclasspath 中定义它可能会导致非常微妙的问题。解决此类问题的最佳方法是从应用程序或应用程序所依赖的库中排除 XmlPullParser 的重新定义。您可以通过在终端中运行 gradle app:dependencies 来查看依赖项。
您必须排除实现 XmlPullParser 的库。
不要只是复制在线解决方案,因为这是他们的库。 例如,库 LIB 使用另一个实现 XmlPullParser 的库 A:B:C,您的 gradle 应该排除库 A:B:C:
implementataaion ('LIB') {
exclude group: 'A', module: 'B'
}
它应该可以解决问题,并且无需在 proguard 文件中添加其他规则。
您的文件夹中已存在依赖项,
将其排除,如下所示:
dependencies {
configurations {
all*.exclude group: 'xmlpull', module: 'xmlpull'
}
}
对我来说,我可以通过删除之前修改的 build.gradle 来解决它
我删除了:
minifyEnabled true
shrinkResources true
并返回到原来的设置
minifyEnabled false