android 混淆基本知识
官网介绍: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) … :匹配任何数目个任何类型的参数。
android 混淆基本知识的更多相关文章
- 关于Android App开发知识体系的一个小总结
前言 本文从热更新.异步并发.性能优化.网络请求等多个方面对Android App开发的知识体系进行了一个分类总结.欢迎大家沟通交流. 热更新 [原]热更新开源项目Tinker源码解析之Dex热更新 ...
- android混淆那些事
写给Android开发者的混淆使用手册 综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及 ...
- Android混淆打包配置总结
Android打包失败出现Proguard returned with error code 1. See console的错误 这个问题是由于代码混淆引起的,找不到引用包. 只需在你的proguar ...
- Android混淆那些事儿
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园:追风917 # Android混淆 Android混淆是Android开发者经常使用的一种用于代码防止被反编译的 ...
- 详细介绍android rom移植知识普及
详细介绍android rom移植知识普及 最近接到很多兄弟们的求助,也回答过无数个和下面这个问题类似的问题: 如何编译android 原生代码得到一个rom,然后跑到某某手机上. 鉴于很多兄弟对这块 ...
- Android混淆、反编译以及反破解的简单回顾
=========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...
- Android权限管理知识学习记录
一.Android权限背景知识 在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以了,从而容易导致一些安全隐患,因此,在Android 6.0时,Goo ...
- Android 混淆那些事儿
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/WmJyiA3fDNriw5qXuoA9MA 作者:l ...
- android -------- 混淆打包报错(warning - InnerClass annotations are missing corresponding EnclosingMember annotations)
最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations ...
随机推荐
- ubuntu 16.04 mysql5.7.17 开放远程3306端口
ubuntu 16.04 mysql5.7.17 开放远程3306端口 原创 2017年01月19日 20:33:27 标签: mysql / ubuntu 2644 开启mysql的远程访问权限 默 ...
- lvm管理:扩展lv、删除pv、lv等
从卷组VG里扩展lv.删除pv,并删除物理卷PV 一.扩展LV.缩小LV 1.卸载LV 命令:umount "挂载目录" 2.扩展LV 命令:lvextend -L +500m ...
- html: 仿制soundmanager2右上角面板
仿制 http://schillmania.com/projects/soundmanager2/#volume 右上角面板 <style type="text/css"&g ...
- leetcode207
拓扑排序问题. class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>&a ...
- C# 委托和泛型
委托定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有 ...
- CentOS 7 无法yum安装解决方法
1)下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 2)备份并替换系统的repo文件 .repo /etc/yum.repos.d ...
- 一篇面经(BAT面试)(转)
0. 写在之前 首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自 ...
- php 计算 距离
function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为 ...
- 坑之mysql 字符串与数字操作
select "123"+1 = 124; select "1a23"+1 = 2; select "aa23"+1 = 1; select ...
- 最小生成树求最大比率 UVALive - 5713
题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...