官网介绍:https://www.guardsquare.com/en/proguard/manual/introduction

android 开发文档:https://developer.android.com/studio/build/shrink-code.html

1.混淆的基本原理

android平台的混淆原理简单来说就是把代码中原来有具体含义的包名,类名,变量名,方法名等名称全部替换成按顺序排列的无意义的英文字母a、b、c….这样代码结构没有变化,还可以运行得到一样的结果,并且就算代码被反编译出来,别人很难弄懂代码的架构和具体意思。

2.混淆步骤

混淆过程:

  • 压缩(Shrink):侦测并移除代码中无用的类、字段、方法、和特性(Attribute)。
  • 优化(OPtimize):对字节码进行优化,移除无用指令。
  • 混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名。
  • 预检(Preveirfy): 在java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。。
a.打开
minifyEnabled  为true
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
} b.android studio 中自定义文件
sdk中tool里面proguard-android.txt
在文件 工程\app\proguard-rules.pro中自定义。
不混淆 ScrollView类中自定义的public print函数
-keepclassmembers class com.example.zcx.democoderjoy.ScrollViewActi {
public *;
}
效果:增加之前反编译:

家之后效果:

发现增加了print函数,并没有被混淆。

常见的参数:

-keep 指定类和类成员(变量和方法)不被混淆。

-keepclassmembers 指定类成员不被混淆(就是-keep的缩小版,不管类名了)。

-keepclasseswithmembers 指定类和类成员不被混淆,前提是指定的类成员存在

-keep

-keep public class * extends android.support.v4.**

-keepclassmembers

-keepclassmembers class * extends android.app.Activity{

public void *(android.view.View);

}

c.每次构建时 ProGuard 都会输出下列文件:

dump.txt
说明 APK 中所有类文件的内部结构。
mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。
seeds.txt
列出未进行混淆的类和成员。
usage.txt
列出从 APK 移除的代码。

这些文件保存在 <module-name>/build/outputs/mapping/release/ 中

3.混淆优缺点

混淆的优点主要两个:1.优化删除无用代码,减少apk的体积。2.混淆代码让其反编译之后,无法理解具体内容。

缺点:调试不方便(可以使用mapping.txt),测试不充分可能导致部分功能不能使用。

4.通用使用下面这些通配符来匹配:

1) :匹配任何原始类型,如 boolean 、 int 等,但不包括 void 

2) ? :匹配一个任意字符,不包括句号;

3) :匹配任意个任意字符,不包括句号;

4) ** :匹配任意个任意字符,包括句号;

5) *** :匹配任意类型,包括原始类型和非原始类型,数组类型和非数组类型;

6) … :匹配任何数目个任何类型的参数。

参考链接:http://www.chenglong.ren/2016/10/21/android%E4%B8%AD%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/

android 混淆基本知识的更多相关文章

  1. 关于Android App开发知识体系的一个小总结

     前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的知识体系进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 ...

  2. android混淆那些事

    写给Android开发者的混淆使用手册 综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及 ...

  3. Android混淆打包配置总结

    Android打包失败出现Proguard returned with error code 1. See console的错误 这个问题是由于代码混淆引起的,找不到引用包. 只需在你的proguar ...

  4. Android混淆那些事儿

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园:追风917 # Android混淆 Android混淆是Android开发者经常使用的一种用于代码防止被反编译的 ...

  5. 详细介绍android rom移植知识普及

    详细介绍android rom移植知识普及 最近接到很多兄弟们的求助,也回答过无数个和下面这个问题类似的问题: 如何编译android 原生代码得到一个rom,然后跑到某某手机上. 鉴于很多兄弟对这块 ...

  6. Android混淆、反编译以及反破解的简单回顾

    =========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...

  7. Android权限管理知识学习记录

    一.Android权限背景知识 在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以了,从而容易导致一些安全隐患,因此,在Android 6.0时,Goo ...

  8. Android 混淆那些事儿

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/WmJyiA3fDNriw5qXuoA9MA 作者:l ...

  9. android -------- 混淆打包报错(warning - InnerClass annotations are missing corresponding EnclosingMember annotations)

    最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations ...

随机推荐

  1. android 开发 View _14 MotionEvent和事件处理详解,与实践自定义滑动条View

    转载https://blog.csdn.net/huaxun66/article/details/52352469 MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列 ...

  2. kubernetes中service yaml文件的port作用

    yaml文件 [root@k8s-master ~]# cat service-hello.yaml apiVersion: v1 kind: Service metadata: name: serv ...

  3. 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)

    1. sys.argv[1:]  # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...

  4. 与引导文件系统/vmfs/devices..的备用设备之间的连接已丢失,主机配置更改将不会保存到持久存储中

    Cisco UCS 刀片服务器与NETAPP存储 1.异常问题描述: 2.可能原因:存储链路异常     比如断电恢复.光纤线本身的问题.模块的问题.环境温度的问题.bug之类的都有可能 3.处理: ...

  5. idea导入项目

    1. 2.导入项目 3.右键项目选择web 4.编辑添加tomcat 5.添加jar.包 6. 7.右键put into 8.安装tomcat 9.引入tomcat 10.把项目布署到tomcat

  6. centos 7设置本地yum资源库

    前言 同样的,是在这两天安装ambari的时候遇到的问题之一,那就是关于centos的本地yum源的制作,当时是一种是制作iso镜像的yum源,还有一种将rpm软件包打成压缩包上传到centos的某一 ...

  7. PostgreSQL使用笔记

    下载并安装 注意安装图形界面 pgAdmin 需要输入缺省用户 postgres 的密码 在 Windows 下安装之后注意把 bin文件夹加到 Path 环境变量中. 重置密码 使用管理员权限打开 ...

  8. oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  9. tensorflow 升级后报错:ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory

    我的tensorflow之前的版本是1.2的所以支持cudnn5,但是tensorflow1.3及以上就是支持cudnn6. 查看: /usr/local/cuda/lib64$ ls  libcud ...

  10. python中获取python版本号的方法

    import platform print platform.python_version()