Android混淆(包括混淆四大组件)
ps:这篇文章主要是自己对混淆的理解
目录
概念:
使用:
基本的混淆规则:
常用的混淆规则:
自定义混淆规则:
混淆四大组件:
注意事项:
Demo地址:
概念:
简单的来说就是将源代码变成难以看懂的,如果不想app上架之后被人反编译拿到源代码直接CV的话建议看一看,哈哈
- 好处:
增加反编译只会源代码的阅读难度
自动优化代码 用以减小应用体积,移除未被使用的类和成员
在字节码级别执行优化,让应用运行的更快。
废话不多说,对比两张图片比较一下:
混淆之前:
混淆之后 :
从这两张图的对比很容易发现,这里的很多包名以及类名都被混淆了,还有代码的优化
使用:
在Android主工程build.gradle添加代码
android{buildTypes {debug {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}release {minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
这样就可以了,是不是很简单呢
minifyEnabled 就是混淆的开关
在对应的模块当中会有proguard-rules.pro文件,如果需要自己定制混淆规则,可以在这个文件当中去更改
基本的混淆规则:
偷懒扔个链接:
混淆规则参考
常用的混淆规则:
懒人可以直接CV大法到项目当中使用
# This is a configuration file for ProGuard. # http://proguard.sourceforge.net/index.html#manual/usage.html # # Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with # the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and # will be ignored by new version of the Android plugin for Gradle.# Optimizations can be turned on and off in the 'postProcessing' DSL block. # The configuration below is applied if optimizations are enabled. # Adding optimization introduces certain risks, since for example not all optimizations performed by # ProGuard works on all versions of Dalvik. The following flags turn off various optimizations # known to have issues, but the list may not be complete or up to date. (The "arithmetic" # optimization can be used if you are only targeting Android 2.0 or later.) Make sure you test # thoroughly if you go this route. # --------------------------------------------基本指令区-------------------------------------------# 指定代码的压缩级别(在0~7之间,默认为5) -optimizationpasses 5 # 是否使用大小写混合(windows大小写不敏感,建议加入) -dontusemixedcaseclassnames# 是否混淆非公共的库的类 -dontskipnonpubliclibraryclasses # 是否混淆非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # 混淆时是否做预校验(Android不需要预校验,去掉可以加快混淆速度) # 混淆时是否记录日志(混淆后会生成映射文件) -verbose# 混淆时所采用的算法(谷歌推荐算法) -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable -useuniqueclassmembernames -allowaccessmodification # 将文件来源重命名为“SourceFile”字符串 -renamesourcefileattribute SBFile# 保持注解不被混淆 -keepattributes *Annotation* -keep class * extends java.lang.annotation.Annotation {*;}# 保持泛型不被混淆 -keepattributes Signature # 保持反射不被混淆 -keepattributes EnclosingMethod # 保持异常不被混淆 -keepattributes Exceptions # 保持内部类不被混淆 -keepattributes Exceptions,InnerClasses # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable# --------------------------------------------默认保留区--------------------------------------------# # 保持基本组件不被混淆 -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.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference# Support包规则 -dontwarn android.support.** -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.**# 保持 native 方法不被混淆 -keepclasseswithmembernames class * {native <methods>; }# 保留自定义控件(继承自View)不被混淆 -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); }# 保留指定格式的构造方法不被混淆 -keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int); }# 保留在Activity中的方法参数是view的方法(避免布局文件里面onClick被影响) -keepclassmembers class * extends android.app.Activity {public void *(android.view.View); }# 保持枚举 enum 类不被混淆 -keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String); }# 保持R(资源)下的所有类及其方法不能被混淆 -keep class **.R$* { *; }# 保持 Parcelable 序列化的类不被混淆(注:aidl文件不能去混淆) -keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *; }# 需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆) -keepnames class * implements java.io.Serializable# 保持 Serializable 序列化的类成员不被混淆 -keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;!private <fields>;!private <methods>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve(); }# 保持 BaseAdapter 类不被混淆 -keep public class * extends android.widget.BaseAdapter { *; }# --------------------------------------------webView区--------------------------------------------# # WebView处理,项目中没有使用到webView忽略即可 # 保持Android与JavaScript进行交互的类不被混淆 -keep class **.AndroidJavaScript { *; } -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.WebChromeClient {public void *(android.webkit.WebView,java.lang.String); }# 网络请求相关 -keep public class android.net.http.SslError################retrofit############### -dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions################butterknife############### -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * {@butterknife.* <fields>; } -keepclasseswithmembernames class * {@butterknife.* <methods>; }################gson############### -keepattributes Signature -keepattributes *Annotation* -keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.sunloto.shandong.bean.** { *; }################okhttp############### -keepattributes Signature -keepattributes *Annotation* -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } -keep class okhttp3.** { *; } -keep interface okhttp3.** { *; } -dontwarn com.squareup.okhttp.**-keep class com.facebook.** { *; }################autolayout############### -keep class com.zhy.autolayout.** { *; } -keep interface com.zhy.autolayout.** { *; }################RxJava and RxAndroid############### -dontwarn org.mockito.** -dontwarn org.junit.** -dontwarn org.robolectric.**-keep class io.reactivex.** { *; } -keep interface io.reactivex.** { *; }-keepattributes Signature -keepattributes *Annotation* -keep class com.squareup.okhttp.** { *; } -dontwarn okio.** -keep interface com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.**-dontwarn io.reactivex.** -dontwarn retrofit.** -keep class retrofit.** { *; } -keepclasseswithmembers class * {@retrofit.http.* <methods>; }-dontwarn java.lang.invoke.*-keepclassmembers class io.reactivex.internal.util.unsafe.*ArrayQueue*Field* {long producerIndex;long consumerIndex; }
自定义混淆规则:
从最开始的两张图片可以看到混淆后的名字都是a,b,c之类的,但是如果想自定义这么处理,这个也很简单需要在proguard-rules.pro文件当中加入
#指定外部模糊字典 -obfuscationdictionary filename.txt #指定class模糊字典 -classobfuscationdictionary filename.txt #指定package模糊字典 -packageobfuscationdictionary filename.txt
filename.txt文件我放在了demo当中,位置在..app/filename.txt,直接copy下来就可以,
当然如果想要自己控制filename.txt内容请按照以下步骤:
- 下载demo
- 将proguardcreater包拷贝到自己的工程,或者再接在demo当中运行Main类当中的main方法(记得自己更改规则)(ps:可以是中文哈哈哈,玩一玩就好,因为打印出来的日志无法通过mapping去查看)
- 将生成好的文件拷贝到自己的项目当中即可
通过自定义混淆字典生成的apk目录:
可以看到已经变成了我自己定义的规则,由0,o,O组成的包名,当然类名和方法是一样的
混淆四大组件:
有点小基础的都应该知道,一般情况下是不允许混淆四大组件的,会导致程序找不到组件报错,但是这里的混淆四大组件是通过增量混淆来实现的,无意间逛GitHub的时候发现一个大佬写的开源项目,由此记录一下。
GitHub地址:点我 GGG~~
注意事项:
有些类是不能被混淆的,特此记录:
- 使用了自定义View要保证不能被混淆
- 使用了枚举要保证枚举不被混淆
- 对第三方库中的类不进行混淆
- 运用了反射的类也不进行混淆
- 使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
- 在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
- 有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
- Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常
- 使用的四大组件,自定义的Application* 实体类
- JNI中调用的类
- Layout布局使用的View构造函数(自定义控件)、android:onClick等。
Demo地址:
点我 GO~https://gitee.com/li-weihao1010/text-proguard
Android混淆(包括混淆四大组件)相关推荐
- Android基础再回首——四大组件之Activity、Service俩兄弟
Android基础再回首--四大组件之Activity.Service俩兄弟 偶尔的回首过去,总是有不一样的收获.今天就来回顾下Activity和service吧,不用嫌弃太基础了,打好基础是取得成功 ...
- Android开发基础(四大组件及Intent)
一.Android开发的四大组件: 1.Activity:(通常展现一个可视化的用户界面) (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通 ...
- Android 学习之路 四大组件之Activity1(内置人品计算器)
前言: 终于到了四大组件,打掉前面的"小怪",来到安卓的核心boss,开心. 1 创建一个新的Activity 1>如果你想让你的Activity有多个启动图标 需要这 ...
- Android 编程下的四大组件之服务(Service)
服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始.Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类 ...
- Android攻城狮四大组件之Service
组件篇--Service 当Android系统内存不足的时候,会杀死优先级别较低的Activity,而基本上Service的优先级要高于Activity,所以程序中如果含有 Service,那么该程序 ...
- Android 系统开发_四大组件篇 -- Service 解析(用法)
开篇 服务是什么? 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还需要长期进行的任务.服务的运行不依赖于任何用户界面,即使程序被切换 ...
- Android APK开发基础—— 四大组件之Activity
Activity的启动模式 启动模式的设置 方式一:AndroidMenifest中设置: <activity android:name=".TestActivity" Ac ...
- Android面试题:四大组件
1.Activity 与 Fragment 之间常见的几种通信方式 答:1.使用Bundle:在activity中建一个bundle,把要传的值存入bundle,然后通过fragment的setArg ...
- android studio .so混淆配置,Android Studio 下混淆 文件配置 有关问题 初探(一)
Android Studio 下混淆 文件配置 问题 初探(一) 1.参考资料 https://stuff.mit.edu/afs/sipb/project/android/sdk/android-s ...
- 77.Android之代码混淆
转载:http://www.jianshu.com/p/7436a1a32891 简介 作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使 ...
最新文章
- IBM 推出 Bluemix :Swift 将支持服务器端开发
- Oracle 10g中对resumable session的增强
- 屠龙之路_坚持就是胜利_NinthDay
- 垃圾回收机制之标记清除算法
- hive选择mariadb还是mysql_Hive MariaDb的安装
- 20岁,Universal GIS拥抱新生的GIS信创
- 如何通过svg代码还原图片_如何通过nginx反向代理来调试代码?
- gif透明背景动画_ppt模板3D卡通GIF动画PPT素材,多种多样的日常动作
- 25. 自定义Git
- 图像数字水印技术研究及matlab实现,基于MATLAB的数字水印技术研究
- Java静态代理、动态代理
- 魅族自动化测试架构之路
- win10系统迁移后系统重装_Win10技巧:Windows 10系统迁移方法!
- 全国高级项目经理人数知多少?(数据统计截止2013年6月22日)
- UIPATH 浏览器在新标签页中执行操作
- 为什么打印还要另存为_为什么打印时会出现另存为保存文件
- [转]1、蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)
- 放大电路中耦合电容的选择
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅③简单入门安信可TB-02开发开发板轻松接入天猫精灵,语音控制冷暖灯so easy!
- java key锁 实现对某个key(字符串)加同步锁 带详细注释
热门文章
- mysql not exists无效_MySQL MATCH AGAINST无效
- 【第39期】打破“打工人”魔咒,RPA 来狙击!
- Databuscanal对比
- Spring系列之FactoryBean(一)
- 23个带给你灵感的英文字体Logo设计欣赏
- 无胁科技-TVD每日漏洞情报-2022-8-30
- TVD$XTAT在linux下安装使用详解
- 奖项 | 2019亚洲区块链50强榜单中国区名单公布!
- python网络安全应用中心_安全人员常用的python库
- 《乔布斯传》圈点(6)