zoukankan      html  css  js  c++  java
  • Android之Proguard语法

    -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 混淆时应用侵入式重载
    -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
    -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
    -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
    -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
    -keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and

    InnerClasses.
    -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

    -ignorewarnings # 忽略警告,避免打包时某些警告出现
    -optimizationpasses 5 # 指定代码的压缩级别
    -dontusemixedcaseclassnames # 是否使用大小写混合
    -dontskipnonpubliclibraryclasses # 是否混淆第三方jar
    -dontpreverify # 混淆时是否做预校验
    -verbose # 混淆时是否记录日志
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法

    -libraryjars libs/treecore.jar

    -dontwarn android.support.v4.** #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
    -dontwarn android.os.**
    -keep class android.support.v4.** { *; } # 保持哪些类不被混淆
    -keep class com.baidu.** { *; }
    -keep class vi.com.gdi.bgl.android.**{*;}
    -keep class android.os.**{*;}

    -keep interface android.support.v4.app.** { *; }
    -keep public class * extends android.support.v4.**
    -keep public class * extends android.app.Fragment

    -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.support.v4.widget
    -keep public class * extends com.sqlcrypt.database
    -keep public class * extends com.sqlcrypt.database.sqlite
    -keep public class * extends com.treecore.**
    -keep public class * extends de.greenrobot.dao.**


    -keepclasseswithmembernames class * { # 保持 native 方法不被混淆
    native <methods>;
    }

    -keepclasseswithmembers class * { # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
    }

    -keepclasseswithmembers class * { # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
    }

    -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 不被混淆
    public static final android.os.Parcelable$Creator *;
    }

    -keep class MyClass; # 保持自己定义的类不被混淆</init></init></methods>

    # -------------------------------------
    # android 原始混淆模板
    # -------------------------------------

    # ----------------------------------
    # 通过指定数量的优化能执行
    # -optimizationpasses n
    # ----------------------------------
    -optimizationpasses 5

    # ----------------------------------
    # 混淆时不会产生形形色色的类名
    # -dontusemixedcaseclassnames
    # ----------------------------------
    #-dontusemixedcaseclassnames
    # ----------------------------------
    # 指定不去忽略非公共的库类
    # -dontskipnonpubliclibraryclasses
    # ----------------------------------
    #-dontskipnonpubliclibraryclasses

    # ----------------------------------
    # 不预校验
    # -dontpreverify
    # ----------------------------------
    # -dontpreverify

    # ----------------------------------
    # 输出生成信息
    # -verbose
    # ----------------------------------
    -verbose

    # ----------------------------------
    # 优化选项
    # optimizations {optimization_filter}
    # ----------------------------------
    -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>;
    }
    # -----------------
    # modify 修改合并
    # -----------------
    -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*(...);
    }

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

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

    #--------------------------
    # 保护类型 -keepattributes 说明
    # Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable,
    # LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations,
    # RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault
    # --------------------
    -keepattributes **
    -libraryjars <java.home>/lib/rt.jar

    # ----------------------
    # 不压缩指定的文件
    # -dontshrink
    # ----------------------
    -dontshrink

    # ----------------------
    # 不优化指定的文件
    # -dontoptimize
    # -----------------------
    -dontoptimize

    # -----------------------
    # 不混淆指定的文件
    # -dontobfuscate
    # -----------------------

    # ----- 混淆包路径 -------
    -repackageclasses ''
    -flattenpackagehierarchy ''
    -target 1.6

    # -------- 以下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能需要保护的字段及类相关 --------
    -keep class com.google.inject.Binder
    -keepclassmembers class * {
    @com.google.inject.Inject <init>(...);
    }
    -keepclassmembers class * {
    void *(**On*Event);
    }
    -keepclassmembers class **.R$* {
    public static <fields>;
    }

    # ------ 编译时需要用到的 jar 包
    -libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar

    # ------ 保护 谷歌第三方 jar 包,界面特效 ----------
    -keep class android.support.v4.**
    -dontwarn android.support.v4.**

    # ------ 保护百度地址jar包 --------
    -keep class com.baidu.mapapi.** { *; }
    -dontwarn com.baidu.mapapi.**

    # --- 打包时忽略以下类的警告 --
    -dontwarn com.classpackage.AA

    #-keepnames class * implements java.io.Serializable
    # ---------保护所有实体中的字段名称----------
    -keepclassmembers class * implements java.io.Serializable {
    <fields>;
    }

    # --------- 保护类中的所有方法名 ------------
    -keepclassmembers class * {
    public <methods>;
    }

    ProGuard 

    1 常用语法

    保留

    • -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 不混淆输入的类文件

    混淆

    • -dontobfuscate 不混淆输入的类文件

    • -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

    • -overloadaggressively 混淆时应用侵入式重载

    • -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

    • -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

    • -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

    • -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

    • -keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

    • -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

    通配符匹配规则

    通配符规则
    匹配单个字符
    * 匹配类名中的任何部分,但不包含额外的包名
    ** 匹配类名中的任何部分,并且可以包含额外的包名
    % 匹配任何基础类型的类型名
    * 匹配任意类型名 ,包含基础类型/非基础类型
    ... 匹配任意数量、任意类型的参数
    <init> 匹配任何构造器
    <ifield> 匹配任何字段名
    <imethod> 匹配任何方法
    *(当用在类内部时) 匹配任何字段和方法
    $ 指内部类

    更详细的语法请戳:http://proguard.sourceforge.net/manual/usage.html#classspecification

    2. Android Studio中使用方法

    按照上面的语法规则编写proguard-rules.pro后,需要在build.gradle中配置,需要混淆的时候,设置minifyEnabled为true即可

    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
        }
    }

    3. ProGuard的输出文件说明

    混淆后,会在/build/proguard/目录下输出下面的文件

    • dump.txt 描述apk文件中所有类文件间的内部结构。

    • mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。

    • seeds.txt 列出了未被混淆的类和成员

    • usage.txt 列出了从apk中删除的代码 当我们需要处理crash log的时候,就可以通过mapping.txt的映射关系找到对应的类,方法,字段等。方法如下:

    sdk oolsproguardin 目录下有个retrace工具可以将混淆后的报错堆栈解码成正常的类名window下为retrace.bat,linux和mac为retrace.sh,

    使用方法如下:

    1. 将crash log保存为yourfilename.txt

    2. 拿到版本发布时生成的mapping.txt

    3. 执行命令retrace.bat -verbose mapping.txt yourfilename.txt

      所以我们每次打包版本都需要保存最新的mapping.txt文件。如果要使用到第三方的crash统计平台,比如bugly,还需要我们上传APP版本对应的mapping.txt.每次都要保存最新的mapping文件,那不就很麻烦?放心,gradle会帮到你,只需要在bulid.gradle加入下面的一句。每次我们编译的时候,都会自动帮你保存mapping文件到本地的。

     
    android {
    applicationVariants.all { variant ->
            variant.outputs.each { output ->
                if (variant.getBuildType().isMinifyEnabled()) {
                    variant.assemble.doLast{
                            copy {
                                from variant.mappingFile
                                into "${projectDir}/mappings"
                                rename { String fileName ->
                                    "mapping-${variant.name}.txt"
                                }
                            }
                    }
                }
            }
            ......
        }
    }
  • 相关阅读:
    PHP 设计模式系列 —— 资源库模式(Repository)
    在 Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离
    laravel集合
    2013项目总结
    项目总结
    到底创建了几个String对象?
    String s=new String("abc")创建了几个对象?
    局部刷新
    robot framework 在pycharm中语法无法高亮显示的,显示绿色解决办法(Robot Framework with PyCharm)
    UNIX环境高级编程——进程管理和通信(总结)
  • 原文地址:https://www.cnblogs.com/lucktian/p/5488985.html
Copyright © 2011-2022 走看看