安卓:Proguard 推荐的配置是什么?

66

我正在开发Android应用,并使用Proguard混淆代码。

目前我正在使用以下ProGuard配置:

-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 com.android.vending.licensing.ILicensingService

为了保持在布局XML中使用的自定义组件名称:

-keep public class custom.components.**

删除调试日志:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
为避免更改在布局的 onClick 上调用的方法名称:
-keepclassmembers class * {
 public void onClickButton1(android.view.View);
 public void onClickButton2(android.view.View);
 public void onClickButton3(android.view.View);
}

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

问题是:

还有其他推荐的标签吗?为什么?用途是什么?

可以在proguard.cfg文件中添加注释吗?我想要将某些行的注释添加到文件中,以便其他开发者不会对我添加的原因产生疑问。

此外,在proguard中,是否可以保留文件的注释头(版权)?如果不行,或者这不是一个好的政策,那么我应该在哪里添加版权信息?

3个回答

83

Android SDK(r20或更高版本)

请检查project.properties中引用的预定义proguard.config。

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

更多信息请参见:http://proguard.sourceforge.net/manual/examples.html#androidapplication 在这里,您可以查看一个我不断更新的默认proguard文件:https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521
Android SDK(r19或更低版本) 根据我的回答“在Eclipse中为Android启用ProGuard”,我最终得到了这个通用文件。我已经添加了注释以记住每行的作用。它可能会帮助那些需要的人,所以就放在这里了。
-optimizationpasses 5

#When not preverifing in a case-insensitive filing system, such as Windows. Because this tool unpacks your processed jars, you should then use:
-dontusemixedcaseclassnames

#Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting
-dontskipnonpubliclibraryclasses

#Preverification is irrelevant for the dex compiler and the Dalvik VM, so we can switch it off with the -dontpreverify option.
-dontpreverify

#Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message.
-verbose

#The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields).
#To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

#To repackage classes on a single package
#-repackageclasses ''

#Uncomment if using annotations to keep them.
#-keepattributes *Annotation*

#Keep classes that are referenced on the AndroidManifest
-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 com.android.vending.licensing.ILicensingService


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

#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}

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

#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**

#To maintain custom components names that are used on layouts XML:
-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);
}

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

#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

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

###### ADDITIONAL OPTIONS NOT USED NORMALLY

#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
#   void myCallbackMethod(java.lang.String);
#}

#Uncomment if using Serializable 
#-keepclassmembers class * implements java.io.Serializable {
#    private static final java.io.ObjectStreamField[] serialPersistentFields;
#    private void writeObject(java.io.ObjectOutputStream);
#    private void readObject(java.io.ObjectInputStream);
#    java.lang.Object writeReplace();
#    java.lang.Object readResolve();
#}

你好,我正在尝试阅读如何在我的应用程序中实现Proguard,但我无法确切理解我必须做什么。启用"proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt"这一行就足够了吗?它会自动完成吗?还是我还需要做其他事情?你知道在哪里可以找到这方面的指南吗?因为我从开发者网站上看不懂。谢谢! - George
вҖңеҗҜз”ЁиЎҢproguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-projectвҖҢвҖӢ.txtжҳҜеҗҰи¶іеӨҹпјҹвҖқжҳҜзҡ„пјҢйҷӨйқһжӮЁйңҖиҰҒзү№е®ҡзҡ„й…ҚзҪ®гҖӮ - neteinstein

10

对于使用Ant或Eclipse的标准构建,Android SDK(r20或更高版本)已经提供了适当的配置,该配置通过文件project.properties中的属性proguard.config引用(如Michal在他的答案中所指出的)。在旧版本中,您总是需要指定自己的完整配置,因此旧版建议(如第一个答案)可能会导致一些混淆。

对于自定义构建,您可以在ProGuard手册 > 示例 > 完整的Android应用程序中找到最新推荐的配置。 Proguard分发版也包含一个名为examples/android.pro的示例文件。

值得注意的是,您可能希望保留注释和视图扩展中的设置器。

您可以在哈希字符“#”后添加注释,就像在示例文件中广泛使用的那样。


3
在名为 project.properties 的项目文件中,设置以下值:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

这将获取Android SDK中最新的Proguard设置版本。

我想尝试这个方法。然而,在我的项目文件夹中没有'project.properties'文件。我应该在根项目文件夹中创建一个吗? - Hendra Anggrian

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