前言

在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使被反编译,也难以阅读; 很多人不知道怎么设置混淆,哪些不需要混淆,那来了老铁们,可以直接拿来用的知识点。

AS中混淆配置

在AS中可以通过配置proguard-rules.pro文件,对生成的apkjar进行加密,另外还需要配置项目中 app下的 build.gradle 来开启混淆功能。

AS中项目混淆配置

gradle中代码如下,直接拿来用

buildTypes {debug {         minifyEnabled false // 混淆  zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  // 加载默认混淆配置文件  signingConfig signingConfigs.debug // 签名}release {                      minifyEnabled true // 混淆            zipAlignEnabled true // Zipalign优化          shrinkResources true  // 移除无用的resource文件           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  // 加载默认混淆配置文件signingConfig signingConfigs.relealse  // 签名}}

规则

混淆会用无意义的短变量去重命名类、变量、方法,但是对于外部的一些引用是通过名字找到对应的方法和类。混淆过后通过原来的名字去找混淆后的名字,是找不到对应方法和类,就会出异常报错。所以有些情况是不能进行混淆的。

  1. 自定义控件不进行混淆
  2. 枚举类不被混淆
  3. 反射类不进行混淆
  4. 实体类不被混淆
  5. JS调用的Java方法
  6. 四大组件不进行混淆
  7. JNI中调用类不进行混淆
  8. Layout布局使用的View构造函数、android:onClick
  9. Parcelable的子类和Creator静态成员变量不混淆

混淆文件内容

基本混淆指令

# 设置混淆的压缩比率 0 ~ 7
-optimizationpasses 5
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的成员
-dontskipnonpubliclibraryclassmembers
# 混淆时不做预校验
-dontpreverify
# 混淆时不记录日志
-verbose
# 忽略警告
-ignorewarning
# 代码优化
-dontshrink
# 不优化输入的类文件
-dontoptimize
# 保留注解不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 保留代码行号,方便异常信息的追踪
-keepattributes SourceFile,LineNumberTable
# 混淆采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*  # dump.txt文件列出apk包内所有class的内部结构
-dump class_files.txt
# seeds.txt文件列出未混淆的类和成员
-printseeds seeds.txt
# usage.txt文件列出从apk中删除的代码
-printusage unused.txt
# mapping.txt文件列出混淆前后的映射
-printmapping mapping.txt

不需混淆的Android类

support design库、support下的所有类及其内部类、Android类

-keep public class * extends android.app.Fragment
-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.preference.Preference
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.view.View
-keep public class com.android.vending.licensing.ILicensingService-keep class android.support.** {*;}
-dontwarn android.support.**
-keep interface android.support.** { *; }-keep class androidx.** {*;}
-keep interface androidx.** {*;}
-keep public class * extends androidx.**
-dontwarn androidx.**-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }-keep class com.google.android.material.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**

避免混淆自定义控件类的 get/set 方法和构造函数

-keep public class * extends android.view.View{*** get*();void set*(***);public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);
}

关闭 Log日志

-assumenosideeffects class android.util.Log {public static boolean isLoggable(java.lang.String, int);public static int v(...);public static int i(...);public static int w(...);public static int d(...);public static int e(...);
}

避免资源混淆

-keep class **.R$* {*;}

避免layout中onclick方法

-keepclassmembers class * extends android.app.Activity{public void *(android.view.View);
}

避免混淆枚举类

-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}

Natvie 方法不混淆

-keepclasseswithmembernames class * {native <methods>;
}

避免Parcelable混淆和Serializable接口

-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}-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();
}

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, jav.lang.String);
}
-keep public class [包名.类名]$[内部类]{public *;
}
-keepattributes JavascriptInterface

网络框架OkHttp3混淆配置

-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.**

Android之app混淆深入分析-层层解析解决开发中痛点相关推荐

  1. android 启动app过程,Android P APP冷启动过程全解析(之四)

    经历了前面的三个阶段,activity终于初始化完毕,终终终于开始显示了和接收事件了!这就是本阶段所要做的工作: 15.新建DecorView 16.新建ViewRootImpl 17.添加到Disp ...

  2. 30.Android优化-APP启动白屏的解决办法

    平时发现自己写的APP,启动后总有几秒的白屏,很恶心,所以下决心改一下! 下面这个是全局的的Style <style name="AppTheme" parent=" ...

  3. 实现if_如何解决开发中 if...esle 代码过多的问题,强烈推荐!

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  4. Android项目:proguard混淆之常见开源项目混淆配置

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

  5. android app 的后台代码,包括后台的Android美食APP项目开源代码

    项目简介 小食光定位为一款集美食,社交,LBS服务于一体的美食推荐APP.为你发现周边美食的同时提供一个吃货分享的平台. APP截图 功能模块 美食推荐 :提供基础的美食信息查询: 商家推荐 : 基于 ...

  6. android应用app开发

    开发android 的app是用java写的, 开发ios的app是用obj-c写的,类似c++, 对于这两种语言都不了解的情况下去做app开发成本还是比较大的,还好,市场上有些拖拽就可以建应用的工具 ...

  7. android开发工具箱下载,android开发工具箱APP

    android开发工具箱APP是一款能够帮助用户更好的去学习安卓系统设计的软件,在这个平台上面有着一定程度的开发编辑服务功能,能够帮助用户更好的认识安卓程序的代码,并且还能够进行各种智能服务,让用户再 ...

  8. 婚恋交友app开发中需要注意的安全问题

    前言 随着移动设备的普及,婚恋交友app已经成为了人们生活中重要的一部分.但是,这些应用的开发者需要确保应用的安全性,以保护用户的隐私和数据免受攻击.本文将介绍在婚恋交友app开发中需要注意的安全问题 ...

  9. android 继承relativelayout,Android开发中RelativeLayout相对布局

    Android开发中RelativeLayout相对布局 RelativeLayout布局是Android界面布局中应用最广也最强大的一种布局,其不只十分灵活,能够解决开发中各类界面布局需求,同时也很 ...

最新文章

  1. 直播系统开发:功能创新提升用户留存
  2. MyBatis的一对和多对对和动态SQL
  3. 【数据结构与算法-2】链表
  4. leetcode213. 打家劫舍 II
  5. ntfs安全权限和共享权限的区别
  6. php函数前面加符号 和 变量前面加符号的意义
  7. Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
  8. 关于微信小程序的视频的坑
  9. 基于mAppWidget实现手绘地图--索引DEMO
  10. CMP?MSP?1+1才能大于2
  11. android外设按键,Android 外接键盘的按键处理
  12. Java工程师历年企业笔试真题汇总
  13. 免费ftp服务器软件,实用的3款免费ftp服务器软件
  14. 低代码里程碑版—JeecgBoot 3.4.3 版本发布,低代码功能专项升级
  15. sws_scale概念讲解
  16. RF自动化-RIDE(跑自动化注意事项)和(配置环境注意事项)
  17. SeleniumLibrary4.5.0 关键字详解(十)
  18. 内网通讯工具都有哪些?
  19. [附源码]Python计算机毕业设计SSM竞赛报名管理系统(程序+LW)
  20. Codeforces 662C

热门文章

  1. 爬虫python编程与cvi编程_与爬虫无关,简单的用python进行科学运算
  2. java web 总结,Java Web 相关概念经典总结(一)
  3. java 值对象_java 中设计模式(值对象)的实例详解
  4. C#中throw抛出异常后,后续代码执行情况
  5. mqtt 串口_MQTT网关介绍及应用原理
  6. mysql-atlas安装及使用教程
  7. 设计模式学习(五) 适配器模式
  8. (转)NGUI研究院之三种方式监听NGUI的事件方法
  9. CommandBehavior.CloseConnection有何作用
  10. 蘋果全新MacBook價高質更精