true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') } } } 应用代码中的反射...反射 (Reflection) 会导致 R8 在跟踪代码时无法识别到代码的入口点。...但是,该字段由 Gson 序列化读取,而 Gson 使用反射的方式来执行此操作,因此 R8 无法看到此字段已被读取。...最后,在配置项目时,请确保将 proguard-rules.pro 文件添加到 build.gradle 配置中: android { buildTypes { release {...'proguard-rules.pro' } } } 了解更多 有兴趣更深入了解 R8 压缩器如何运作吗?
随后去EventBus官网寻找答案,果然issues第一页就有相同的问题,作者团队是这么回复的: Check your R8 / ProGuard rules....proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' }...} 那为什么开启了R8压缩就会导致上面的异常呢,是因为EventBus的注解使用了反射。...反射 (Reflection) 会导致 R8 在跟踪代码时无法识别到代码的入口点。...第三方库也可能用到反射,并且由于第三方库实际上是您的应用的一部分,您 (作为应用开发者) 将负责这些库以及您自己的代码中使用的反射。
虽然有些错误会在构建应用时发生,您能及时发现,但是也有些错误您只能在运行时发现,所以请确保您的应用经过彻底的测试。 如何使用 ProGuard?...当一些类和方法会被动态访问到时(如使用反射),在某些情况下,ProGuard 在构建调用图时不能正确的决定他们的「生死」,导致这些代码被错误的移除掉。...当 ProGuard 移除过少的类 所有应用都可以使用 Android 内置的 ProGuard 的一些安全的默认规则,如保留 View 的 getter 和 setter 方法,因为他们通常会被反射来访问...此外,现在花费时间去配置您的应用意味着当实验性的 ProGuard 替代者 R8 就绪时,您已经准备好了。因为 R8 也是用现有的 ProGuard 规则文件来工作的。...除了让您的代码更小巧之外, ProGuard 和 R8 可以选择优化您的代码让它运行得更快,当然这又是另一篇文章的话题了…… ---- ¹ proguard-android.txt 文件之前是在 SDK
'), 'proguard-rules.pro' proguard是什么 Java官网对Proguard的定义 ProGuard is a free Java class file shrinker,...e) { e.printStackTrace(); } MainActivity中反射获取的属性名称依然是BOOK_NAME,而对应的类已经没有了这个属性名,所以会抛出NoSuchFieldException...注意,如果上面的filedName使用字面量或者字符串常量,即使混淆也不会出现NoSuchFieldException异常。...外部程序可能使用组件的字符串类名,如果类名混淆,可能导致出现异常 注解不能混淆 注解在Android平台中使用的越来越多,常用的有ButterKnife和Otto.很多场景下注解被用作在运行时反射确定一些元素的特征....详解Java中的注解 其他不该混淆的 jni调用的java方法 java的native方法 js调用java的方法 第三方库不建议混淆 其他和反射相关的一些情况 stacktrace的恢复 Proguard
1.3 开启压缩、混淆(减少 2.4 MB) 根据 Google 官网解释,当我们使用 Android Gradle 3.4.0 或者更高版本时,默认会启用 R8 编译器进行压缩、混淆以及优化,主要项以及作用如下...四大组件不能混淆; 反射、注解、枚举不能混淆; JS、Native 调用的方法不能混淆; 基础 Bean 类以及序列化实体类不能混淆; 自定义控件不能混淆; 资源文件不能混淆(当然也有骚操作);...shrinkResources true // 开启混淆操作 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt...shrinkResources false minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt...这块步骤如下: 导入 Mapping 文件 将混淆后错误日志拷贝黏贴到 Obfuscated stack trace 中 点击右下角的 ReTrace!
如果日常做Android开发的你不关注Google针对编译优化的话做的努力的话,会对D8和R8这两个名词会比较陌生。...编译更快、时间更短 DEX编译时占用内容更小 .dex文件更小 D8编译的.dex文件拥有相同或者更好的运行性能 如果你的工程已经使用Java 8尽可能开启D8编译,不然可能会出现编译错误。...R8 R8是用来替代Proguard的一个工具,是新一代的代码压缩工具。R8之前采用D8+Proguard的形式构建,R8则将混淆和D8工具进行整合,目的是加速构建时间和减少输出apk的大小。 ?...如果你不想开启R8,可以在gradle.properties里添加如下配置: android.enableR8=false 开启R8的好处 代码缩减: 规避64引用限制 资源缩减: 移除不使用的资源 混淆代码...Proguard Time ?
作者:chrispaul,来自微信客户端团队 背景 在之前的版本,微信Android一直采用Proguard构建Release包,主要原因在于: Proguard优化足够稳定 ApplyMapping也能保证正确性...一些keep规则导致包大小无法达到最优; 随着AGP的升级,将默认采用Google的R8来构建以获取更优的Apk性能; ---- R8的优势 相对于Proguard,R8的优势在于: 能力支持:R8对Kotlin...有更好的支持; 构建耗时:虽然我们有增量Proguard编译,但在全量构建时间R8比Proguard更短,开启优化只需要15min左右,比Proguard缩短至少一半的构建时间; 开启R8优化,使得将应用程序减少了至少...field/*规则,但R8并不理解这一行为,导致图中的NAME的access被优化成了public(如下图),导致业务通过getField反射获取字段出现错误的返回,解决的办法可以通过-allowaccessmodification...那么R8只会keep public类型的activity,非public默认混淆,这与proguard有所区别,解决办法较为简单可直接改为: -keep class * extends android.app.Activity
最后,在注释 4处,我们可以配置混淆文件的位置,其中 proguard-android.txt 为 sdk 默认的混淆配置,它的位置位于 android-sdk/tools/proguard/proguard-android.txt...R8 优化 R8 官方文档(目前已经开源) R8 是 Proguard 压缩与优化部分的替代品,并且它仍然使用与 Proguard 一样的 keep 规则。...例如,R8 本身集成在 ProGuard V6.1.1 版本中,在压缩 apk 的大小方面,与 ProGuard 的 8.5% 相比,使用 R8 apk 尺寸减小了约 10%。...并且,随着 Kotlin 现在成为 Android 的第一语言,R8 进行了 ProGuard 尚未提供的一些 Kotlin 的特定的优化。 从表面上看,ProGuard 和 R8 非常相似。...3、最后,ProGuard 具有独特的能力来优化使用 GSON 库将对象序列化或反序列化为 JSON 的代码。该库严重依赖反射,这很方便,但效率低下。
Android dex分包原理介绍 QQ空间热修复方案基于Android dex分包基础之上,简单概述android dex分包的原理就是:就是把多个dex文件塞入到app的classloader之中,...发布过程中发现BClass有编写错误,那么想要发布一个新的BClass类,那么你就要阻止AClass这个类打上CLASS_ISPREVERIFIED的标志。...所以总结下来,防止这个错误,只需要: 1、动态改变BaseDexClassLoader对象间接引用的dexElements;2、在app打包的时候,阻止相关类去打上CLASS_ISPREVERIFIED...buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt...('proguard-android.txt'), 'proguard-rules.pro' } } applicationVariants.all { variant -> variant.dex.dependsOn
下面我就分别讲讲 ProGuard、d8、R8 和 ReDex 这四种我们可能会用到的代码优化工具。...R8 R8 在 Android Studio 3.1 中引入,它的志向更加高远,它的目标是取代 ProGuard 和 d8。我们可以直接使用 R8 把“.class”文件变成 Dex。...同时,R8 还支持 ProGuard 中混淆、裁剪、优化这三大功能。...由于目前 R8 依然处于实验阶段,网上的介绍资料并不多,你可以参考下面这些资料: ProGuard 和 R8 对比:ProGuard and R8: a comparison of optimizers...ReDex 如果说 R8 是未来想取代的 ProGuard 的工具,那 Facebook 的内部使用的ReDex其实已经做到了。
R8是Android中替换Proguard新一代的混淆工具,同时它整合了class转Dex功能,将混淆和Dex功能集中到了一个工具中,对混淆耗时以及包大小有明显优化。...R8作为一个新工具,鲁棒性不如proguard,在面对手Q这个庞然大物时,出现了一些问题,本文主要分享一下R8在手Q应用遇到的问题,供后面有需要的同学参考。...一 、 背景Android Gradle 插件 3.4.0 或更高版本构建APP时,系统已经默认使用R8作为混淆和Dex的工具,但和公司内部大型APP交流后,目前使用R8的团队还比较少。...二、R8整体流程目前在手Q中使用的R8版本为2.1.75 ,官网的r8版本已经到了3.2.35, 因为AGP版本的限制(目前手Q版本为4.1.3),无法单独升级R8,否则会有错误,因此本文对R8的分析都是基于...R8的整体流程如下图所示:图片1、R8的输入包括Proguard配置、mainDex配置和 App中所有class文件,通过JarClassFileReader$CreateDexClassVisitor
{ debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt...getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } applicationVariants.all...核心代码: package com.devilwwj.hotfixlib; import android.annotation.TargetApi; import android.content.Context...IllegalAccessException { return getField(obj, obj.getClass(), "dexElements"); } /** * 通过反射拿到指定对象...declaredField.setAccessible(true); return declaredField.get(obj); } /** * 通过反射设置属性
| apktool | dex2jar | enjarify | jd-gui | jadx ) 2、 ProGuard 混淆 ProGuard 混淆 : 【Android 安全】DEX 加密 ( Proguard...简介 | Proguard 相关网址 | Proguard 混淆配置 ) 【Android 安全】DEX 加密 ( Proguard 简介 | 默认 ProGuard 分析 ) 【Android 安全...】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 ) 【Android 安全】DEX 加密...( ProGuard 混淆 | -keepclassmembers 混淆效果 | -keepclasseswithmembernames 混淆效果 ) 【Android 安全】DEX 加密 ( Proguard...混淆 | 混淆后的报错信息 | Proguard 混淆映射文件 mapping.txt ) 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 |
我会讨论一些和 when 语句相关的潜在开销,以及 Android R8 编译器是如何优化您的应用并减少这些开销的。 编译器 首先,我们讲一讲 D8 和 R8。...到了这一步,您已经有了能够运行在 Android 中的代码。不过,您也可以选择继续使用第三个编译器 —— R8。 3....R8 (可选,但推荐使用) R8 以前是用来优化和缩减应用体积的,它基本上就是 ProGuard 的一个替代方案。...getDefaultProguardFile( ‘proguard-android-optimize.txt’), ‘proguard-rules.pro...更多信息 更多 R8 相关信息,请查看以下资源: 官方文档 | D8 developer.android.google.cn/studio/comm… 官方文档 | 缩减、混淆、优化您的应用 developer.android.google.cn
注意: 因为lint是本地静态扫描,所以反射、动态引用的class并不会识别出来,也会出现在检测列表里。 3.图片压缩 推荐使用tinypng在线压缩。...release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt...'), 'proguard-rules.pro' } } 慎用R8,因为: R8 会忽略试图修改默认优化行为的所有 ProGuard 规则,例如 -optimizations...可以开启混淆,而不使用R8。...shrinkResources true minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt
解决方案 一、报错信息 ---- 使用场景 : 需要 Hook 住 View 的 OnClickListener 点击方法 , 该监听器在 View 的内部类 ListenerInfo 中 , 需要先通过反射..., 得到 ListenerInfo 字节码对象 ; // 反射获取 OnClickListener 成员 // ① 先根据全类名获取 ListenerInfo 字节码 Class<?...:1816) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop...PID: 31301 SIG: 9 二、解决方案 ---- 在此记录下 , 这种低级错误以后少犯 , 内部类要使用 包名.外部类$内部类 的形式 , 进行表示 ; android.view.View$...ListenerInfo 是 ListenerInfo 的正确表示方式 , 外部类与内部类之间使用 $ 符号 ; 修改后 : // 反射获取 OnClickListener 成员 // ① 先根据全类名获取
将下面的配置复制到你的 proguard-rules.pro 文件中: ##---------------Begin: proguard configuration for Gson --------...Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model...com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer # Prevent R8...configuration for Gson ---------- 注:将上面的 com.google.gson.examples.android.model 换成你自己项目的实体类的包名!!!...Gson 官方混淆地址:https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg
R8使用Proguard keep规则格式为应用程序指定入口点。如您所料,许多应用程序需要额外的Proguard规则来保持工作。R8可能过于激进,并且删除了Java反射所调用的一些东西,等等。...我们还没有一个很好的方法让它成为所有.NET android应用程序的默认设置。 要选择使用R8 for Release版本,请在你的.csproj中添加以下内容: <!...你可能需要添加一个ProguardConfiguration文件到你的项目中,比如: <ProguardConfiguration Include="<em>proguard</em>.cfg...详情请参阅我们的D8/<em>R8</em>文档。...ocid=AID3045631 我们的D8/<em>R8</em>文档: https://github.com/xamarin/xamarin-<em>android</em>/blob/main/Documentation/guides
以下是一些常见的Android混淆工具: ProGuard:这是一个开源的Java类文件混淆器,也是Android官方推荐的混淆工具。...ProGuard已经被整合在Android的官方开发工具集SDK中,因此你无需单独安装。 DexGuard:这是由ProGuard的开发者创建的一个商业混淆工具,专门针对Android应用进行优化。...与ProGuard相比,DexGuard提供了更强大和多样的混淆选项,包括字符串加密、类加密、资源混淆等。 R8:这是Google开发的一个新的混淆工具,目标是取代ProGuard。...R8被设计为比ProGuard更快,同时生成更小的APK文件。从Android Gradle Plugin 3.4.0开始,R8已经成为默认的代码混淆和压缩工具。...ProGuard 使用 ProGuard 来混淆Android应用一般需要以下几个步骤: 启用ProGuard:在Android项目中,找到build.gradle文件,然后在android节中,找到buildTypes
混淆:使用ProGuard来删除未使用的资源文件和类,以减小APK体积。...你的proguard-rules.pro文件可以包括以下规则: -assumenosideeffects class android.util.Log { public static boolean...代码混淆:使用ProGuard或R8进行代码混淆,删除未使用的类和方法,减小APK文件的大小。...getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } 库的选择:只包含应用所需的库和依赖项...APK压缩工具:使用工具如ProGuard、R8或Shrinker来压缩和优化APK文件。 压缩工具:使用APK压缩工具,如APKTool来手动优化APK文件,删除未使用的资源。
领取专属 10元无门槛券
手把手带您无忧上云