0x00 背景
最近整体升级了项目的工具链。 使用了 D8 作为项目的主力。
在 Release 包在 5.1 上出现了 java.lang.VerifyError 异常。
0x01 问题定位
VerifyError 错误一般出现的 5.0 以下。通常由分包导致的。但是这次发生的机子是 5.1 。
最近整体升级了项目的工具链。 使用了 D8 作为项目的主力。
在 Release 包在 5.1 上出现了 java.lang.VerifyError 异常。
VerifyError 错误一般出现的 5.0 以下。通常由分包导致的。但是这次发生的机子是 5.1 。
版本:1.4.94
地址:r8
r8包含了D8 的功能, 实现了对 java 字节码优化,混淆并转换成 dex 文件的功能。 可以很好的替代了 ProGuard 的在 Android 编译工具链上的应用。 同时生成的 dex 文件更为轻小。
r8 主要分为 5 个阶段: Read Input,Configuration,Shrink ,Optimize,Write Dex
代码入口 com.android.tools.r8.R8
Gradle: 4.10.2
Android Gradle Plugin: 3.2.0
Android Gradle Plugin 3.0 以后依赖声明使用了 implementation
和 api
来替代原来的 compile 。提供了对依赖进行更细致的控制。
这一特性是由 JavaLibraryPlugin 中衍生过来的。 更准确的来说是 JavaBasePlugin 。Android 并不依赖 JavaLibraryPlugin。
好处:
加快编译速度。
最近使用 vysor 。发现直接把手机当成模拟器操作确实是方便到不行。 但是魅族 16th plus 在 vysor 失效了。同时vysor 通知太过干扰。基于以上两点切换到开源框架 scrcpy: Display and control your Android device
主要步骤如下:
ProGuard 是 java 字节码优化工具, 广泛运用到 Java 和 Android 项目中。可以有效的减少程序的大小,提高运行效率,提高逆向分析的成本。
Proguard 优化主要分为四个阶段:
Shrink , Optimize, Obfuscate , Preverify 四个阶段
四个阶段可以独立运行的,默认全部开启,可以通过配置 -dontshrink
,-dontoptimize
,-dontobfuscate
,-dontpreverify
关闭对应的阶段.
注: ProGuard 处理 class 。class 文件可以由 jikes 或 javac 或 Kotlin 生成, ProGuard 会根据 javac 和 jikes 特性做针对性优化。
Flutter : Flutter allows you to build beautiful native apps on iOS and Android from a single codebase. 具有跨平台, 高性能的优势.
强引用:在 GC 中如果发现一个对象是可达的,那么 GC 在任何情况都不会回收这个对象
软引用(SoftReference):在 GC 中如果发现一个对象是软可达的 。那么 GC 可以根据内存情况清除这些对象。并且保证在抛出 OutOfMemoryError 异常之前。所有的软引用的对象是已经回收过。
弱引用(WeakReference):在 GC 中如果发现一个对象是软可达的,GC 会回收这些对象。
总结: 强引用在任何情况都不会被回收。软引用在 GC 可以被回收。弱引用和虚引用在 GC 中会尽可能回收。
Android GC 主要分为 标记 和 清除 阶段、 通过定义两个 Bitmap, Live Bitmap 和 Mark Bitmap , 前者表示上次 GC 存活的对象。后者表示这次 GC 存活的对象。 Mark Bitmap 存在 而 Live Bitmap 不存在的为当前 GC 回收的对象。 GC 结束的时候将 Mark Bitmap 设置为 Live Bitmap。 不管并行还是串行GC, 或者 ART 的 GC 基本流程类似。
Gradle:4.4.1
通过声明的方式定义了一组依赖。Gradle 通过声明的方式查找对应依赖产物和他们的自身的依赖产物。它代表一组文件。只是这些文件是根据声明信息从本地或远程仓库中获取的。
dim.red
环境:Gradle 4.4.1
Task 输入输出注解
@Input,@InputFile,@InputFiles,@InputDirectory, @OutputFile,@OutputFiles,@OutputDirectory,@OutputDirectories,@Destroys,@LocalState,@Nested,@Inject,@OptionValues
@PathSensitive
@Classpath
@CompileClasspath
博客地址: dim.red
分析最近的 Crash , 排在前列基本是第三方SDK导致. 遇到这样的问题, 我们需要寻求官方的支持, 但是官方的支持总是来得比较晚. 在Android上, 第三方SDK一般是两种, 一种是jar, 一种是so. so的修改成本过大, 我们放弃它, 我们现在探讨对 jar 的修改.