混淆_混淆矩阵 - CSDN
精华内容
参与话题
  • 数据仓库数据混淆

    千次阅读 2018-09-06 15:51:56
    一、什么是数据混淆? 在技术领域,数据混淆(也成为数据掩蔽)是将测试或开发环境中现有的敏感信息替换为看起来像真实生产信息的信息,但这些信息无法被任何人滥用。换句话说,测试或开发环境的用户不需要看到真实...

    一、什么是数据混淆?

    在技术领域,数据混淆(也成为数据掩蔽)是将测试或开发环境中现有的敏感信息替换为看起来像真实生产信息的信息,但这些信息无法被任何人滥用。换句话说,测试或开发环境的用户不需要看到真实生产数据,只要这些数据与真实数据相似即可。因此,数据混淆计划被用于保护数据,它可帮助掩蔽非生产环境中包含的敏感信息,让企业可缓解数据泄露的风险。数据混淆也是数据仓库体系厘里面一个重要的组成部分。

     

    二、对数据混淆技术的需求

    企业通常需要将生产数据库中存储的生产数据复制到非生产或测试数据库,这样做是为了真实地完成应用功能测试以及涵盖实时场景或最大限度减少生产漏洞或缺陷。这种做法的影响是,非生产环境很容易成为网络罪犯或恶意内部人员的简易目标,让他们可轻松地获取敏感数据。由于非生产环境并没有像生产环境那样受到严格控制和管理,当数据泄露事故发生时,企业可能需要花费数百万美元修复声誉损害或者品牌价值损失。监管要求是数据混淆技术的另一个关键驱动因素。

    例如,支付卡行业数据安全标准(PCI DSS)鼓励商家加强支付卡数据安全,广泛部署一致的数据安全做法,满足技术和操作要求。PCI DSS要求商家的生产环境和信息不能用于测试和开发。不当的数据泄露(无论是意外还是恶意事件)都会带来毁灭性后果,并可能导致高昂的罚款或法律行为。

     

    三、数据混淆用例

    数据混淆技术的典型用例是当开发环境数据库交由第三方供应商或外包商处理和管理时;

    数据混淆是确保第三方供应商可执行其职责及功能非常重要的工具。通过部署数据混淆技术,企业可使用数据库中相似值来替换敏感信息,而不必担心第三方供应商在开发期间暴露该信息。

    另一个典型用例是在零售业,零售商需要与市场研究公司共享客户销售点数据以运用高级分析算法来分析客户的购买模式和趋势。零售商不必向研究公司提供真实的客户数据,而可提供类似真实客户数据的替代数据。

    这种方法可帮助企业减少通过业务合作伙伴或其他第三方供应商泄露数据的风险。

     

    四、采取的技术方案

    1.数据仓库内部方案

    此处我使用的是Hive来做数据仓库,然后在Hive内部分层,利用SQL, 加密算法等从一个存储数据的层次抽取到另一个层次。然后将这个层次的数据展示给外部。

     

    2.数据外部使用方案

    此处我们引用轻量级结构化数据库Mysql或着其他的数据库, 利用第三方开源组件将数据加密抽取过来。

    展开全文
  • 代码混淆详解

    万次阅读 多人点赞 2014-11-12 20:45:56
    什么是代码混淆 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量...

    什么是代码混淆

    Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。

    混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

    混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

    混淆文件 proguard.cfg 参数详解

    -optimizationpasses 5                                                           # 指定代码的压缩级别
    -dontusemixedcaseclassnames                                                     # 是否使用大小写混合
    -dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar
    -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 方法不被混淆
        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;                                                            # 保持自己定义的类不被混淆


    代码混淆的方法

    根据 SDK 的版本不同有 2 中不同的代码混淆方式,以上的 proguard.cfg 参数详解中所涉及到的信息是在较低版本 SDK 下的混淆脚本,事实上在高版本的 SDK 下混淆的原理和参数也与低版本的相差无几,只是在不同 SDK 版本的环境下引入混淆脚本的方式有所不同。具体方法如下:

    • 低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。
    • 高版本 SDK 下,项目中同时包含 proguard-project.txt 和 project.properties 文件,这时需要在 proguard-project.txt 文件中进行如下信息的配置,然后再将项目 Export 即可。下面以真实的文件进行演示说明。
    复制代码
    # This file is automatically generated by Android Tools.
    # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
    #
    # This file must be checked in Version Control Systems.
    #
    # To customize properties used by the Ant build system edit
    # "ant.properties", and override values to adapt the script to your
    # project structure.
    #
    # 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
    
    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
    
    # Project target.
    target=android-16
    复制代码

    以上的配置信息即是 project.properties 文件中内容,蓝色文字为我们在代码混淆过程中需要添加的配置信息,其中:sdk.dir 为你在当前机器上 SDK 的安装路径。如果想保留某个包下的文件不被混淆,可以在 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:
    
    -dontwarn com.cnki.android.cnkireader.** 
    -keep class com.cnki.android.cnkireader.** { *; }
    
    # 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 *;
    #}
    复制代码


    -optimizationpasses 5


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


    # 指定不去忽略非公共的库类
    -dontskipnonpubliclibraryclasses


    # 不预校验
    # -dontpreverify


    # 预校验
    -dontoptimize 




    # 这1句是屏蔽警告
    -ignorewarnings 
    -verbose


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


    # 这1句是导入第三方的类库,防止混淆时候读取包内容出错
    #-libraryjars libs/youjar.jar 


    # 去掉警告
    -dontwarn 
    -dontskipnonpubliclibraryclassmembers


    # 不进行混淆保持原样
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Application
    -keep public class * extends android.app.Fragment 
    -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




    # 过滤R文件的混淆:
    -keep class **.R$* {*;}


    # 过滤第三方包的混淆:其中packagename为第三方包的包名
    # -keep class packagename.** {*;}
    -keep class com.hisilicon.android.hibdinfo.** {*;}
    -keep class com.huawei.iptv.stb.dlna.mymedia.dto.** {*;}
    -keep class com.huawei.iptv.stb.dlna.mymedia.facade.** {*;}
    -keep class com.huawei.mymediaprifacade.** {*;}
    -keep class com.hisilicon.android.mediaplayer.** {*;}
    -keep class com.nostra13.universalimageloader.** {*;}
    -keep class com.huawei.android.airsharing.** {*;}


    # 所有方法不进行混淆
    -keep public abstract interface com.huawei.android.airsharing.listener{
    public protected <methods>;
    }


    -keep public abstract interface com.huawei.android.airsharing.api{
    public protected <methods>;
    }


    # 对该方法不进行混淆
    # -keep public class com.asqw.android{
    # public void Start(java.lang.String); 
    # }


    # 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
    #-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 class * extends android.app.Activity {
    public void *(android.view.View);
    }




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


    # 保护指定的类文件和类的成员
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }


    #-libraryjars libs/android-support-v4.jar
    #-dontwarn android.support.v4.**{*;}


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


    #不混淆第三方包中的指定内容
    -keep class android-support-v4.**{*;}
    -keep public class * extends android.support.v4.**
    -keep class android.view.**{*;}









    ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.

    ProGuard的使用是为了:

    1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.
    2.创建的程序和程序库很难使用反向工程.
    3.所以它能删除来自源文件中的没有调用的代码
    4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.

    参数:

    -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} 设置源文件中给定的字符串常量

    因为我们开发的是webwork+spring+hibernate的架构的项目,所有需要很详细的配置。(经过n次失败后总结)

    Example:

    -injars <project>.jar

    -outjars <project>_out.jar

    -libraryjars <java.home>/lib/rt.jar

    -libraryjars <project.home>/webroot/WEB-INF/lib/webwork.jar

    .......

    # 保留实现Action接口类中的公有的,友好的,私有的属性 和 公有的,友好的方法。其它的全部压缩,优化,混淆。

    # 因为配置文件中的类名是一个完整的类名,如果经过处理后就有可能找不到这个类。

    # 属性是jsp页面所需要的,如果经过处理jsp页面就无法得到action中的数据。

    -keep public class * implements com.opensymphony.xwork.Action{

    public protected private <fields>;

    public protected <methods>;

    }

    # 保留实现了Serializable接口类中的公有的,友好的,私有的成员(属性和方法)

    # 这个配置主要是对应实体类的配置。

    -keep public class * implements java.io.Serializable{

    public protected private *;

    }



    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解。下面将自己的理解和认识简要的做个笔记,有异议或者不解的,可以直接留言。

    什么是ProGuard工具?


    ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。具体来说,使用ProGuard工具,可以达到下面两个目的:

    • 删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。
    • 使用语义混淆的命名替换了代码中的类、字段和函数等,使得其他人无法反编译获取源代码,起到对代码的保护作用。

    我看网上有不少人根据ProGuard工具的作用,直接称呼其为“混淆代码工具”,本文也暂时用这个词简称。

    更多的理解,可以参考ProGuard工具的官方文档地址:http://developer.android.com/tools/help/proguard.html

    ProGuard工具的集成与使用环境


    其实,ProGuard工具是已经集成到我们android系统中的,所以不需要用户手动的去集成。但是有一点需要注意,仅在程序处于Release模式时ProGuard才有效,反之在Debug模式是不能通过ProGuard来混淆代码的。

    根据ProGuard的具体使用环境,我分在Eclipse工具和android源码两种编译环境浅谈ProGuard的使用方法。

    Eclipse环境中ProGuard的使用


    以我电脑的android4.0环境为例,当我们在Eclipse中新建一个项目,或者导入一个已存在项目(保证当前项目没有语法错误)后,在工程的根目录,会自动生成两个ProGuard的混淆文件:proguard-project.txt和project.properties(在老版本的ADT中,只会生成一个叫proguard.cfg的文件)。我们先看下文件project.properties :

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    # This file is automatically generated by Android Tools.
    # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
    #
    # This file must be checked in Version Control Systems.
    #
    # To customize properties used by the Ant build system edit
    # "ant.properties", and override values to adapt the script to your
    # project structure.
    #
    # 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-16
    

    看后面一段注释:To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home) ,意指要让ProGuard 来压缩和混淆代码,把这句注释去掉即可!所以,我们只要把下面一句注释取消即可,如下所示:

    1
    2
    # 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
    

    我们仔细的看下这部分代码:这个地方是通过设置proguard.config属性来指定混淆代码的配置文件为本机SDK目录下面的proguard-android.txt文件,以及制定混淆的个性化配置文件为当前工程(eclipse下)根目录下面的proguard-project.txt文件 ,而后面这个文件,恰是我们刚才看到的原本在根目录下自动生成的另外一个文件!

    其实打开了这个地方,我们就已经可以混淆代码了,不过这里要注意:不能试图通过运行eclipse中的Run as 和 Debug as 菜单来生成混淆代码,必须通过如下图所示的方法将apk导出才行,当然你可以选择“签名”或者“不签名”:

    图片说明文字

    这样一步操作后,算是代码混淆完成了。那么怎么才能检验我们真的混淆了代码了呢?首先,我们能够看到在工程的根目录新生产了一个文件夹proguard,里面有四个文件,其内容如下:

    • dump.txt : 描述了apk中所有类 文件中内部的结构体。( Describes the internal structure of all the class files in the .apk file )
    • mapping.txt : 列出了原始的类、方法和名称与混淆代码见得映射。( Lists the mapping between the original and obfuscated class, method, and field names. )
    • seeds.txt : 列出了没有混淆的类和方法。( Lists the classes and members that are not obfuscated )
    • usage.txt : 列出congapk中删除的代码。( Lists the code that was stripped from the .apk )

    同时使用反编译软件对新生成的apk反编译后会发现,里面的类名、方法和变量等,都变成了简单的a、b、c、d等毫无含义的字母,这样就达到了混淆的目的:
    图片说明文字

    但在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就要用到我们刚才提到的混淆的个性化配置文件proguard-project.txt,在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,请看下面的最后一个标题会有详述。

    Android源码环境中ProGuard使用


    在Google发布的android源码中,面对那么多代码和文件目录,此时该如何混淆代码与配置混淆文件呢?

    android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。

    1
    2
    # Don't obfuscate. We only need dead code striping.
    -dontobfuscate
    

    可以说,这句是android工程中代码混淆的总开关,然而,注释了上面的代码后,整个工程就已经是代码混淆了吗?不是的,这里还要关注一个文件alps/build/core/package.mk,在这个文件中有这么一段:

    1
    2
    3
    4
    5
    6
    ifndef LOCAL_PROGUARD_ENABLED
    ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
        # turn on Proguard by default for user & userdebug build
        #LOCAL_PROGUARD_ENABLED :=full
    endif
    endif
    

    切记:当我们需要对整个工程进行代码混淆的时候,就把此处的 #LOCAL_PROGUARD_ENABLED :=full注释去掉,成为有效的宏即可。如果不想对整个工程代码混淆,而只是相对某个模块混淆的话,就先不要动这里的代码。

    接着建议将真个工程new一遍,之后就可以针对具体的apk文件进行混淆文件的设置和定制了。下面以alps/packages/apps/Music为例说说该如何对特定模块做到混淆代码:

    在Music目录下,我们看到一个平时不太关注,但今天一定很在意的文件名:proguard.flags ,对了,这个文件就是Music的混淆配置文件,可以打开看看(有些地方没有这个文件,用户可以自己手动新建一下,最好名称也叫proguard.flags,android下默认都是这个名字)。当然,设置了配置文件还是不够的,还需要在同目录的Android.mk中如下设置如下两句:

    1
    2
    LOCAL_PROGUARD_ENABLED  := full
    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    

    只有这样才能让混淆代码有效,并且将混淆配置文件关联起来。(有些模块没有这两句句,就自己手动加上)

    反之,如果用户已经在alps/build/core/package.mk打开了全工程混淆编译的控制点后,又在针对某个模块时不想混淆编译怎么办?这就简单了,将模块下的Android.mk中设置为**LOCAL_PROGUARD_ENABLED := disabled**即可。

    这样,我们通过mm编译后的代码生成的apk,或者new真个工程后生成的烧机代码,都是已经添加相应配置的混淆代码了。

    反编译后,除过proguard.flags中定制的不需要混淆的代码外,其他都是被混淆了,如图所示是android中Music模块的混淆后反编译结果:

    图片说明文字

    混淆文件的配置


    在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就需要我们配置混淆的个性化文件proguard-project.txt(eclipse环境中)或者proguard.flags(android源码环境),在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,大家可以去搜索下,我这里提供一段网上有人共享的配置代码,这个配置代码保留了工程文件中的Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等,用来防止外部调用出错,大家可以借鉴下,以后来配置自己的文件:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    -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
    
     -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);
    }
    
    -keepclassmembers class * extends android.app.Activity {
        public void *(android.view.View);
    }
    
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    -keep class * implements android.os.Parcelable {
        public static final android.os.Parcelable$Creator *;
    }
    

    就写这么多了,有问题和建议,欢迎一起讨论!

    4.2以下版本尝试

         1.android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。

    1

    2

    # Don't obfuscate. We only need dead code striping.

    -dontobfuscate

                      将上面改为

    1

    2

    # Don't obfuscate. We only need dead code striping.

    #-dontobfuscate

                 2.还要关注一个文件alps/build/core/package.mk,在这个文件中有这么一段:

    1

    2

    3

    4

    5

    6

    ifndef LOCAL_PROGUARD_ENABLED

    ifneq($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)

        # turn on Proguard by defaultfor user& userdebug build

        #LOCAL_PROGUARD_ENABLED :=full

    endif

    endif

                      不动,如果没注释,请注释下,注释为了下面部分加扰,打开应该是全部加扰,没有尝试过

                      3.在自己的工程下下面Android.mk里添加

    LOCAL_PROGUARD_ENABLED  := full

    LOCAL_PROGUARD_FLAG_FILES := proguard.cfg

                      proguard.cfgAndroid.mk同级目录下。

                      4.把源码重新全编译下

    4.4版本  可能还涉及\build\core\java.mk  具体改法在测试中

    4.4的话,还需要改一处才生效

    Build/core/java.mk 里的

    ifeq ($(filter obfuscation,$(LOCAL_PROGUARD_ENABLED)),)

    # By default no obfuscation

    # proguard_flags += -dontobfuscate ――注释掉这句

    endif  # No obfuscation


    展开全文
  • Android混淆总结篇(一)

    万次阅读 2018-03-28 18:46:21
    上个月跟朋友讨论了这么一问题:“项目上线之后由于代码被混淆的缘故,导致收集到的异常信息看着很困难”,刚好最近在复习混淆方面的知识,在总结混淆的知识点的同时,顺便探讨总结下这问题。项目上线肯定避免不了的...

    前言

    这阵子自己的心又长草了,静不下来~又挺迷茫的!在这个纷纷跳槽的季节,感觉还是应该让自己静下心来多学习学习。还是写写博客,总结总结~梳理下心里的野草。

    上个月跟朋友讨论了这么一问题:“项目上线之后由于代码被混淆的缘故,导致收集到的异常信息看着很困难”,刚好最近在复习混淆方面的知识,在总结混淆的知识点的同时,顺便探讨总结下这问题。项目上线肯定避免不了的是对项目进行混淆、打包、签名和发布,可能还有APK加固等等,其实这流程并不复杂,都有一套明确的流程,所以整起来也不是很困难。而上面提到的“混淆导致上线后的异常信息查看起来挺困难”这问题,这几天也大概探讨完,打算记录在下篇文章~~那么这篇文章先开始扯淡吧!


    Ⅰ.简述

    混淆的概念:将Android项目进行打包之时,可以将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件加密.

    混淆的作用

    • 1.增加Apk反编译之后代码泄露的困难性
    • 2.生成的apk体积会缩小

    什么是混淆?

    Android SDK 本身就提供混淆的功能,将混淆开关进行开启后,开发者需要做的是对Android Studio工程项目中的proguard-rules.pro文件进行混淆白名单的配置.

    那么什么是混淆白名单呢?其实就是指定一些包名、类名、变量等不可以被混淆。假设没指定白名单就进行混淆打包,而某某类的类名被混淆了(假设变成了a),那么可能其他引用或使用该类的类就找不到该类,说不定应用就会因此崩溃或是导致相应的功能无法使用.

    那么所谓的混淆也就是配置混淆白名单,那么下面看看混淆之后的apk的内部结构.可以看到红圈圈出来的部分都是进行混淆的,而有部分是没有进行混淆的,比如黑圈圈出来的属性动画兼容库nineoldandroids,其包名类名就没有变成abc这样的代替符

    这里写图片描述

    上面我是用apk逆向助手对apk进行反编译,市场上的反编译工具有很多种,可以自行Google搜索。

    补充

    本篇文章记录的混淆知识点主要基于Android Studio开发工具。


    Ⅱ.开始混淆

    1.开启混淆开关

    混淆的开关在项目/app/build.gradle文件里,看下面的截图,将minifyEnabled设置为true就是开启混淆,关于下面的配置代码可以直接写在build.gradle文件的android节点下

    这里写图片描述

    代码混淆一般是在上线前的apk打包才会去配置混淆开启,要是忘记配置的代码,那怎么办呢?直接进去Project Structrue,然后根据下面截图所标识的进行设置,如此这般,只要打release包就是开启混淆进行打包的.

    这里写图片描述

    2.设置混淆白名单

    基于Android Studio创建的项目里有一文件名称为”proguard-rules.pro”的文件,路径是”项目/app/proguard-rules.pro”,没经过编辑之前,里面只有一些注释的代码,如下图

    这里写图片描述

    那么设置的混淆白名单又该怎么写呢?Google搜索的话会有很多博客上的模板可以复制进行套用.如下图,那么就可以进行参考,下面第三部分将常用的混淆指令和对应的注释都列举出来,基本常用的都有,有疏漏的那就自行搜索下.

    这里写图片描述


    Ⅲ.实际混淆指令

    在应用中,大多数的混淆指令是已经确定的了,比如下面的基本指令部分,基本不用修改的。而其他的混淆指令,比如第三方的SDK/框架的混淆指令一般在其官方文档都可以找到,所以相对来说还是比较方便的,下面将这几天归类的混淆指令总结下.

    基本指令:

        # 设置混淆的压缩比率 0 ~ 7
        -optimizationpasses 5
        # 混淆后类名都为小写   Aa aA
        -dontusemixedcaseclassnames
        # 指定不去忽略非公共库的类
        -dontskipnonpubliclibraryclasses
        #不做预校验的操作
        -dontpreverify
        # 混淆时不记录日志
        -verbose
        # 混淆采用的算法.
        -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
        #保留代码行号,方便异常信息的追踪
        -keepattributes SourceFile,LineNumberTable
    
        #dump文件列出apk包内所有class的内部结构
        -dump class_files.txt        
        #seeds.txt文件列出未混淆的类和成员
        -printseeds seeds.txt
        #usage.txt文件列出从apk中删除的代码
        -printusage unused.txt
        #mapping文件列出混淆前后的映射
        -printmapping mapping.txt
    

    避免混淆Android基本组件,下面是兼容性比较高的规则:

    -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
    
    #不提示V4包下错误警告
    -dontwarn android.support.v4.**
    #保持下面的V4兼容包的类不被混淆
    -keep class android.support.v4.**{*;}

    避免混淆所有native的方法,涉及到C、C++

    -keepclasseswithmembernames class * {
            native <methods>;
    }

    避免混淆自定义控件类的get/set方法和构造函数

    -keep public class * extends android.view.View{
            *** get*();
            void set*(***);
            public <init>(android.content.Context);
            public <init>(android.content.Context,
                                        android.util.AttributeSet);
            public <init>(android.content.Context,
                                        android.util.AttributeSet,int);
    }

    避免混淆枚举类

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

    避免混淆序列化类

        #不混淆Parcelable和它的实现子类,还有Creator成员变量
        -keep class * implements android.os.Parcelable {
          public static final android.os.Parcelable$Creator *;
        }
    
        #不混淆Serializable和它的实现子类、其成员变量
        -keepclassmembers class * implements java.io.Serializable {
            static final long serialVersionUID;
            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();
        }

    避免混淆JSON类的构造函数

        #使用GSON、fastjson等框架时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象
        -keepclassmembers class * {
            public <init>(org.json.JSONObject);
        }
    

    避免混淆第三方SDK

        # ==================环信混淆start=================
        -keep class com.hyphenate.** {*;}
        -dontwarn  com.hyphenate.**
        # ==================环信end======================
    
        # ==================bugly start==================
        -dontwarn com.tencent.bugly.**
        -keep public interface com.tencent.**
        -keep public class com.tencent.** {*;}
        -keep public class com.tencent.bugly.**{*;}
        # ==================bugly end====================
    
        # ===============百度定位 start====================
        -keep class vi.com.gdi.** { *; }
        -keep public class com.baidu.** {*;}
        -keep public class com.mobclick.** {*;}
        -dontwarn com.baidu.mapapi.utils.*
        -dontwarn com.baidu.platform.comapi.b.*
        -dontwarn com.baidu.platform.comapi.map.*
        # ===============百度定位 end======================
    
        //备注:其他的第三方包的混淆指令可以到其官方文档去拷贝

    避免混淆第三方框架

        # ==================picasso框架 start===============
        -keep class com.parse.*{ *; }
        -dontwarn com.parse.**
        -dontwarn com.squareup.picasso.**
        -keepclasseswithmembernames class * {
            native <methods>;
        }
        # ==================picasso end====================
    
        # ==================EventBus start=================
        -keep class org.greenrobot.** {*;}
        -keep class de.greenrobot.** {*;}
        -keepclassmembers class ** {
            public void onEvent*(**);
            void onEvent*(**);
        }
        # ==================EventBus end===================
    
        # ==================okhttp start===================
        -dontwarn com.squareup.okhttp.**
        -keep class com.squareup.okhttp.** { *;}
        -dontwarn okio.**
        -keep class okio.**{*;}
        -keep interface okio.**{*;}
        # ==================okhttp end=====================
    
        //备注:其它框架的混淆指令可以到其官方文档去拷贝   

    其它混淆指令

        #避免混淆属性动画兼容库
        -dontwarn com.nineoldandroids.*
        -keep class com.nineoldandroids.** { *;}    
    
        #不混淆泛型
        -keepattributes Signature
    
        #避免混淆注解类
        -dontwarn android.annotation
        -keepattributes *Annotation*
    
        #避免混淆内部类
        -keepattributes InnerClasses
    
        #避免混淆实体类,修改成你对应的包名
        -keep class com.wyk.test.bean.** { *; }
        -keep class com.wyk.test.event.** { *; }
        -keep public class com.wyk.test.utils.eventbus.** { *;}
    
        #避免混淆Rxjava/RxAndroid
        -dontwarn sun.misc.**
        -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
         long producerIndex;
         long consumerIndex;
        }
        -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
         rx.internal.util.atomic.LinkedQueueNode producerNode;
        }
        -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
         rx.internal.util.atomic.LinkedQueueNode consumerNode;
        }
    
    #避免混淆js相关的接口
    -keepattributes *JavascriptInterface*
    -keep class com.wyk.test.js.** { *; }
    

    Ⅳ.混淆配置注意点

    1.假设当配置 “-libraryjars libs/jpush-android-2.1.6.jar” 对jar包进行混淆白名单化,如果gradle报错的话,可以考虑注释掉(格式:-libraryjars [jar包名])这样的配置信息.采用下面的配置信息进行替换

     -dontwarn cn.jpush.**
     -keep class cn.jpush.** { *; }

    2.下面是对属性动画兼容库的混淆白名单配置信息,刚开始觉得只是保持com.nineoldandroids包下的类不被混淆,后来经过反编译混淆后的apk包,发现效果是”不混淆该class com.nineoldandroids包下的类、子包和子包的类,也不混淆其中类的成员变量.

    -keep class com.nineoldandroids.** { *;}       

    Ⅴ.其它

    1.混淆套用模板

    个人觉得下面链接的博文就写得非常好,所以可以进行参考.

    参考博文:5分钟搞定android混淆

    2.资源混淆

    Proguard混淆只是针对代码进行混淆,解压之后的apk包还是能看到项目的资源文件和其名称,比如布局、logo图片等等.这时可以选择对资源文件进行混淆,下面两个链接是腾讯推出的资源混淆工具相关的博文,可以参考.

    资源混淆工具相关的博文

    http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=42
    https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md

    3.加固

    为了使得apk更加不容易被破解,混淆之后还可以对apk进行加固,现今市面上的加固技术有很多种,有360加固、爱加密加固、梆梆加固等等,可以自行选择,加固技术就相当于给apk包加多一个壳,相应的体积也会增大,大概增大1M~2M左右,需要的话可以自行搜索,加固还是挺简单的.

    4.参考链接

    http://blog.csdn.net/maxwell_nc/article/details/51998766
    http://blog.csdn.net/chen930724/article/details/49687067
    http://blog.csdn.net/lovexjyong/article/details/24652085
    http://www.jianshu.com/p/f3455ecaa56e

    5.睡觉 ing~~~

    展开全文
  • 混淆的文章其实网上也很多,介绍的都很好,但是关于多个module的混淆规则就不是这么详细,有的也是错误的,经过了2天的多次实践以及查阅资料(多次打包和反编译看源码,很费时间啊),终于达到了我的目的。...

    上一篇博客我们详细介绍了反编译工具jadx的使用方法以及对混淆和加固的对比

    博客中我们提到了混淆。混淆的文章其实网上也很多,介绍的都很好,但是关于多个module的混淆规则就不是这么详细,有的也是错误的,经过了2天的多次实践以及查阅资料(多次打包和反编译看源码,很费时间啊),终于达到了我的目的。下面来总结一下。也希望能帮到需要的同学。

    Android Studio本身集成了ProGuard混淆工具,我们可以通过编辑build.gradle文件来开启混淆并且对代码进行压缩,对资源进行优化等。如下图

    这里写图片描述

    下面是代码,可以直接复制

        buildTypes {
            release {
                minifyEnabled true   //开启混淆
                zipAlignEnabled true  //压缩优化
                shrinkResources true  //移出无用资源
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //默认的混淆文件以及我们指定的混淆文件
            
            }
    
        }
    

    开启了混淆别忘去proguard-rules.pro文件编辑混淆规则,混淆规则网上也有很多,自行百度即可。

    这里写图片描述

    如果你的项目只有一个app module,那么这样配置混淆就可以了。但是如果你的项目有好几个module,module之间还是相互依赖的,那么该怎么混淆呢?

    混淆方法

    1)在app module中统一配置混淆规则
    我们可以直接在app module中build.gradle文件配置所有module需要混淆的规则。这样,其他module中就无需开启混淆。但是并不推荐使用这种方法,当我们取消依赖某些module的时候,这样很容易造成混淆规则冗余,我们还需要删除掉该module相关的混淆配置,很麻烦。

    2)各个module单独配置混淆规则(推荐)
    我们也可以单独为module配置混淆规则,比较推荐这种做法。每个module管理自己的混淆文件,当我们不依赖该module的时候,就不会发生第一种方法出现的问题了。

    我们把app module称作为主模块,其依赖的其他module称作为子模块

    如图所示。我的app模块是依赖了其他模块的,其他模块也有相互依赖的地方。

    这里写图片描述

    网上很多关于子module的混淆配置是错误的,经过我的多次实践得出,主模块的混淆开关配置会直接影响到子模块,也就是说如果你的主模块开启的混淆,就算你的子模块关闭混淆开关,最终子模块还是会被混淆的。
    其次
    子模块混淆文件的指定是通过consumerProguardFiles这个属性来指定的,并不是proguardFiles 属性,而且我们无需配置其他的选项,只需要配置consumerProguardFiles属性就可以。该属性表示在打包的时候会自动寻找该module下我们指定的混淆文件对代码进行混淆。

    如果我们发布出一些开源库去给别人用,想要对库代码进行混淆的话,也可以通过配置该属性来达到目的

    这里写图片描述

    关于多模块混淆的小技巧

    一般来说,在组件化开发的情况下,app module的代码是很少的,依赖的第三方库也是很少的。我们可以把通用的混淆规则放到app module中。 这样子module就无需配置通用混淆规则,只需要配置一些该module所需要的混淆规则即可。大大减少了混淆代码。

    app module下的混淆规则
    这里给出一个也是从网上找的基本的混淆模板。关于自己项目的实体类和依赖的第三方sdk需要自己添加混淆规则,一般开源库都会给出混淆规则,没有的话就要自己百度了

    #
    #-------------------------------------------基本不用动区域----------------------------------------------
    #
    #
    # -----------------------------基本 -----------------------------
    #
    
    # 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。)
    -optimizationpasses 5
    # 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名)
    -dontusemixedcaseclassnames
    # 指定不去忽略非公共的库类(不跳过library中的非public的类)
    -dontskipnonpubliclibraryclasses
    # 指定不去忽略包可见的库类的成员
    -dontskipnonpubliclibraryclassmembers
    #不进行优化,建议使用此选项,
    -dontoptimize
     # 不进行预校验,Android不需要,可加快混淆速度。
    -dontpreverify
    
    
    # 屏蔽警告
    -ignorewarnings
    # 指定混淆是采用的算法,后面的参数是一个过滤器
    # 这个过滤器是谷歌推荐的算法,一般不做更改
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
    # 保护代码中的Annotation不被混淆
    -keepattributes *Annotation*
    # 避免混淆泛型, 这在JSON实体映射时非常重要
    -keepattributes Signature
    # 抛出异常时保留代码行号
    -keepattributes SourceFile,LineNumberTable
     #优化时允许访问并修改有修饰符的类和类的成员,这可以提高优化步骤的结果。
    # 比如,当内联一个公共的getter方法时,这也可能需要外地公共访问。
    # 虽然java二进制规范不需要这个,要不然有的虚拟机处理这些代码会有问题。当有优化和使用-repackageclasses时才适用。
    #指示语:不能用这个指令处理库中的代码,因为有的类和类成员没有设计成public ,而在api中可能变成public
    -allowaccessmodification
    #当有优化和使用-repackageclasses时才适用。
    #-repackageclasses com.test
    
     # 混淆时记录日志(打印混淆的详细信息)
     # 这句话能够使我们的项目混淆后产生映射文件
     # 包含有类名->混淆后类名的映射关系
    -verbose
    
    #
    # ----------------------------- 默认保留 -----------------------------
    #
    #----------------------------------------------------
    # 保持哪些类不被混淆
    #继承activity,application,service,broadcastReceiver,contentprovider....不进行混淆
    -keep public class * extends android.app.Activity
    -keep public class * extends android.app.Application
    -keep public class * extends android.support.multidex.MultiDexApplication
    -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 * extends android.view.View
    -keep class android.support.** {*;}## 保留support下的所有类及其内部类
    
    -keep public class com.google.vending.licensing.ILicensingService
    -keep public class com.android.vending.licensing.ILicensingService
    #表示不混淆上面声明的类,最后这两个类我们基本也用不上,是接入Google原生的一些服务时使用的。
    #----------------------------------------------------
    
    # 保留继承的
    -keep public class * extends android.support.v4.**
    -keep public class * extends android.support.v7.**
    -keep public class * extends android.support.annotation.**
    
    
    #表示不混淆任何包含native方法的类的类名以及native方法名,这个和我们刚才验证的结果是一致
    -keepclasseswithmembernames class * {
        native <methods>;
    }
    
    
    #这个主要是在layout 中写的onclick方法android:onclick="onClick",不进行混淆
    #表示不混淆Activity中参数是View的方法,因为有这样一种用法,在XML中配置android:onClick=”buttonClick”属性,
    #当用户点击该按钮时就会调用Activity中的buttonClick(View view)方法,如果这个方法被混淆的话就找不到了
    -keepclassmembers class * extends android.app.Activity{
        public void *(android.view.View);
    }
    
    #表示不混淆枚举中的values()和valueOf()方法,枚举我用的非常少,这个就不评论了
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    #表示不混淆任何一个View中的setXxx()和getXxx()方法,
    #因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。
    -keep public class * extends android.view.View{
        *** get*();
        void set*(***);
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    
    #表示不混淆Parcelable实现类中的CREATOR字段,
    #毫无疑问,CREATOR字段是绝对不能改变的,包括大小写都不能变,不然整个Parcelable工作机制都会失败。
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    # 这指定了继承Serizalizable的类的如下成员不被移除混淆
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        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();
    }
    # 保留R下面的资源
    -keep class **.R$* {
     *;
    }
    #不混淆资源类下static的
    -keepclassmembers class **.R$* {
        public static <fields>;
    }
    
    
    
    # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆
    -keepclassmembers class * {
        void *(**On*Event);
        void *(**On*Listener);
    }
    
    # 保留我们自定义控件(继承自View)不被混淆
    -keep public class * extends android.view.View{
        *** get*();
        void set*(***);
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }
    
    #
    #----------------------------- WebView(项目中没有可以忽略) -----------------------------
    #
    #webView需要进行特殊处理
    -keepclassmembers class fqcn.of.javascript.interface.for.Webview {
       public *;
    }
    -keepclassmembers class * extends android.webkit.WebViewClient {
        public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
        public boolean *(android.webkit.WebView, java.lang.String);
    }
    -keepclassmembers class * extends android.webkit.WebViewClient {
        public void *(android.webkit.WebView, jav.lang.String);
    }
    #在app中与HTML5的JavaScript的交互进行特殊处理
    #我们需要确保这些js要调用的原生方法不能够被混淆,于是我们需要做如下处理:
    -keepclassmembers class com.ljd.example.JSInterface {
        <methods>;
    }
    
    #(可选)避免Log打印输出
    -assumenosideeffects class android.util.Log {
       public static *** v(...);
       public static *** d(...);
       public static *** i(...);
       public static *** w(...);
     }
    
    
    
    

    子module下的混淆配置 示例

    只需要配置改module需要的混淆规则即可,注意我这里只是个示例,具体的混淆规则根据你的module来定。

    这里写图片描述

    这样一来,我们就优雅的完成了多module下的混淆配置。

    好了,就这些,希望能帮到你。觉得还行的话点个赞呦。


    如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

    展开全文
  • 可能资源被反编译影响还不是很大,而重新打包又由于有签名的保护导致很难被盗版,但代码被反编译就有可能会泄漏核心技术了,因此一款安全性高的程序最起码要做到的一件事就是:对代码进行混淆混淆代码并不是让...
  • 混淆打包(一)

    2016-05-09 20:41:54
    为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard
  • 今天给大家介绍一个开源.net混淆器——ConfuserEx http://yck1509.github.io/ConfuserEx/ 由于项目中要用到.net 混淆器,网上搜寻了很多款,比如Dotfuscator、xeoncode、foxit等等。 但大部分收费,当然也...
  • 混淆

    2016-07-19 11:27:43
    # 混淆: > 项目发布上线的apk都要进行混淆处理,混淆有两个主要目的:  (1)优化安装包的大小, 混淆后安装包会变小 (2)修改类名,方法名,属性名为abcd...防止别人反编译查看你的代码; ...
  • ProGuard 最全混淆规则说明

    万次阅读 2018-08-01 10:19:59
    文章对Android混淆规则做一个解释说明。作者才疏学浅,如有错误,请谅解!&lt;@_@&gt; Android混淆入门可参考《Android 代码混淆零基础入门》 5326.png Input/Output Options 输入输出选项 ...
  • Android Studio 代码混淆(包教包会)

    万次阅读 多人点赞 2019-10-28 16:49:47
    前言 ...其实还有一个重要的功能,就是能apk瘦身,混淆后的apk要比不混淆的小很多,这个大家可以自己验证。 一般以下情况都不需要混淆: 1.使用了自定义控件那么要保证它们不参与混淆 2.使...
  • 混淆矩阵(Confusion Matrix)分析

    万次阅读 多人点赞 2015-04-07 22:46:35
    在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表...
  • Android 混淆打包不混淆第三方jar包

    万次阅读 2014-06-23 00:29:14
    项目因为要发布,所以要混淆打包。 混淆打包流程: 1.在proguard-project.txt文件中添加不需要混淆的类和第三方的jar包     这个是保持自己包中不需要混淆的类,如果有些类调用了jni也不需要混淆,不然会出错...
  • proguard 不混淆内部类的方法

    万次阅读 2016-07-18 14:45:49
    保持proguard 不混淆内部类的方法有两种方法: 第一种: 直接-keep整个包下所有的类以及方法不被混淆; 如:-keep class com.AnywayAds.**{*;} 第二种: -keepnames class ...
  • RxJava 混淆配置

    万次阅读 2016-05-11 15:37:27
    RxJava 混淆配置
  • 给大家推荐一个.Net的混淆防反编译工具ConfuserEx。 由于项目中要用到.Net的混淆防反编译工具。 在网上找了很多.Net混淆混淆防反编译工具,如.NET Reactor、Dotfuscator、Eazfuscator.NET、ConfuserEx。 由于是...
  • android EventBus 3.0 官方的混淆配置

    万次阅读 2016-11-22 18:35:09
    android EventBus 3.0 混淆配置README中上根本找不到。 后来还是在官网的角落找到 混淆代码如下:-keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <m
  • 使用Proguard代码混淆器,特别要注意一点的就是使用了反射机制的类属性或方法最好不要参与混淆. Proguard 4.5 相关的选项配置如下:   #不要混淆MyBean的所有属性与方法 -keepclasseswithmembers class MyBean { ;...
  • js压缩混淆加密工具,解密工具

    万次阅读 2014-02-17 18:26:59
    js压缩混淆加密有什么不同 压缩 compress: 去掉空格,换行,注释等,格式紧凑,节约存储空间。 混淆 obfuscate/garble:替换变量名或方法名,让js不容易看懂。也做到了压缩的效果。 加密 encrypt:一般...
  • 写论文的过程中经常需要画一个混淆矩阵(confusion matrix)来验证分类结果的有效性。通常只需要两个步骤: - 保存混淆矩阵文本文件 - matlab中使用imagesc命令例如:>> rand(10,10) #这里只是生成一个随机数...
  • java代码混淆工具Jocky的介绍

    万次阅读 2017-07-24 15:48:12
    最近给的任务是代码混淆,以前没有接触过,所以只能从最基础的东西开始了解。主要应用的工具有jocky、progard、dex2jar、apktool、jd-GUI。今天简单介绍一下jocky的作用,并附上其他参考教程链接。 jocky是一款java...
1 2 3 4 5 ... 20
收藏数 306,354
精华内容 122,541
关键字:

混淆