4

我正在尝试配置 proguard 并遇到了一些按优先级排序的问题:

  • 我收到了有关重复 zip 的警告并且无法修复它。我在“libs”目录中使用外部库和 2 个库项目(一个库项目有一个外部库 - 仅添加到项目中一次),它们仅添加到项目中一次。我试图将我的外部 jar 移动到另一个目录,即“lib”——只是重命名,因为一些用户已经设法解决它,但它对我没有帮助。另一种方法是尝试在基本 build.xml 中实现 custom_rules,因为它可以帮助一些用户避免这些警告。但是它的一切都对我没有帮助,我该如何解决?日志:

    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [jackson-annotations-2.1.4.jar:META-INF/MANIFEST.MF])
    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v4.jar:META-INF/MANIFEST.MF])
    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [google-analytics-v2.jar:META-INF/MANIFEST.MF])
    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [jackson-core-2.1.4.jar:META-INF/MANIFEST.MF])
    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [httpclientandroidlib-1.1.2.jar:META-INF/MANIFEST.MF])
    ProGuard: Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [deviceprint-lib-1.0.0.jar:META-INF/MANIFEST.MF])
    
  • 最后一件事是签名 apk 构建过程中的一些注意事项:

    ProGuard: Note: com.google.analytics.tracking.android.AdHitIdGenerator: can't find dynamically referenced class com.google.ads.AdRequest
    ProGuard: Note: the configuration refers to the unknown class 'com.google.vending.licensing.ILicensingService'
    ProGuard: Note: the configuration refers to the unknown class 'com.android.vending.licensing.ILicensingService'
    

完整的proguard文件:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

# Otherwise return Warning: com.fasterxml.jackson.databind.ext.DOMSerializer: can't find referenced class org.w3c.dom.bootstrap.DOMImplementationRegistry
-dontwarn com.fasterxml.jackson.databind.**

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# Preserve all fundamental application classes.
-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.view.View
-keep public class * extends android.preference.Preference
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

# Preserve ActionBarSherlock and Android support libraries` classes and interfaces
-keep class android.support.** { *; }
-keep interface android.support.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }

# Preserve all Jackson library classes
-keep class com.fasterxml.jackson.** { *; }

# Original
-keepclasseswithmembernames class * {
    native <methods>;
}

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

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

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

-keepclassmembers class **.R$* {
  public static <fields>;
}

-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

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

#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
4

2 回答 2

5

Stackoverflow 中讨论了类似的问题:

Android Proguard 重复定义

使用 ProGuard 和 Android 应用程序时资源重复

Android - Proguard 重复 zip 输入错误

在你的情况下,我认为第一个可以帮助你......

如果这没有帮助,我们应该看看这个问题是从哪里来的。我什至在 Playstore 中有一些带有第三方库的应用程序,而且我对 proguard 没有任何问题。这是我的一个带有第三方库和谷歌 lvl 许可的应用程序的 proguard.cfg 设置:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-dontwarn **CompatHoneycomb
-keep class android.support.v4.** { *; }
-dontwarn org.apache.**
-verbose
-dontoptimize
-dontshrink
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes *Annotation*
-dontwarn com.google.ads.**

好吧,您不需要所有这些,这取决于您实现了什么或您使用了哪些第三方库。所以,我看不到您的应用程序结构并且没有代码,这将超出范围。我建议你一个一个地测试。

于 2013-05-07T14:31:50.863 回答
5

您当前列出的 6 条警告和 3 条注释是无害的。

您应该确保您使用的是最新版本的 Android SDK,它会为您的项目创建一个空的 proguard-project.txt。标准的 Ant 构建和 Eclipse 构建在内部负责重要的配置(我假设您使用的是来自 IDEA 的 Ant)。您仍然可以将特定于应用程序的选项添加到 proguard-project.txt,例如 Jackson 和 ActionBarSherlock 的 -keep 选项。不要添加像 -injars/-libraryjars/-outjars 这样的选项,因为构建过程会为您指定它们。

于 2013-05-09T07:29:40.130 回答