现在我们明白了为什么 ProGuard(混淆)会失败了,是时候解决这个问题了:确保我们为项目配置添加必要的保留规则,以防止在不同模块(在一个模块中定义,在另一个中使用)之间的类被移除或混淆。...为从代码中使用了跨模块的类添加保留规则 我们需要从功能 APKs 中找出使用基本模块中的哪些类。你可以通过检查来源手动追踪,但对于大型项目这种方法是不可行的。...使用一点 shell 魔法(我在后面的所有命令都是基于 Linux 系统的 bash命令),我们可以得到 ProGuard(混淆)规则中需要保留的类的列表: $ apkanalyzer dex packages...请记住通过运行应用程序并检查所有可能的情况来彻底进行测试,因为某些错误只能在运行时发生。 ---- 希望本指南能够让你更好地理解为什么 ProGuard(混淆)可以使你的即时应用程序崩溃。...遵循这些步骤应该能带你完成构建,并防止你的即时应用程序崩溃。
使用本地调试keystore时有几个问题: 到期日365天 从多台计算机安装应用程序需要先卸载 google服务需要密钥库SHA-1指纹 这就是为什么我通常生成调试密钥库并提交到版本控制系统。 ?...这就是为什么最好对发布和调试版本使用不同的proguard规则: rules-proguard.pro rules-proguard-debug.pro ?...用于调试构建的Proguard规则必须具有以下行以强制proguard忽略警告,跳过代码混淆和优化: ? 对于发布版本,设置proguard规则将会更加困难,因为几乎每个库都有自己的特定规则。...幸运的是,有一个开源代码库 — android-proguard-snippets,它包含所有主要库的proguard规则。 ?...strict mode Android StrictMode可帮助您检测不同类型的问题: 可关闭对象没关闭 在主线程中读写文件或者访问网络 uri 暴露 … 每当检测到这样的问题,它可以显示适当的日志或应用程序崩溃
引言 混淆是一种通过修改程序的源代码或二进制代码,在保障程序的功能不变的基础上,使得代码难以阅读和理解的技术。在Java中,混淆通常用于防止对源代码的逆向工程,从而保护知识产权和商业秘密。...因为混淆后的代码仍然需要能够被Java虚拟机(JVM)正确地执行。在本章中我将以Minecraft、安卓开发作为经典的混淆案例来介绍它。...这些规则是在proguard-rules.pro文件中定义的,这个文件通常位于应用模块的根目录中。在这个文件中,可以添加一些保留规则,告诉ProGuard不要混淆某些类、方法或者变量。...配置ProGuard规则可能会比较复杂,因为你需要找到一个平衡,使得你的代码得到足够的保护,同时不破坏你的应用的功能。如果你的应用在混淆后崩溃或者出现问题,你可能需要调整你的ProGuard规则。...窃取商业秘密:如果反混淆被用于窃取商业应用的源代码,以获取其背后的商业逻辑、算法或其他敏感信息,这将是一种违法行为。
1 混淆简介 代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...首先,我们来了解一下常见的混淆命令。 3.1 -keep 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。.../tools/proguard/bin 目录中,这里以 Mac 系统为例,可以看到如下内容: ?...选择 ReTrace 栏 ,并添加我们项目中混淆生成的 mapping.txt 文件所在位置,然后将我们的混淆后的崩溃信息复制到 Obfuscated stack trace 那一栏,点击 ReTrace
它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的"独特"魅力。 混淆简介 代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...首先,我们来了解一下常见的混淆命令。 keep 命令 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。.../tools/proguard/bin 目录中,这里以 Mac 系统为例,可以看到如下内容: ?...选择 ReTrace 栏 ,并添加我们项目中混淆生成的 mapping.txt 文件所在位置,然后将我们的混淆后的崩溃信息复制到 Obfuscated stack trace 那一栏,点击 ReTrace
它的好处有哪些?具体效果如何?别急,下面我们来一一探索它的"独特"魅力。 ##1混淆简介 代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。...以上代码中的 proguard-android.txt 表示 Android 系统为我们提供的默认混淆规则文件,而 proguard-rules.pro 则是我们想要自定义的混淆规则,至于如何自定义混淆规则我们将在接下来会讲到...首先,我们来了解一下常见的混淆命令。 keep 命令 这里说的 keep 命令指的是一系列以 -keep 开头的命令,它主要用来保留 Java 中不需要进行混淆的元素。...Windows 系统中只需要双击脚本 proguardgui.bat 即可运行,至于 Mac 系统,如果你没有做任何配置,只需要将 proguardgui.sh 脚本拖动到 Mac 自带的终端中,回车键即可运行...mapping.txt 文件所在位置,然后将我们的混淆后的崩溃信息复制到 Obfuscated stack trace 那一栏,点击 ReTrace!
我认为是的! 但是在您激动的跳起来之前,请先继续阅读下去。当您开启 ProGuard 时,在某些非常微妙的情况下会让您的应用崩溃。...keep 住),keep 住指定的一些成员 **keepclasseswithmembers **— 当且仅当所有的成员在匹配的类中存在时,会 keep 住 这些类和它的成员 我建议您从 ProGuard...ProGuard 和 混淆后的堆栈 我之前提及到,在构建过程中 ProGuard 会在处理类文件时输出映射关系和日志文件。当您需要保留构建产物时,您应当保存好这些文件和 APK 在一起。...关于 ProGuard 和 第三方库 就像您有责任为您自己的代码提供 keep 规则一样,那些第三方库的作者们也有义务向您提供必要的混淆规则配置来避免开启 Proguard 导致的构建失败或者应用崩溃。...有些项目简单地在他们的文档或者 README 上提及了必要的混淆规则,所以您需要复制粘贴这些规则到您的主 ProGuard 配置文件中。
ProGuard简介 ProGuard是2002年由比利时程序员Eric Lafortune发布的一款优秀的开源代码优化、混淆工具,适用于Java和Android应用,目标是让程序更小,运行更快,在Java...Retrace 经过ProGuard处理后的字节码运行的堆栈已经跟没有处理之前的不一样了,除了出现名称上的变化还伴随着逻辑上的变化,程序崩溃后,开发者需要借助Retrace将错误堆栈恢复为没有经过ProGuard...为了解决这个问题,我们决定探究一下ProGuard源码来看下为什么会出现这个问题,如何修复这个问题? 从源码中寻找答案 先看一下ProGuard怎么表示一个方法: ?...(以在Class中的顺序为准)覆盖,可能会导致错误映射覆盖正确映射。...而前者method_name可能找不到,需要在rule中keep反射的方法。
常用的安卓代码混淆器包括安卓SDK自带的Proguard(第11.1节对Proguard工具进行了详细地介绍)、网易易盾、360加固保等。代码混淆可以基于Java语言,但是更安全的是基于C语言。...,具有自己的语法规则。...黑客根据smail的语法规则,把恶意代码注入在smail文件中,然后通过类似Smali2Java的工具把smail文件转换成Java文件。然后再进行正向编译形成.apk文件。...混淆对二次编译是没有作用的,防止二次编译的有效措施是使用加固软件对代码进行加固处理。 苹果也同样存在反编译、二次编译的漏洞,同样需要代码混淆和加固。...现在发现一些不法分子用一个打开NFC功能的安卓手机在公交站、公交车,地铁等人口比较密集地区,在人员裤子口袋处乱碰以获取被害人的银行卡信息。
,除此之外,需要每个项目根据自身的需求添加一些混淆规则: 第三方库所需的混淆规则。...(很多老的混淆文件里会加,现在已经没必要) proguard-android.txt已经存在一些默认混淆规则,没必要在 proguard-rules.pro 重复添加 混淆简介 Android中的“混淆...-> main -> 渠道 -> 构建类型 假如重复资源同时存在于main文件夹和不同渠道中,gradle 会选择保留渠道中的资源。...' 这行代码定义了混淆规则由两部分构成:位于 SDK 的 tools/proguard/ 文件夹中的 proguard-android.txt 的内容以及默认放置于模块根目录的 proguard-rules.pro...需要特别介绍的是与保持相关元素不参与混淆的规则相关的几种命令: 命令 作用 -keep 防止类和成员被移除或者被重命名 -keepnames 防止类和成员被重命名 -keepclassmembers
混淆代码能有效防止被反编译,防止自己的劳动成果被别人窃取; 混淆配置文件及开关的设置 配置文件的位置以及开关的设置位置,android studio 和eclipse稍微有些差异,这里以android...解读一个混淆配置 proguard的语法规则可参考参考链接ProGuard在线说明手册 下面是我对一个配置加上了注释,详细看过了之后,便可以打造自己的简单配置了。...如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。...3. seeds.txt 列出了没有被混淆的类和成员。 4. usage.txt 列出了源代码中被删除在apk中不存在的代码。...,则-optimizations optimization_filter才有效 参考链接 ProGuard在线说明手册 位于sdk中的目录: sdk/tools/proguard Android 混淆代码总结
首先说一点我比较坚持的观点“我们写的代码是给人看的,不是给机器看的”。通常,我们写代码的时候,代码都需要有一定的规范,而且变量名、函数名一般要能让人看到就知道是什么功能。...eclipse android工程开启混淆功能,我们需要手动在项目文件.properties(我的是project.properties文件)中添加下面的代码To enable ProGuard to...对于eclipse工程来说,代码混淆的规则,在 proguard-project.txt 文件中,我们需要根据规则去选择哪些代码需要混淆,哪些代码(一般我们引用的第三发jar包,如果已经被混淆过,就不能再混淆...一般我们对外开放的借口不需要混淆哦)不需要混淆。编写proguard-project.txt文件的规则,后面介绍咯。...虽然文件名和eclipse中的不同,但是配置规则都是相同的。自己动手配置代码混淆应该不是问题。
c类中只有一个a方法,从字符串的内容我们可以看出,这个是Utils类中的methodNormal()方法。 我为什么要创建这样的一个项目呢?...keepclasseswithmembers 保留类和类中的成员,防止它们被混淆或移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。...keepclasseswithmembernames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。...回到Android Studio项目当中,刚才打出的APK虽然已经成功混淆了,但是混淆的规则都是按照proguard-android.txt中默认的规则来的,当然我们也可以修改proguard-android.txt...中的规则,但是直接在proguard-android.txt中修改会对我们本机上所有项目的混淆规则都生效,那么有没有什么办法只针对当前项目的混淆规则做修改呢?
我们再看看图二显示的异常堆栈内容,可以发现栈中的某一调用帧(Frame),一个类名下会存在多个方法名,而且第一个方法尾部的源文件及行号是(Unknown Source),根本看不出源文件和行号。 ?...但被Proguard还原过的堆栈,应该有“方法返回类型”及“方法参数”。 那么这里有两个问题: 为什么堆栈会是Unknown Source?是Bugly崩溃克星没有上报吗?...那是因为,你代码编译的姿势不对! 有经验的童鞋应该会发现,开发阶段上报Bugly的Crash崩溃堆栈都是有源码及行号的,但发布后就变成了Unknown Source,为什么?...如图3所示,我们发布时源码信息会先经过javac编译,再经过proguard混淆,才被打包进发布的apk中,最终Crash崩溃后Bugly获取到的堆栈中有木有源码及行号就要看这两步了。 ?...所以想让Crash崩溃堆栈不再Unknown Source,需要两个保证: 保证一:javac编译保留源文件名及行号 【TODO】javac编译保留源文件名及行号 源文件名、行号、变量名称,都存在class
它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。...要添加更多各构建变体专用的 ProGuard 规则,请在相应的productFlavor代码块中再添加一个proguardFiles属性。...proguard中一共有三组六个keep关键字的含义 keep 保留类和类中的成员,防止它们被混淆或移除。 keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。...keepclasseswithmembers 保留类和类中的成员,防止它们被混淆或移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。...keepclasseswithmembernames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
为什么要混淆 我们的apk在打包发布之前,都要进行混淆处理来避免源代码和资源文件被小白用户通过反编译拿到。...ProGuard由shrink、optimize、obfuscate和preverify四个步骤组成,每个步骤都是可选的,需要哪些步骤都可以在脚本中配置。 参见ProGuard官方介绍。...它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。...csh代码方便,我们需要在proguard_rules.pro中手动添加抛出异常时保留代码行号,并且重命名抛出异常时的文件名称,这样能方便定位问题: 抛出异常时保留代码行号 -keepattributes...这个指令的含义是Proguard会在optimization过程中删除对这些方法的调用,需要注意:Only use this option if you know what you’re doing!
比如说,源代码中与库文件用同一个包名,那么源代码就可以访问包作用域的变量。在这些情况下,为了引用一致,不被混淆,就需要指定不跳过这些类。...,很容易就会导致代码崩溃。...-mergeinterfacesaggressively 指定一些接口可能被合并,即使一些子类没有同时实现两个接口的方法。这种情况在java源码中是不允许存在的,但是在java字节码中是允许存在的。...元素名已经存在在mapping文件中的元素,按照映射表重命名;没有存在到mapping文件的元素,重新赋一个新的名字。mapping文件可能引用到输入文件中的类和类库中的类。...但是它们背后是有一定规则的,下面的表格展示了它们的联系与不同 保留 防止被移除或者被重命名 防止被重命名 类和类成员 -keep -keepnames 仅类成员 -keepmembers -keepmembernames
'), 'proguard-rules.pro' // 默认的 ProGuard 文件和自定义的规则文件 } } 在项目根目录中创建一个 proguard-rules.pro 文件... # 自定义混淆规则 在 proguard-rules.pro 文件中添加自定义的混淆规则。...防反编译,dex加固实战代码分析 防止反编译是 iOSAPP 加固中的一项重要工作,而 dex 文件加固则是防御反编译的一种实现方式。...编辑 需要注意的是,这种加固方式不能完全杜绝反编译,但是可以大大增加反编译难度,让黑客无法轻易地获取 APK 中的代码。此外,增加代码混淆也是防止反编译和保护源代码的一种重要手段。...加固过程中需要了解操作系统、DEX 文件格式、Java 编译原理、反编译方式等知识,同时需要掌握各种加固工具的使用方法,比如 ProGuard、DEXProtector 等。
来模拟程序运行中尽可能出现的情况来优化和简化代码. 为了数据流分析的需要Optimize会多次遍历所有字节码ProGuard会开启多线程来加快速度。...找到“APK 签名分块”中的第一个“APK 签名方案 v2 分块”。如果 v2 分块存在,则继续执行第 3 步。否则,回退至使用 v1 方案验证 APK。...验证 digests 和 signatures 中的签名算法 ID 列表(有序列表)是否相同。(这是为了防止删除/添加签名。) 使用签名算法所用的同一种摘要算法计算 APK 内容的摘要。...设备上安装大型(2GB 以上)APK 可能需要很长的时间,ADB(Android 调试桥)增量 APK 安装可以安装足够的 APK 以启动应用,同时在后台流式传输剩余数据,从而加快 APK 安装速度。...首先我们先做一个回顾,在关于JVM,你必须知道的那些玩意儿[9] 中我曾经提到过关于JVM内的三种垃圾回收算法,复制收集、标记清理、标记整理三种算法,但对于JVM而言是有将堆区通过自己的规则整体成一个生命周期
领取专属 10元无门槛券
手把手带您无忧上云