混淆打包apk时 proguard-project的配置

#Use 5 step of optimization
#-optimizationpasses 5
 
#When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use):
-dontusemixedcaseclassnames
 
#Specifies not to ignore non-public library classes. As of version 4.5this is the default setting
 
-dontwarn
#添加第三方包
-libraryjars libs/android-support-v4.jar
 
 
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-verbose
-ignorewarnings
 
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).   
-dontoptimize
-dontpreverify
# 对第三方报进行忽略处理
-dontwarn android.support.v4.**
-keep class android.support.v4.**{*;}
 
 
 
#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/*
 
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
"proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
 
#To repackage classes on a single package
#-repackageclasses ''
 
#Uncomment if using annotations to keep them.
-keepattributes Signature
#-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 extends android.app.backup.BackupAgentHelper
-keep public class extends android.preference.Preference
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#Compatibility library
-keep public class extends android.support.v4.app.Fragment
-keep public class extends android.app.Fragment
 
#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.**
 
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
 -keepclassmembers public class extends android.view.View {
  void set*(***);
  *** get*();
}
 
#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
}
# 对实体类进行忽略处理,防止发生空指针错误
-keep public class implements java.io.Serializable{ public protected private *;}
 
#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:
-keep public class extends android.view.View {
    public <init>(android.content.Context);
}
-keep public class extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class extends android.view.View {
    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是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、字段名和方法名。经过以上操作的jar文件会变得更小,并很难进行逆向工程。
二、基本使用
  在Android应用程序也可以使用 ProGuard来进行混洗打包,大大的优化Apk包的大小。但是注意 ProGuard对文件路径的名名很有讲究,不支持括号,也不支持空格 在混淆过后,可以在工程目录的 proguard中的 mapping.txt 看到混淆后的类名,方法名,变量名和 混淆前的类名,方法名,变量名。
   在使用Eclipse或Ant打包应用程序时,都是使用Android工程目录的 project.properties 文件来指定配置。关于Android中如何使用ant打包请参考《 Android中使用Ant编译打包
在使用Eclipse新建一个工程,都会在工程目录下生产配置project.properties和proguard-project.tx
文件如下所示:
例1

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-10

project.properties用于配置Android工程的一些属性,#号的话表示当前行是注释,这里的 proguard.config 就用于指定 ProGuard的 混淆配置文件,并对使用 release 方式打包应用程序时开启 代码混淆 功能。对于是否是 使用release方式打包,和 AndroidManifest.xml 中application的android:debuggable属性有很多关系。如果该值为 android:debuggable=" true " ,那么最终就是 debug方式打包。最明智的方式就是在 AndroidManifest.xml并不显示的指定它,而是是打包工具在打包时来决定它最终的值。对于ant就是 ant  release ant  debug。 而对于直接在Eclipse中使用 run  debgu 来打包的话就是debug,使用export的话就是 release.

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

这里的话指定了混淆的基本配置文件 proguard-android.txt,和 混淆的个性化配置文件 proguard-project.txt。这里 proguard-project.txt文件用于对前面的 基本的混淆配置文件 proguard-android.txt的配置进行override和添加。
混淆的基本配置文件 proguard-android.txt 如下:
文件1

# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -verbose # Optimization is turned off by default. Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of these optimizations on its own). -dontoptimize -dontpreverify # Note that if you want to enable optimization, you cannot just # include optimization flags in your own project configuration file; # instead you will need to point to the # "proguard-android-optimize.txt" file instead of this one from your # project.properties file. -keepattributes *Annotation* -keep public class com.google.vending.licensing.ILicensingService -keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class **.R$* { public static <fields>; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version. We know about them, and they are safe. -dontwarn android.support.**

以下则个是我们项目 混淆的个性化配置文件 proguard-project.txt

# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #}

-renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable -dontwarn android.** -dontwarn edu.edut.lsf.payment.link.** -libraryjars ..\Download_Install\lib\classes.jar -keep class org.jboss.netty.util.internal.AtomicFieldUpdaterUtil -keep class org.jboss.netty.util.internal.AtomicFieldUpdaterUtil$Node -keep class org.jboss.netty.util.internal.LinkedTransferQueue$Node -keep class edu.edut.robin.activities.LeWebJsActivity$AppStoreInterface -keepclasseswithmembers class * { public static void main(java.lang.String[]); } -keepclasseswithmembers class org.jboss.netty.util.internal.AtomicFieldUpdaterUtil$Node { *; } -keepclasseswithmembers class edu.edut.robin.activities.LeWebActionActivity$AppstoreWebInterface { *; } -keepclasseswithmembers class edu.edut.robin.utils.SilentInstallAssistant$* { *; } -keepclasseswithmembers class edu.edut.robin.silentinstaller.utils.SilentInstallAssistant$* { *; } -keepclasseswithmembers class edu.edut.robin.utils.Pm$* { *; } -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue { volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head; volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail; volatile transient int sweepVotes; } -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue$Node { *; } -keepclasseswithmembers class edu.edut.robin.activities.LeWebJsActivity$AppStoreInterface { *; } -keepclasseswithmembers class * extends edu.edut.lsf.payment.WebSubmitInterface { *; } -keepclasseswithmembers class edu.edut.lsf.payment.WebSubmitInterface { *; } -keep public class com.unionpay.** {*; } -keep public class edu.edut.lsf.** {*; }

:由于牵扯到保密的问题,一些关于项目的东西换成了edu.edut或edu.edut.robin
三、混淆配置详解
另外以下是关于混淆配置文件的一些说明:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable 保留原代码的行号信息
- injars  androidtest.jar【jar包所在地址】 
- outjars  out【输出地址】
- libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】
 
- optimizationpasses 5
- dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】 puzzle
- dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】 puzzle
- dontpreverify 【不预校验】
- verbose
- optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】 puzzle
- keep public class * extends android.app.Activity  【不进行混淆类名的类,保持其原类名和包名】

- keep public abstract interface com.asqw.android.Listener{
public protected <methods>;  【所有public protected的方法名不进行混淆】
}
- keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}
- keepclasseswithmembernames class * { 【对所有类的native方法名不进行混淆】
native <methods>;
}
- keepclasseswithmembers class * { 【 对所有类的指定方法的方法名不进行混淆
public <init>(android.content.Context, android.util.AttributeSet);
}
- keepclassmembers class * extends android.app.Activity {【 对所有类的指定方法的方法名不进行混淆
public void *(android.view.View);
}
- keepclassmembers enum * { 对枚举类型enum的所有类的以下指定方法的方法名不进行混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
- keep class * implements android.os.Parcelable {【对实现了 Parcelable接口的所有类的类名不进行混淆,对其成员变量为 Parcelable$Creator类型的成员变量的变量名不进行混淆
public static final android.os.Parcelable$Creator *;
}
-keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue { 对指定类的指定变量的变量名不进行混淆 volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head; volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail; volatile transient int sweepVotes;}
-keep public class com.unionpay.** {*; }【对 com.unionpay 包下所有的类都不进行混淆,即不混淆类名,也不混淆方法名和变量名】


ProGuard 是 通过 移除没用的代码、重命名相关类和方法等方式对代码进行优化、压缩、混淆的一个工具。
android中ProGuard已经被整合到开发工具中,官方强烈建议使用。对于调试模式,该工具不会被启用。

2、ProGuard 的使用

当你创建项目时,在项目的根目录下会自动生成proguard.cfg文件,该文件就是ProGuard的配置文件,使用方法也比较简单:在project.properties文件中添加"proguard.config=proguard.cfg "即可。默认生成的ProGuard文件只是用与一般的情况(仅仅覆盖了Android中几个比较重要的类)。所以大部分情况下我们需要自己定制该配置文件。

当然,上述情况是proguard.cfg文件位于项目的根目录下,如果你愿意你也可以挪动到别的地方,不过properties文件中需指明路径。

项目发布时会自动调用ProGuard工具混淆,从而在项目文件夹下面会生成 

dump.txt: 描述.apk文件中所有类文件间的内部结构 
mapping.txt :列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。
seeds.txt:列出了未被混淆的类和成员 
usage.txt:列出了从.apk中删除的代码


这几个文件主要描述了整个混淆的过程包括名称替换部分的详细描述。由于混淆后的代码输出的调试信息有可能因为混淆也变得难以识别,这时你就需要借助这几个文件来查询原始信息了。

3、ProGuard的配置

一般情况下ProGuard会正常工作,但是别忘了它也有犯浑的时候。有时间他会把项目中实际有用的代码移除,然后向您报告ClassNotFoundException!!例如:
  • 仅仅被AndroidManifest.xml文件引用的类
  • 由JNI调用的方法
  • 动态引用的属性和方法
如果某个类被错误地移除了,你可以这样修复:
proguard.cfg配置文件中添加 -keep public class 即可。

当然就代码安全性而言,SDK中还给出了以下的建议以保护敏感代码:
  • 多使用方法嵌套调用
  • 少使用字符串常量,尽量动态构造
  • 使用反射进行方法调用
对于新版本的ADT 默认已经不再生成 proguard.cfg文件,而是生成 proguard-project.txt文件,因此我们有关ProGuard的配置写到这个文件即可,对于properties文件的配置,可以这么写:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
相信大家都能看明白,${sdk.dir}/tools/proguard/proguard-android.txt文件引用的是默认配置(即所有项目通用的),proguard-project.txt是项目下面针对该项目的配置,最终配置由这两部分组成。
======================= 我是分割线====================================
(以下内容摘自互联网)
===================================================================
-include {filename}    从给定的文件中读取配置参数 
-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 
-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 
-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 
-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 
-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 
-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。

保留选项 

-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 
-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好 
-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 
-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除) 
-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 
-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 


压缩 

-dontshrink    不压缩输入的类文件 
-printusage {filename} 
-whyareyoukeeping {class_specification}     

优化 

-dontoptimize    不优化输入的类文件 
-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 
-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 

混淆 

-dontobfuscate    不混淆输入的类文件 
-printmapping {filename} 
-applymapping {filename}    重用映射增加混淆 
-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 
-overloadaggressively    混淆时应用侵入式重载 
-useuniqueclassmembername   确定统一的混淆类的成员名称来增加混淆 
-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 
-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 
-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 
-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string}    设置源文件中给定的字符串常量

===========================The end===========================================

===============以下内容为对ProGuard官方文档的翻译及总结=================================

ProGuard的工作原理:
Android中ProGuard的使用ZZ  

ProGuard 读取jars(包括wars, ears, zips, or directories)。input这一部分可以是源文件,源文件的类名称与混淆后类名称一一对应。
凡是正常编译所需的jar文件都需要添加到 Input jars中。jar文件一般不会被处理,但是你仍需将它们添加到classpath中。

应用程序入口

为了识别项目中哪些类需要保留,那些需要被移除,你需要定义程序的入口,如main函数的类,activity等。

shrinking :这一步中,ProGuard会从入口处递归查询,那些没有被用到的类和方法将会被移除。
optimization :这一步中,ProGuard会进一步优化程序,非公开的类和方法将会有可能被 private, static, or final化,没有用的参数将会被移除,有一些函数将会被内联。
obfuscation:这一步中:对于非入口的类与方法,ProGuard将会对类和其中的方法属性进行重命名,
preverification :该步仅适用于入口程序无关紧要的项目。

对于动态加载的类或方法,最好也要将其作为入口点。


ProGuard的使用



java -jar proguard.jar options ...

或者将options写入到相应的配置文件中
java -jar proguard.jar @myconfig.pro

配置文件中使用“#”作为行注释。
多余的空格将会被忽略,如果文件名中含有空格那么需要使用单引号或者双引号。
配置可以任意分组,其数量是不被限制的。
配置不分先后顺序,为了方便检索,你可以按照首字母进行排序。

input/output相关命令

-include filename 包含其他的配置文件
-basedirectory directoryname  设置基准文件夹位置,所有的其他配置中的路径都是基于该文件夹。
-injars class_path 设置将要被处理的jar(or wars, ears, zips, or directories)文件。默认情况下所有非class文件将会被按原样拷贝。所以,请注意中间文件。
-outjars class_path 指定对应的输出文件,但是应避免将输出文件直接覆盖输入文件,如果不配置outjars 将不会有输出。
注:input 与 output都可以设置过滤器,可指明多个。

-libraryjars class_path 指明库文件位置这些jar文件不会被输出到output中。库文件中的类应是被继承而不仅仅是被使用的。需要注意的是ProGuard不会从基准文件夹或者ProGuard的运行文件夹中寻找库文件。

-skipnonpubliclibraryclasses 跳过库文件中非公开类的处理,来加快ProGuard的处理速度。但是如果有公开的类继承了某非公开类,那么此条命令将会导致错误。

-dontskipnonpubliclibraryclasses 默认设置

-dontskipnonpubliclibraryclassmembers  声明不要跳过对非公开类中属性及方法的处理。默认情况下是跳过的,因为程序中不会引用它们,有些情况下人们编写的代码与类库中的类在同一个包下,并且对包中内容加以引用,此时需要加入此条声明。

-keepdirectories [directory_filter] 声明output中需要保留的目录,默认情况下为减小jar文件的大小,目录都将被删除。可以添加过滤器,如果不加过滤器那么所有的目录都将被保留。

-target version 设置版本号,可以为1.0, 1.1, 1.2, 1.3, 1.4, 1.5 (or just 5), 1.6 (or just 6), or 1.7 (or just 7).

-forceprocessing 强制处理。

Keep Options(保证不被移除)

-keep [,modifier,...] class_specification 声明类和类中成员作为入口点保留。例如对于普通程序,需要声明Main类及其main函数,为了处理类库你需要将里面所有的公共域都声明为入口点。

-keepclassmembers [,modifier,...] class_specification 如果类被保留那么类成员也将被保留,例如保留实现Serizable的类中所有的域。

-keepclasseswithmembers [,modifier,...] class_specification 声明含有指定域的类都被保留,而不必一一列出,如保留所有含有main的类。

-keepnames class_specification  类似 -keep,allowshrinking class_specification 声明类成员的名称被保留,上一阶段(shriking)如果没有被移除的话。如需要保留所有实现Serizable的类得名称和域名称以实现与以前的代码兼容。

-keepclasseswithmembernames class_specification 是 -keepclasseswithmembers,allowshrinking class_specification 的简写,指定含有指定域的类或类中的域的名称被保留。例如保留本地方法及含有本地方法的类名。

-printseeds [filename]  列出所有被保留的类及其类中的域

Shrinking Options

-dontshrink 声明不压缩输入文件夹,默认情况下使用压缩的。

-printusage [filename] 列出被移除的代码。

-whyareyoukeeping class_specification 列出被移除的原因

Optimization Options

-dontoptimize 不优化。默认优化。

-optimizations optimization_filter 专家级别的可选项,优化项过滤器。

-optimizationpasses n 优化几轮,默认一轮,如果优化一轮后发现没有可优化的项目了,直接就停止了。

-assumenosideeffects class_specification  自定义没有作用的代码,Proguard会分析相关代码,如果这些代码确实没有其他作用将会被移除。例如移除logging code

-allowaccessmodification 声明处理过程中,允许扩大访问修饰符。例如将get方法内联会将相关属性的访问修饰符设为public 。如果设计为类库就应避免使用该设置项。

-mergeinterfacesaggressively 声明接口可以被合并,尽管有些实现类并没有完全实现其中的方法。

Obfuscation Options  

-dontobfuscate 不使用混淆,默认使用混淆。类及其中的域都会被命名为一个更加简洁的名称。

-printmapping [filename] 将混淆前后对应的名称输出到指定的地点。

-applymapping filename 使用以前输出的混淆前后mapping。

-obfuscationdictionary filename  声明一个文本文件以提供可用的混淆后属性及方法的名称

-classobfuscationdictionary filename 声明一个文本文件以提供可用的混淆后类的名称

-packageobfuscationdictionary filename 声明一个文本文件以提供可用的混淆后包的名称


-overloadaggressively 声明可以使用扩展性的重载(允许只有返回值不同)

-useuniqueclassmembernames 声明相同的类名称混淆后使用相同的类名,不同的也不同,该选项会稍微增大处理后的jar包。

-dontusemixedcaseclassnames 声明不生成大小写混编的类名。默认会生成

-keeppackagenames [package_filter] 声明不被混淆的包名,过滤器可以使用 * ? 及**或 !

-flattenpackagehierarchy [package_name] 将所有的包名重构,所有类放到指定的一个包中。

-keepattributes [attribute_filter] 声明应被保留的属性,可以使用通配符。

-keepparameternames 含有指定声明方法参数或者类型的被保留

-renamesourcefileattribute [string] 声明一个被写入源文件中的字符串常量

-adaptclassstrings [class_filter] 声明与类名一致的字符串常量也将被混淆。

-adaptresourcefilenames [file_filter] 指明将要被重命名的源文件,

-adaptresourcefilecontents [file_filter] 声明内容将要被更新的源文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值