1) 前言

ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。

2) ProGuard作用

压缩: 移除无效的类、属性、方法等

优化: 优化字节码,并删除未使用的结构

混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c

3) 混淆注意事项

1. 不能混淆

在AndroidManifest中配置的类,比如四大组件

JNI调用的方法

反射用到的类

WebView中JavaScript调用的方法

Layout文件引用到的自定义View

一些引入的第三方库(一般都会有混淆说明的)

这里推荐两个开源项目,里面收集了一些第三方库的混淆规则

不难理解,混淆之后,类名会变成a,b,c这种,通过包名+类名自然就会找不到该类了,自然就会出现ClassNotFoundException异常。这里推荐一篇文章:

http://www.itnose.net/detail/6043297.html

2. Log处理

我们都知道,使用Log的时候,需要用到TAG,然而TAG我们一般都会写成:

private static final String TAG = MainActivity.class.getSimpleName()

这时候MainActivity如何被混淆的话,log输出信息就会变成V/a:xxxxxxx,所以为了让log输出信息维持原状,可以将TAG处理成固定的字符串:

private static final String TAG = "MainActivity"

正好Android Studio里面的Live Templates

能让你轻轻松松的声明TAG

3. Crash信息处理

代码混淆的时候记得加上在混淆文件里面记得加上这句:

# keep住源文件以及行号

-keepattributes SourceFile,LineNumberTable

否则你看到的崩溃信息就会变成这样子(图片来自bugly)

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

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

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

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

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

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

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

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

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

通配符匹配规则

通配符

规则

匹配单个字符

*

匹配类名中的任何部分,但不包含额外的包名

**

匹配类名中的任何部分,并且可以包含额外的包名

%

匹配任何基础类型的类型名

*

匹配任意类型名 ,包含基础类型/非基础类型

...

匹配任意数量、任意类型的参数

匹配任何构造器

匹配任何字段名

匹配任何方法

*(当用在类内部时)

匹配任何字段和方法

$

指内部类

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\tools\proguard\bin 目录下有个retrace工具可以将混淆后的报错堆栈解码成正常的类名

window下为retrace.bat,linux和mac为retrace.sh,

使用方法如下:

将crash log保存为yourfilename.txt

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

执行命令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"

}

}

}

}

}

......

}

}

5) 参考

6) 后话

打个小广告,推荐下自己的:Android-Dev-Favorites,里面收集了Android开发的干货,并且会不定期更新哦。

android代码混淆作用,Android分享:代码混淆那些事相关推荐

  1. android 混淆作用,Android开发之——Android 代码混淆(1)

    前言 在开始之前我们先看几个概念: 混淆 概念: 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正 ...

  2. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

  3. android布局的作用,Android UI布局经验总结

    如何在Android中动态设置颜色透明?10%20%到100% Android布局分析工具HierarchyView Android使用include/merge/ViewStub优化布局 List的 ...

  4. android minheight的作用,Android 自定义 View 最少必要知识

    1. 什么是自定义 View? 1.1 定义 在 Android 系统中,界面中所有能看到的元素都是 View.默认情况下,Android 系统为开发者提供了很多 View,比如用于展示文本信息的 T ...

  5. android.support.v4作用,Android Support V4, V7, V13的作用与用法

    1, Android Support V4, V7, V13是什么? 本质上就是三个java library. 2,  为什么要有support库? 如果在低版本Android平台上开发一个应用程序, ...

  6. android scaletype没作用,Android ImageView的ScaleType属性

    参考 ScaleType属性 常量 含义 fitXY 横向.纵向独立缩放,以适应该ImageView fitCenter 保持纵横比缩放图片,缩放完成后将图片放在ImageView的中央 fitSta ...

  7. android scaletype没作用,Android源码系列之深入理解ImageView的ScaleType属性

    做Android开发的童靴们肯定对系统自带的控件使用的都非常熟悉,比如Button.TextView.ImageView等.如果你问我具体使用,我会给说:拿ImageView来说吧,首先创建一个新的项 ...

  8. android scaletype没作用,Android ImageView 的scaleType 属性图解

    ImageView 是 Android 中最常用的控件之一,而在使用ImageView时,必不可少的会使用到它的scaleType属性.该属性指定了你想让ImageView如何显示图片,包括是否进行缩 ...

  9. Android适配器以及作用,Android RecyclerView 通用适配器的实现

    分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...

最新文章

  1. 简析Uber的可伸缩监控:uMonitor和Neris
  2. C++回顾day01---C++对C的增强
  3. pywebQQ-----linux下webQQ的替换者
  4. [云炬创业基础笔记]第十一章创业计划书测试6
  5. 年前最后一波成绩单,请查收!
  6. spring学习(51):对象的初始化和销毁
  7. 深度学习之非极大值抑制(Non-maximum suppression,NMS)
  8. 陈景润:激励青年勇攀科学高峰的典范
  9. (SRNTT)Image Super-Resolution by Neural Texture Transfer
  10. Linux C面试题(内存管理)
  11. 网上图书商城项目学习笔记-028编辑一级分类
  12. 编译mod_jk.so
  13. ArcGIS Pro 简明教程(3)数据编辑
  14. 自然语言处理——分词系统(正向最大匹配法)
  15. 如何使用 哑节点(dummy node),高效解决问题
  16. Box2d VS Nape 学习笔记
  17. 如何优雅的使用LiveData实现一套EventBus(事件总线)
  18. 如何查看手机APP的包名,并快速查找
  19. JST日本压着端子SHD系列线对板连接器的PCB封装库
  20. 电脑视频剪辑用哪个软件,好用的电脑视频剪辑软件有哪些

热门文章

  1. 产品认知:产品经理进入新公司第一件事该做什么?
  2. MySQL实战案例100例(一)-如何解决非等值范围查找问题?
  3. php mysql插入的数据有引号_php – 由于’引号’的不同,数据没有插入到mysql数据库中...
  4. android config.mk,android编译分析之10—config.mk
  5. 移动端(H5)弹框组件--简单--实用--不依赖jQuery
  6. 什么是 HTML5?
  7. 前端为什么非要动静分离 说一下CDN托管的意义
  8. abp.event.on与abp.event.off使用
  9. Easy.Ajax 部分源代码, 支持文件上传功能, 兼容所有主流浏览器
  10. leetcode 970. 强整数(Powerful Integers)