文章目录 一、Proguard 默认混淆结果 二、Proguard 保留类及成员混淆结果 三、Proguard 保留注解以及被注解修饰的类/成员/方法 更多 ProGuard 混淆配置参考 : https...://www.guardsquare.com/en/products/proguard/manual/usage 一、Proguard 默认混淆结果 ---- ProGuard 的默认混淆结果 , 就是没有..., 其余 Java 文件都被混淆 ; 二、Proguard 保留类及成员混淆结果 ---- 在 应用 Module 下的 proguard-rules.pro 中进行如下配置 : # 保留 MainActivity...; public @interface Keep { } ProGuard 中配置 保留该注解 , 以及 被该注解修饰的类 ; # 保留 Main 类及成员 -keep public class kim.hsl.handler.Main...} 编译混淆结果 : Handler 的类 和 成员没有被混淆 ; 因此可以使用注解形式 , 灵活配置某个类 / 方法 / 成员 不被混淆 ;
为什么要混淆 我们的apk在打包发布之前,都要进行混淆处理来避免源代码和资源文件被小白用户通过反编译拿到。...我们来看一下Proguard的几个步骤如何处理Entry Points。 在压缩阶段,Proguard从上述Entry Points开始遍历搜索哪些类和类成员被使用。...Android Studio 默认的混淆方案及字段解读 开启混淆 参见google官方文档压缩代码和资源 要通过Proguard启动代码压缩,在build.gradle文件内相应的构建类型中添加minifyEnabled...>] 例如mac平台下: retrace.sh -verbose mapping.txt obfuscated_trace.txt 默认的混淆方案及字段解读 下面结合默认混淆文件中的内容来解释混淆的参数....** 本包和所包含子包下的类名都保持 -keep class com.lily.test.* 保持该包下的类名 -keep class com.lily.test.** {*;} 保持包和子包的类名和里面的内容均不被混淆
在混淆的步骤中,ProGuard会对非EntryPoint的类和方法进行重命名。 Proguard使用 Proguard工具目录结构 ?...Proguard四项核心功能shrink,optimize,obfuscate和preverify的执行都是由proguard.jar来完成的,不过proguard.jar只能通过命令行方式来使用。...proguardgui.jar是Proguard提供的一个图形界面工具,通过proguardgui.jar可以方便的查看和编辑Proguard配置,以及调用proguard.jar来执行一次优化过程。...混淆之后的jar文件执行过程如果出现异常,生成的异常信息将很难被解读,方法调用的堆栈都是一些混淆之后的名字,通过retrace.jar可以将异常的堆栈信息中的方法名还原成混淆前的名字,方便程序解决bug...(windows大小写不敏感) -dontusemixedcaseclassnames # 指定不去忽略非公共的库的类 # 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用
只要是我们亲身经历过 App 打包上线的过程,或多或少都需要了解一些代码混淆的基本操作。那么,混淆到底是什么?它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的"独特"魅力?。...从上面两张图可以看出:经过混淆处理之后,我们的 APK 中包名、类名、成员名等都被替换为随机、无意义的名称,增加了代码阅读和理解的困难程度,提高了反编译的成本。...} } } 以上就是开启混淆的基本操作了,通过 minifyEnabled 设置为 true 来开启混淆。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...:1107) 1.通过 retrace 脚本工具 首先我们要进入到 Android SDK 路径的 /tools/proguard/bin 目录中,这里以 Mac 系统为例,可以看到如下内容: ?
它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的"独特"魅力。 混淆简介 代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。...从上面两张图可以看出:经过混淆处理之后,我们的 APK 中包名、类名、成员名等都被替换为随机、无意义的名称,增加了代码阅读和理解的困难程度,提高了反编译的成本。...} } } 以上就是开启混淆的基本操作了,通过 minifyEnabled 设置为 true 来开启混淆。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...:1107) 通过 retrace 脚本工具 首先我们要进入到 Android SDK 路径的 /tools/proguard/bin 目录中,这里以 Mac 系统为例,可以看到如下内容: ?
大家好,又见面了,我是你们的朋友全栈君。 大家应该都听过代码混淆吧,如果大家有去反编译过别人的APK的话,应 该会看到好多包名和类名是a,b.c….之类的的吧,这里就提到了一个概念: 混淆。...三, 是我们的java 元素名称是在配置文件中配置好的。 所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。...} 使用给定文件中的关键字作为要混淆方法的名称 -overloadaggressively 混淆时应用侵入式重载 -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆...-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中 -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中...”这行前的“#”删除,最后导出即可 实现对代码的混淆,即使我们没有去编写proguard-project.txt中的内容。
ProGuard 除了可以大幅减少代码的空间之外,还可以让所有的标识符(包、类和成员)都使用更短的名字,如 a.A 和 a.a.B。这个过程就是混淆。...混淆通过两种方式来减少代码:让表示名称的字符串更短;在这些方法或者属性有相同的签名情况,下这些字符串更容易被复用,最终减少了字符串池的数目。 使用 ProGuard 是开启资源压缩的前提条件....因为我们知道这些注解类在运行时不会被使用,我们可以通过在 ProGuard 配置中添加 -dontwarn 规则来安全地忽略掉这些警告,如 在 OkHttp 文档中加入这些规则: -dontwarn...“ 按钮), 您可以在 DEX 视图树中看到一些额外功能: 所有的名字都是混淆前的(即您可以看到原始的名字) 被 ProGuard 配置规则 kept 的包,类,方法和属性会显示成粗体 您可以开启 “...关于 ProGuard 和 第三方库 就像您有责任为您自己的代码提供 keep 规则一样,那些第三方库的作者们也有义务向您提供必要的混淆规则配置来避免开启 Proguard 导致的构建失败或者应用崩溃。
它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的"独特"魅力。 ##1混淆简介 代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。...] 从上面两张图可以看出:经过混淆处理之后,我们的 APK 中包名、类名、成员名等都被替换为随机、无意义的名称,增加了代码阅读和理解的困难程度,提高了反编译的成本。...} } } 以上就是开启混淆的基本操作了,通过 minifyEnabled 设置为 true 来开启混淆。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...被反射的元素 被反射使用的类、变量、方法、包名等不应该被混淆处理。
只要一个类中有存在native方法,它的类名就不会被混淆,native方法的方法名也不会被混淆,因为C++代码要通过包名+类名+方法名来进行交互。 但是类中的别的代码还是会被混淆的。...-keepclassmembers class **.R$* { public static ; } 表示不混淆R文件中的所有静态字段,我们都知道R文件是通过字段来记录每个资源的...proguard中一共有三组六个keep关键字,很多人搞不清楚它们的区别,这里我们通过一个表格来直观地看下: 关键字 描述 keep 保留类和类中的成员,防止它们被混淆或移除。...回到Android Studio项目当中,刚才打出的APK虽然已经成功混淆了,但是混淆的规则都是按照proguard-android.txt中默认的规则来的,当然我们也可以修改proguard-android.txt...,一种是通过本地jar包引入的,一种是通过remote引入的,其实这两种方式没什么区别,要保留代码都可以使用**这种通配符来实现,如下所示: -keep class org.litepal.** {
原理 android平台的混淆原理是把代码中原来有具体含义的包名,类名,变量名,方法名等名称全部替换成按顺序排列的无意义的英文字母a、b、c….这样代码结构没有变化,还可以运行得到一样的结果,并且就算代码被反编译出来...编写混淆脚本 找到Android项目目录下的“proguard-project.txt”文件,在proguard-project.txt文件中,你需要做的就是指定混淆规则,还有指明要过滤那些文件或代码块...2.保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等。(详细信息请参考\examples中的例子及注释) 3.需要序列化和反序列化的类不能被混淆。...二、通过ProGuard工具混淆代码 如果你想把你的Android项目打包成jar文件然后再混淆,那这种方法比较适合 下载运行ProGuard工具 1.首先到http://proguard.sourceforge.net...jar包 笔者是通过eclipse来到处Android项目jar包的,用Android Studio来做也差不多,这就不过多介绍了。
proguard 问题和风险 代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题 1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。...本地方法,不能修改本地方法名 annotations 注释 数据库驱动 有些resource 文件 用到反射的地方 如何实施 现在的系统已经配置为混淆时候会保留 Android系统组件... 确定统一的混淆类的成员名称来增加混淆 -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中 -repackageclass...{package_name} 重新包装所有重命名的类文件中放在给定的单一包中 -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名 -keepattributes...打包出来的程序如何调试 一旦打包出来,就不能用eclipse的logcat去看了,这里可以用android sdk中ddms.bat的tool来看,一用就发现和logcat其实还是一个东西,就是多了个设备的选择
系统资源的build/tools/zipalign目录,它的主要工作是将apk包进行对齐处理,使apk包中的所有资源文件举例文件起始偏移为4字节的整数倍,这样通过内存映射访问apk时的速度会更快,验证apk...Eclipse中如何开启混淆 在Eclipse中,文件根目录有如下两个文件 projiect.properties 和 proguard-project.txt。...proguardgui.jar:是Proguard提供的一个图形界面工具,通过proguardgui.jar可以方便的查看和编辑Proguard配置,以及调用proguard.jar来执行一次优化过程。...针对第三方jar包的解决方案 我们在Android项目中不可避免要使用很多第三方提供的SDK,一般而言,这些SDK是经过ProGuard混淆的,而我们所需要做的就是避免这些SDK的类和方法在我们APP...(六)、ProGuard的混淆的注意事项 在使用ProGuard过程中,还有一些注意事项如下: 1、如何确保混淆不会对项目产生影响 测试工作要基于混淆进行,才能尽早发现问题,开发团队的冒烟测试,也是要基于混淆包
build.gradle文件中设置minifyEnabled为true,然后可以到proguard-rules.pro文件中加入我们的混淆规则即可。...大家看到了,有两个混淆文件,proguard-android.txt和proguard-rules.pro,proguard-rules.pro是我们需要自己编写的混淆文件,proguard-android.txt...刚才是开启混淆,那我们如何关闭,比如关闭压缩,关闭优化呢? ?...除了proguard之外,还有一个DexGuard,是专门用来优化混淆Android应用的。它包括资源混淆,字符串加密,类加密和dex文件分割等。...二:接下来我们来说一说混淆的基本规则: ? 但如果你用两颗星,会发现,虽然类名被保持了,但里面的变量名啥的都变了,那如果我们既要本包保持类名和内容又要子包保存呢?
中 开启 Proguard , 在编译时 , 会自动进行如下一系列优化 : 压缩 Shrink : 检查 并 删除 没有使用的类 , 字段 , 方法 , 属性 ; 这里要注意 , 如果通过反射使用一个类时...层代码 , 使用无意义的标识符替代 Java 中的类名 , 变量名 , 方法名 等名称 ; 预检 Preveirfy : 预检 Java 平台上预处理的代码 ; 开启 ProGuard 配置...’ 中 , 配置了两个文件, 其中 proguard-android-optimize.txt 是默认的混淆配置文件 , 由系统自动生成 ; proguard-rules.pro 是用户自己配置的混淆配置文件...; 遇到某个包或类编译遇到警告退出 , -dontwarn 配置该包不要爆出警告 ; 遇到没有找到的类 , 使用 -keep 不要混淆该类 ; 常用的混淆配置 : " -dontwarn " : 不要报出警告信息..., 如果出现警告 , 编译打包会被终止 ; # com 包名下不要爆出警告 -dontwarn com.** " -keep " : 不要混淆的类 ; # com 包名下的类不要混淆 -keep class
Proguard 的作用 在 Android SDK 里面集成了一个工具 — Proguard,它是一个免费的 Java 类文件 压缩、优化、混淆、预先校验 的工具。...此外,我们也可以在配置混淆文件将 android.util.Log 置为无效代码,以去除 apk 中打印日志的代码。而 proguard-rules.pro 是该模块下的混淆配置。...APK中所有类文件的内部结构 mapping.txt 提供原始与混淆过的类、方法和字段名称之间的转换,可以通过proguard.obfuscate.MappingReader来解析 seeds.txt...而 ProGuard 的优化功能可以 通过更高效,直接的访问方式 来代替它。...关于如何去除 Dex 中的 Debug 信息是通过 ReDex 的 StripDebugInfoPass 来完成的,其配置如下所示: { "redex" : { "passes"
引言 在移动应用程序开发中,保护应用程序的代码和数据安全至关重要。本文将探讨如何对Flutter应用程序进行混淆、优化和保护,以提高应用程序的安全性和隐私。...一、混淆原理 混淆是一种代码保护技术,通过修改源代码或编译后的代码,使其难以阅读和理解。混淆的主要目的是提高反编译和逆向工程的难度。通常,混淆可以通过以下方法实现: 重命名变量、函数和类名。...这些文件可用于还原混淆后的堆栈跟踪。 2.2、混淆Android原生代码 要对Android原生代码进行混淆,请在android/app/build.gradle文件中启用ProGuard或R8。...('proguard-android-optimize.txt'), 'proguard-rules.pro' } } 此外,确保在proguard-rules.pro文件中添加必要的混淆规则,例如保留与...保留JSON对应的Java Bean对象:在proguard-rules.pro文件中保留与JSON相关的Java Bean对象,使用-keep指令来保留这些类。
(混淆)没有考虑模块在运行时如何加载在一起。...为从代码中使用了跨模块的类添加保留规则 我们需要从功能 APKs 中找出使用基本模块中的哪些类。你可以通过检查来源手动追踪,但对于大型项目这种方法是不可行的。...因此我们可以先通过 SDK 中的 android.jar 获取框架类的列表来进行过滤: $ jar tf ~/Android/Sdk/platforms/android-27/android.jar |...要解决这个问题,首先要启用 ProGuard(混淆)来开发即时应用程序(例如使用刚刚在前面步骤中设置的构建方式)。...请记住通过运行应用程序并检查所有可能的情况来彻底进行测试,因为某些错误只能在运行时发生。 ---- 希望本指南能够让你更好地理解为什么 ProGuard(混淆)可以使你的即时应用程序崩溃。
说在前面 这里我们直接用Android Studio来说明如何进行混淆,Android Studio自身集成Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单,只需要在工程应用目录的...然后我们就可以到proguard-rules.pro文件中加入我们的混淆规则了。 android { .......* 一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;两颗星表示把本包和所含子包下的类名都保持;用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,这时如果既想保持类名...如下例子就避免所有继承Activity的类被混淆 -keep public class * extends android.app.Activity 如果我们要保留一个类中的内部类不被混淆则需要用$符号...zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。
如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,这就需要我们手动编写混淆规则来保持不能被混淆的部分。 2....Proguard作用 Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系...*; } 4.2 不混淆某个包所有的类 -keep class com.android.proguard.example.** { *; } 4.3 不混淆某个类的子类 -keep public...class * extends com.android.proguard.example.Test { *; } 4.4 不混淆所有类名中包含了“model”的类及其成员 -keep public...隔开) tools:shrinkMode 开启严格模式 当代码中通过 Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。
WebView中JavaScript调用的方法 Layout布局使用的View构造函数、android:onClick等。 检查混淆结果 混淆过的包必须进行检查,避免因混淆引入的bug。...(很多老的混淆文件里会加,现在已经没必要) proguard-android.txt已经存在一些默认混淆规则,没必要在 proguard-rules.pro 重复添加 混淆简介 Android中的“混淆...”可以分为两部分,一部分是Java 代码的优化与混淆,依靠 proguard混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系,但一般我们都会放一起用...开启严格模式 当代码中通过Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。...当代码中通过 Resources.getIdentifier() 用动态的字符串来获取并使用资源时,普通的资源引用检查就可能会有问题。
领取专属 10元无门槛券
手把手带您无忧上云