混淆

studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。

  • 功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。
  • 优点:
    1.删除项目无用的资源,有效减小apk大小;
    2.删除无用的类、类成员、方法和属性,还可以删除无用的注释,最大限度的优化字节码文件;
    3.使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度。

配置

    buildTypes {
release {
// true - 打开混淆
minifyEnabled true
// true - 打开资源压缩
shrinkResources true
// 用于设置Proguard的规划路径;
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',
'../libModule/proguard-rules.pro'
}
}
  • proguard-android.txt:其中proguard-android.txt 是系统默认的混淆文件,具体在../sdk/tools/proguard/ 目录下,其中包含了 android 最基本的混淆,一般不需要改动;
  • proguard-rules.pro:是我们需要配置的规则;
  • 如果要配置多个Module的混淆文件,只需要后面添加逗号跟混淆文件路径;

基本混淆配置

# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames # 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses # 指定不去忽略非公共库的类成员
-dontskipnonpubliclibraryclassmembers # 这句话能够使我们的项目混淆后产生映射文件
# 包含有类名->混淆后类名的映射关系
-verbose # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
-dontpreverify # 保留Annotation不混淆 这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation*,InnerClasses # 避免混淆泛型
-keepattributes Signature # 抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable # 指定混淆是采用的算法,后面的参数是一个过滤器
# 这个过滤器是谷歌推荐的算法,一般不做更改
-optimizations !code/simplification/cast,!field/*,!class/merging/* # 忽略警告
-ignorewarnings # 设置是否允许改变作用域
-allowaccessmodification # 把混淆类中的方法名也混淆了
-useuniqueclassmembernames # apk 包内所有 class 的内部结构
-dump class_files.txt # 未混淆的类和成员
-printseeds seeds_txt # 列出从apk中删除的代码
-printusage unused.txt # 混淆前后的映射
-printmapping mapping.txt

不能使用混淆

  • 1、反射中使用的元素,需要保证类名、方法名、属性名不变,否则反射会有问题。
  • 2、最好不让一些bean 类混淆
  • 3、四大组件不能混淆,四大组件必须在 manifest 中注册声明,而混淆后类名会发生更改,这样不符合四大组件的注册机制。
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgent
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep public class * extends android.view.view
-keep public class com.android.vending.licensing.ILicensingService
  • 4、注解不能混淆,很多场景下注解被用于在进行时反射一些元素。
-keepattributes *Annotation*
  • 5、不能混淆枚举中的value和valueOf方法,因为这两个方法是静态添加到代码中进行,也会被反射使用,所以无法混淆这两种方法。应用使用枚举将添加很多方法,增加了包中的方法数,将增加 dex 的大小。
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
  • 6、JNI 调用 Java 方法,需要通过类名和方法名构成的地址形成。
  • 7、Java 使用 Native 方法,Native 是C/C++编写的,方法是无法一同混淆的。
-keepclasseswithmembernames class * {
native <methods>;
}
  • 8、JS 调用Java 方法
-keepattributes *JavascriptInterface*
  • 9、Webview 中 JavaScript 的调用方法不能混淆
    注意:Webview 引用的是哪个包名下的。
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
} -keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
} -keepclassmembers class * extends android.webkit.WebViewClient {
public void *(android.webkit.WebView, java.lang.String);
}
  • 10、第三方可建议使用其自身混淆规则
  • 11、Parcelable 的子类和 Creator 的静态成员变量不混淆,否则会出现 android.os.BadParcelableExeception 异常。
    Serializable 接口类反序列化:
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
} -keep class * implements java.io.Serializable {
public *;
} -keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
  • 12、Gson 的序列号和反序列化,其实质上是使用反射获取类解析的
-keep class com.google.gson.** {*;}
-keep class sun.misc.Unsafe {*;}
-keep class com.google.gson.stream.** {*;}
-keep class com.google.gson.examples.android.model.** {*;}
-keep class com.google.** {
<fields>;
<methods>;
}
-dontwarn class com.google.gson.**

Android studio 混淆配置的更多相关文章

  1. Android studio混淆

    看了一篇关于Android studio混淆的文章http://blog.csdn.net/qq_23547831/article/details/51581491,感觉有必要总结一个简单的混淆版本设 ...

  2. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  3. android studio+grade配置构建

    Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试.部署.签署和分发的 APK.android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同 ...

  4. Android studio gradle配置完整版(转)

    Android studio gradle配置完整版https://my.oschina.net/u/1471093/blog/539075 Android studio 自定义打包apk名 - pe ...

  5. Android Studio最新配置教程2016

    http://blog.csdn.net/wen_demo 一.Android studio 基本简单介绍 1.Android studio和Eclipse的差别: 1.Studio中有Project ...

  6. Opencv4android的Android Studio项目配置及实例下载

    因为软件竞赛的项目会用到Opencv fo rAndroid,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...

  7. Opencv4android的Android Studio环境配置及项目实例下载

    因为软件竞赛的项目会用到Opencv for Android,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...

  8. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

  9. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

随机推荐

  1. Detectron2源码阅读笔记-(三)Dataset pipeline

    构建data_loader原理步骤 # engine/default.py from detectron2.data import ( MetadataCatalog, build_detection ...

  2. Fluter基础巩固之Dart语言详解<三>

    继续Dart语言的学习,这次过后下次就进入全新的Flutter的学习了,小小的激动.. 操作符重载: C++中也有,咱们来看一下在Dart中是如何来实现的: 比较简单. 异步[重要!]: async和 ...

  3. vue-router模式history与hash

    [重点] history与hash路由的区别 hash前端路由,无刷新 history 会去请求接口 vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 U ...

  4. @TableId

    描述:主键注解 属性 类型 必须指定 默认值 描述 value String 否 "" 主键字段名 type Enum 否 IdType.NONE 主键类型 #IdType 值 描 ...

  5. 套接字编程(TCP)

    json模块补充 json保存的格式中,key值一定要用双引号隔开 import json #把字典转成json格式字符串 dic = {'name': 'lqz', 'xx': False, 'yy ...

  6. Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam

    链接: https://codeforces.com/contest/1278/problem/C 题意: Karlsson has recently discovered a huge stock ...

  7. Asp.Net报https请求报传输流收到意外的 EOF 或 0 个字节

    网上搜索,都说是.net framework版本太低,改为.net 4.5以上版本即可.于是使用vs2017环境测试了下,使用.net framework4.5版本确实可以正常返回结果,低于这个版本就 ...

  8. ABP 菜单和权限

    大致操作步骤,原理之后补充. 添加菜单: 在 ContractOwner.Web.Startup.ContractOwnerNavigationProvider 的SetNavigation方法中添加 ...

  9. ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT

    首先你需要知道MQTT并不是什么高大上的事物,它只是一个软件,对就是一个软件.其实就是个TCP服务器 一,既然是TCP服务器,这个TCP服务器和咱平时做的有什么不一样呢. 首先,平时的时候咱做的TCP ...

  10. ISE 14.7安装教程最新版(Win10安装)

    一.下载 第一步下载首先自己下载好四个压缩包,把第一个解压,其余的三个不用解压,然后去第一个解压后的文件夹打开启动程序. 第二步是点击启动程序后会有以下界面 next到下一个界面,这个时候需要把之前没 ...