【问题标题】:Error in default proguard.cfg?默认 proguard.cfg 出错?
【发布时间】:2011-02-18 20:28:10
【问题描述】:

当我在 Eclipse 中创建一个新的 Android 项目时,会创建以下默认的 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

-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 *;
}

请注意,-optimizations 行删除了文件的其余部分。我想知道这是故意的还是错字,该行的最后两个字符应该颠倒:

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

我正在使用 ADT 插件 9.0 和 Eclipse 3.6.1。

【问题讨论】:

    标签: android eclipse proguard


    【解决方案1】:

    好的。我现在觉得有点傻。答案是这里没有任何评论。该行应该被解释为像这样隔开:

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

    * 是一个通配符,在这种情况下论坛的语法高亮是错误的。

    【讨论】:

    • 如何将 cmets 添加到 proguard.cfg 中?有可能吗?
    • @Someone - 这就是我对此感到愚蠢的部分原因。 proguard.cfg 文件只是将命令行选项放在命令行上的替代品(正如ProGuard manual 所表明的那样)。由于无法在命令行中嵌入“cmets”,因此也可能无法将 cmets 添加到文件中。太糟糕了,因为文件可能非常复杂,而 cmets 可能会有所帮助。
    • 我相信以# 开头的行是cmets。
    【解决方案2】:

    你确定你不是不小心这么做的吗?

    我刚刚创建了一个虚拟项目并最终完成了这个。我会尝试删除该行,看看是否有效。

    -injars      bin/classes
    -injars      libs
    -outjars     bin/classes-processed.jar
    -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
    
    -dontpreverify
    -repackageclasses ''
    -allowaccessmodification
    -optimizations !code/simplification/arithmetic
    -keepattributes *Annotation*
    
    -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.view.View {
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
        public void set*(...);
    }
    
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
    }
    
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    
    -keepclassmembers class * implements android.os.Parcelable {
        static android.os.Parcelable$Creator CREATOR;
    }
    
    -keepclassmembers class **.R$* {
        public static <fields>;
    }
    

    【讨论】:

    • 我不是不小心这么做的;这个文件是自动生成的。
    • 有趣的是,它与我得到的不同。您创建项目时的目标平台是什么? (我的目标是 SDK 1.6。)
    【解决方案3】:

    keep-statements 用于防止 proguard 在收缩步骤中删除类或类成员,并在混淆步骤中重命名它们。

    Activity 是您很可能不希望从项目中删除的类。在 Android 的 ProGuard page 上它说

    在某些情况下,proguard.cfg 文件中的默认配置就足够了。但是,ProGuard 很难正确分析许多情况,它可能会删除它认为未使用但您的应用程序实际需要的代码。一些例子包括:

    • 列出项仅在 AndroidManifest.xml 文件中引用的类

    由于保留部分在默认配置中被注释掉,我认为这是有意的,因为注释掉的 -keep 活动 行会阻止 proguard 消除任何活动。

    简而言之:没有错别字

    【讨论】:

    • 原来这根本不是评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2023-03-31
    • 1970-01-01
    • 2017-07-09
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多