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

1.ProGuard的作用

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

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

2.ProGuard的使用

  Eclipse

  在Android2.3之前,混淆代码需手动添加proguard来实现代码混淆;2.3之后,Google将其加入到SDK中(SDK\tools\groguard)。当创建工程时,在工程的根目录下会自动生成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通信的方法不能进行混淆;

  其它一些静态常量等;

  

Android 混淆与混淆过滤的更多相关文章

  1. 【Android Studio安装部署系列】十二、Android studio代码混淆

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 为什么需要代码混淆呢?原因很简单,你的apk很容易被反编译出来,你写的代码都会被看到,因此我们需要在编译过程中对代码进行一定程度的混 ...

  2. Android项目:proguard混淆第三方jar.

    1.Gson混淆 ## ---------------------------------- ##   ########## Gson混淆    ########## ## ------------- ...

  3. Android项目代码混淆

    http://coolshell.info/blog/2015/03/Android-studio-prefrence.html 什么是Gradle Gradle是一种依赖管理工具,基于Groovy语 ...

  4. Android项目增加混淆

    主要介绍向Android项目中添加混淆功能 增加混淆的原因 提高安全性,增加反编译的难度 减少APK的文件大小 实践 混淆的配置 一般情况下,app module 的 build.gradle 文件默 ...

  5. Android Stuido代码混淆

    一.Android Studio 代码混淆基本配置首先我们要在build.gradle里设置 miifyEnabled 里改为true,表示可以混淆 proguardFiles getDefaultP ...

  6. 写给Android开发者的混淆使用手册

    转自:http://huihui.name/2016/10/23/%E5%86%99%E7%BB%99Android%E5%BC%80%E5%8F%91%E8%80%85%E7%9A%84%E6%B7 ...

  7. Android APK代码混淆与资源混淆详解,你确定不看?

    APK的混淆分为资源混淆与代码混淆.一般大部分都使用两者结合.尤其是目前主流的应用. 其中的优点: 防止被恶意破解逆向分析 减少apk体积,也是瘦身的方法 代码可阅读性降低 其中的缺点: 调试不方便( ...

  8. (通用)Android App代码混淆终极解决方案【转】

    App虽然没有那么的高大上,但是代码的混淆是代表了程序员对App的责任心, 也是对App安全的一点点保证.今天我会将自己做Android混淆的过程和体会分享给大家,也避免大家少走弯路,少跳坑. 本篇博 ...

  9. Android Progurad 代码混淆

    ref: ProGuard基础语法和打包配置.mdhttps://github.com/D-clock/Doc/blob/master/Android/Gradle/3_ProGuard%E5%9F% ...

随机推荐

  1. 语义化的HTML

    div:division(分开, 分割, 区分,分配, 分界线),标签可以把文档分割为独立的.不同的部分.作为块级元素的代表,因为没有固定的格式表现,目前滥用情况最严重.ul:Unordered Li ...

  2. 编程异常——假设你报createSQLQuery is not valid without active transaction,...

    非常多时候我们使用hibernate的session时,都是让session在某一执行环境中保持其唯一. 比如在同一线程内用同一个session.在同一方法内用同一session,这样我们就能够用se ...

  3. 数据结构复习:希尔排序的C++实现

    1.原理介绍 希尔排序又称为缩小增量排序,由D.L.Shell在1959年提出而得名. 该算法先取一个小于数据表中元素个数 n 的整数gap, 并以此作为第一个间隔,将数据分为gap个子序列,所有距离 ...

  4. MVC网站发布常见问题

    直接发布的时候生成的bin会漏掉一些文件,从而导致网站无法访问: 解决方法:发布之后,再在本地运行一下网站,然后将运行后生成的bin文件夹下的文件拷贝到发布的文件夹目录下进行覆盖,就可以了

  5. 深入NGINX:我们如何设计它的性能和扩展性

    为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...

  6. 关于去除Dialog的黑色背景框

    Dialog有两种形式的,一个是Dialog及其子类,还有一种是Activity的Dialog显示方式. 不管怎样,在自定义Dialog的时候,如果不做一些处理,都会出现黑色背景边框,这个问题动不动就 ...

  7. MySQL · 特性分析 · 内部临时表

    http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种 ...

  8. ios中@class和 #import,两种方式的讨论

    转自:http://blog.sina.com.cn/s/blog_a843a8850101b6a7.html 很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在 ...

  9. 从ext2文件系统上读出超级块

    概述            本篇博客中,我们将仔细分析如何从格式化为ext2文件系统的磁盘中读取超级块并填充内存超级块结构,每次将一个格式化了ext2文件系统的磁盘(分区)挂载到挂载点的时候会调用该方 ...

  10. php对比辨析之 mysql_escape_string & mysql_real_escape_string & addsalshes

    概述: addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤. addslashes 转义的字符是单引号(').双引号("). ...