zoukankan      html  css  js  c++  java
  • Android 混淆与混淆过滤

    Android 中代码混淆一般用的是ProGuard.它除了混淆代码之后还有其它许多实用的功能。这里主要记录混淆相关的实现。

    1.ProGuard的作用

      删除无用代码,压缩和优化Class文件,缩小APK的体积;

      提高逆向门槛,保护代码安全;

    2.ProGuard的使用

      Eclipse

      在Android2.3之前,混淆代码需手动添加proguard来实现代码混淆;2.3之后,Google将其加入到SDK中(SDK oolsgroguard)。当创建工程时,在工程的根目录下会自动生成project.properties,proguard-project.txt(旧片本为proguard.cfg),然后在Eclipse工程中可直接使用ProGuard混淆工程。启用混淆只需要简单的两步:

      老版本

      1)在project.properties中添加“proguard.config=proguard.cfg”

      2)在proguard.cfg中添加混淆和过滤的规则

      新版本

      1)解除project.properties文件中的“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的注释

      2)在proguard-project.txt中添加混淆和过滤的规则

      Android Studio

      1)引用ProGuard配置文件

    android {
        buildTypes {
            release {
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'),'some-other-rules.txt'
                //proguardFile 'some-other-rules.txt'  配置单个文件这样
            }
        }
    }

      2)在“proguard-android.txt”中添加过滤规则

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

    4.不能混淆的地方

      如果混淆的太严重的话,可能会造成程序不能正常使用,所以有些东西不能进行混淆(会被外部引用的地方),下面列举了几个不能混淆的地方:

      AndroidManifest中注册的Android组件;

      在XML中使用的自定义View;

      Android生成的资源索引文件R.Java;

      通过反射调用的类,方法等不能进行混淆;

      通过Jni与so通信的Native的方法不能进行混淆;

      通过WebView与JavaScript通信的方法不能进行混淆;

      其它一些静态常量等;

      

  • 相关阅读:
    Ubuntu根底入门教程
    Debian发行版总结
    ARCH中KDEMOD下如何管理挂在NTFS分区乱码的标题问题
    让YUM窗口化
    操持SUSE Linux 10下无法显示阻碍一例
    让debian支撑鼠标中键
    电视片头后期合成软件、制作流程与技巧简介
    关于动态数组、静态数组转换为字符串的一些问题 给 "厨师" 的回复
    论证 Assigned(btn) 与 Assigned(@btn) 的区别 答复 "sunnet"
    WinAPI: GetRegionData
  • 原文地址:https://www.cnblogs.com/pillowzhou/p/4941718.html
Copyright © 2011-2022 走看看