Android 中的混淆技术
来源:互联网 发布:小米 金属 贵 知乎 编辑:程序博客网 时间:2024/05/24 04:54
从上一篇 【 Android反编译】博文中,我们知道:通过 apktool 和 dex2jar 工具,我们不仅可以反编译资源还可以反编译代码,甚至重新打包签名。因此,如果我们想让我们的 App 里核心不被窃取,我们必须采取一些措施来保护,而混淆技术则是最简单粗暴的方法。
在Android Studio中 混淆APK 是件及其简单的事,只需要修改build.gradle 中的一行配置(minifyEnabled false
改为 true
)即可。
注意:只有正式版(签名)的 APK 才会被混淆
而这个混淆是按照一定的规则来执行的,我们需要了解的是这个规则,然后根据自己的需求来设定这个规则。
默认的规则文件 proguard-android.txt 放在 SDK路径\tools\proguard
下。
proguard-android.txt 规则解释:
# This is a configuration file for ProGuard.# http://proguard.sourceforge.net/index.html#manual/usage.html#不使用大小写混合类名-dontusemixedcaseclassnames#不跳过非public库类-dontskipnonpubliclibraryclasses#打印混淆的详细信息-verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own).#进行优化-dontoptimize#不预校验-dontpreverify# Note that if you want to enable optimization, you cannot just# include optimization flags in your own project configuration file;# instead you will need to point to the# "proguard-android-optimize.txt" file instead of this one from your# project.properties file.#保留注释中的参数-keepattributes *Annotation*#保留这两个public 类-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native#保留类名及native方法名-keepclasseswithmembernames class * { native <methods>;}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans#保留View 中的getXxx()和setXxx()方法,因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作-keepclassmembers public class * extends android.view.View { void set*(***); *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick#保留在Activity的onClick方法,因为它可能在XML参数中使用-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations#不混淆枚举类中的values()和valueOf()方法-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}#不混淆Parcelable实现类中的CREATOR字段,毫无疑问,CREATOR字段是绝对不能改变的,包括大小写都不能变,不然整个Parcelable工作机制都会失败。-keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR;}#不混淆R文件中的所有静态字段-keepclassmembers class **.R$* { public static <fields>;}# The support library contains references to newer platform versions.# Don't warn about those in case this app is linking against an older# platform version. We know about them, and they are safe.#对android.support包下的代码不警告,因为support包中有很多代码都是在高版本中使用的-dontwarn android.support.**# Understand the @Keep support annotation.#保留 android.support.annotation.Keep 类、相关的字段以及方法包括构造方法-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * {*;}-keepclasseswithmembers class * { @android.support.annotation.Keep <methods>;}-keepclasseswithmembers class * { @android.support.annotation.Keep <fields>;}-keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...);}
更多混淆信息请参考:guardsquare
注意:修改 SDK路径\tools\proguard
下 proguard-android.txt 规则对所有项目都有效,如果只想对当前项目有效,可以修改项目下的 proguard-rules.pro 文件
修改规则例子,可参阅郭霖大大的例子,相信收获会很大!
前面是介绍 混淆 APK ,在实际当中,我们还需要对 Jar 包进行混淆。
混淆 Jar 包,我们可以利用 SDK 提供的一个图形化工具:proguardgui ,此工具在 SDK路径\tools\proguard\bin
下。
双击后,即可使用。
但前提是我们自己得先有 Jar 包,我们编写好代码后,AS 可以帮我们把 Java 代码生成字节码 .class 文件。 字节码文件生成 Jar 包,可以使用 Jar 命令:
打开 proguardgui 后,相信大家都会用了!
添加包和依赖时,一定得把相关的所有包和依赖都添加
添加包和依赖时,一定得把相关的所有包和依赖都添加
添加包和依赖时,一定得把相关的所有包和依赖都添加
这是个很考验程序猿的问题!
注:此篇博文为阅读 郭霖大大的博文后的学习笔记。详情请阅读 Android安全攻防战,反编译与混淆技术完全解析(下)
- Android 中的混淆技术
- Android代码混淆技术
- 代码混淆——Android混淆技术
- android中的代码混淆
- Android 中的代码混淆
- Android 中的代码混淆
- Android 中的代码混淆
- android混淆加密技术总结
- Android 代码混淆技术总结
- 读懂 Android 中的代码混淆
- 读懂 Android 中的代码混淆
- Android中的代码混淆详解
- Android Studio中的代码混淆
- Android开发中的代码混淆
- 读懂 Android 中的代码混淆
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- SQL之视图与索引
- 如何使用git简单方便的将本地项目上传到github
- TensorFlow中的Nan值的陷阱
- VMware虚拟机配置Ubuntu桥接方式(Bridged)使虚拟机和宿主机能互相ping通
- 【JAVA】枚举使用详解
- Android 中的混淆技术
- SSH 三大框架整合
- 数据结构实验之图论二:图的深度遍历
- maven环境配好了,执行mvn -v命令,提示mvn不是内部或外部命令
- [2017-11-21] Windows环境下利用批处理命令快速删除大量文件
- HTML常用标签及约束
- 杭电oj1002,简单理解,复杂解法
- 用扎克伯格定律看信息共享
- C++ 修饰符类型