QFix 是手Q团队近期推出的一种新的 Android 热补丁方案,在不影响 app 运行时性能(无需插桩去 preverify)的前提下有效地规避了 dalvik 下”unexpected DEX”的异常...性能无法提升,需要改变 插桩的解决方案会影响到运行时性能的原因在于:app 内的所有类都预埋引用一个独立 dex 的空类,导致安装 dexopt 阶段的 preverify 失败,运行时将再次 verify...可以看出,Qzone 的插桩方案是突破了条件2的限制(统一去掉了所有引用类的 preverify 标志),而微信 Tinker 的 dex 增量合成方案是突破了条件3的限制(将补丁和 app dex 合成后替换...preverify 的,这种情况条件2本来就是不满足的,就没有必要预先引用了,所以可以推断出只需要针对补丁类在原先 app 所对应的 dex 进行预先引用即可。...可以看出,新的方案是很轻量级的实现,只需一个很简单的 jni 方法调用就能解决问题,既不用构建时预先插桩去 preverify,也不用下载补丁后进行 dex 的全量合成。
这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify...是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some...# 不做预检验,preverify是proguard的四个步骤之一 # Android不需要preverify,去掉这一步可以加快混淆速度-dontpreverify# If you want to
Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some #
Proguard按如下流程进行打包: Input jars、Library jars-shrink->Shrunk code-optimize->Optim.code-obfuscate->Obfusc.code-preverify...Proguard四项核心功能shrink,optimize,obfuscate和preverify的执行都是由proguard.jar来完成的,不过proguard.jar只能通过命令行方式来使用。...-dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # 不做预检验,preverify...是proguard的四个步骤之一 # Android不需要preverify,去掉这一步可以加快混淆速度 -dontpreverify # 有了verbose这句话,混淆后就会生成映射文件 # 包含有类名
ProGuard由shrink、optimize、obfuscate和preverify四个步骤组成,每个步骤都是可选的,需要哪些步骤都可以在脚本中配置。 参见ProGuard官方介绍。...-dontoptimize -dontpreverify 默认optimize和preverify选项是关闭的,因为Android的dex并不像Java虚拟机需要optimize(优化)和previrify...混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 不做预校验,preverify...是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
它主要的面临问题有两个: 为了解决 unexpected DEX problem 异常,而采用插桩的方式给所有类插入不会真正运行的代码,防止类打上 preverify 标志。 ?...采用插桩导致所有类都非 preverify,导致上图中的 verify 与 optimize 操作会在加载类时触发。...事实上,有些人实现 hook preverify 标志来避免插桩。但是看过底层代码,就知道是不可行的。...我们要知道系统检查那个标志位的真正原因,即使 hook 了 preverify 标志,在真正运行过程中,由于 quck 指令以及 vtable 的优化,依然运行时会出问题。
这句话能够使我们的项目混淆后产生映射文件 # 包含有类名- 混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify...是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
Dex does not like code run # through the ProGuard optimize and preverify steps (and performs some # of
(三)、ProGuard工作原理 ProGuard 由shrink、optimize、obfuscate和preverify四个步骤组成,每个步骤都是可选的,需要那些步骤都可以在脚本中配置。...Input jars、Library jars——>shrink ——>Shrunk code——>optimize ——>Optim.code——>obfuscate——>Obfusc.code ——>preverify...proguard.jar:Progurad的四项核心功能shrink.optimize,obfuscate和preverify的执行都是由progurad.jar来完成,不过proguard.jar只能通过领命行方式来使用...dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify...是proguard的4个步骤之一 # Android不需要preverify,去掉这一步可加快混淆速度 -dontpreverify # 有了verbose这句话,混淆后就会生成映射文件 # 包含有类名
Proguard 不要跳过对非公开类的处理,默认是跳过 -dontskipnonpubliclibraryclasses #如果应用程序引入的有jar包,并且混淆jar包里面的class #不做预校验,preverify...是proguard的4个功能之一 #android不需要preverify,去掉这一步加快混淆速度 -dontpreverify -verbose #混淆时记录日志(混淆后生产映射文件 map 类名 -
也就是说A类是在dex.loader配置中的,补丁后,A依然在oldDex1中,而A的直接引用类B却出现在了newDex1中,并且在之前A类已经被打上了preverify标志,所在A再去newDex1中加载...校验preverify的方法,正常的类加载会走到这里。
阶段标记的类)的时候虚拟机会检查Verfiy标记的结果进行反向做verfiy的校验 当校验的时候同时满足上面三个条件的话就不通过抛出unexceptDex异常,只有校验通过才会吧类加载上来 QZone插桩组织preverify...方案 这个方案肯定不满足第三个条件,所以只能从第一个或第二个条件下手 QZone从第二个条件入手通过插妆阻止preverify 解决思路:当上面那些特殊方法(构造函数,静态函数...)调用的是同一个dex...侧主动调用虚拟机解析class的方法(设置formUnverifedConstant参数为true代表这次的调用是以constantof或者是以instanceof的方式调用进来,这个为true就不会做preverify
preverify: 预校验代码是否符合Java1.6或者更高的规范. 除了proguard之外,还有一个DexGuard,是专门用来优化混淆Android应用的。
混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 不做预校验,preverify...是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。
configuration.obfuscate = false; configuration.optimize = false; configuration.preverify
我们将整体分为4个部分: shrink —— 代码删减 optimize —— 指令优化 obfuscate —— 代码混淆 preverify —— 代码校验 Shrink 作为代码删减肯定是有删减的入口的...混淆部分一共会带来两部分的收益: 代码失去直观的语义(因为我们的方法或者函数命名时都会有一定的规则) 代码内容缩短,缩小整体的包体积 Preverify 对代码进行预校验。
dontskipnonpubliclibraryclasses # 指定不去忽略非公共的库的类的成员 -dontskipnonpubliclibraryclassmembers # Android不需要预校验preverify
ProGuard ProGuard除了可以shrink(压缩),也可以进行optimize(优化),obfuscate(混淆),在编译时期进行preverify(预验证)。
领取专属 10元无门槛券
手把手带您无忧上云