分析概览
分析时机
| 时机 | 关注点 | 工具示例 | 
|---|---|---|
| 设计态 | 架构设计 | UML, Feakin | 
| 创建态 | 代码规范内建、规范执行机制、分层规范等 | 应用脚手架 | 
| 开发态 | 代码规范 | CheckStyle 的 Intellij IDEA插件 | 
| 测试态 | 代码规范、分层架构、API 规范等 | ArchUnit | 
| 集成态 | 质量门禁 | Sonarqube | 
| 运行态 | 服务依赖 | Skywalking | 
诸如于:
- 开发态
- 静态代码分析 (编译前):对源码进行语法、控制流行等的分析,从而实现对代码的依赖分析、静态检查、自动化重构等。
- 基于构建工具分析 (编译时):通过编写 Gradle 插件/IDE 插件、执行特定的 task,分析各个模块间的依赖关系等。
- 中间表示分析 (编译后): 对编译过程或者编译后产生的中间表示(IR)分析,如字节码(bytecode)、smali 等。
 
- 运行态
- 运行时分析 (运行时):对运行时的数据进行分析,如 JVM 内存、线程、GC 等。
 
静态代码分析工具对比
| 工具 | 精确度 | 开发难度 | 跨语言成本 | 新语言成本 | 自动化重构 | 主要挑战 | 
|---|---|---|---|---|---|---|
| 语言编译器 | 完美 | 低 | 高 | - | Yes | 部分编译器不提供 AST 接口 | 
| Antlr | 极高 | 中 | 中 | 中 | Yes | 学习成本,添加对于框架的支持成本高 | 
| Ctags | 中 | 低 | 低 | 高 | Yes | 同上 | 
| Tree-sitter | 高 | 高 | 中 | 高 | Yes | 同上 | 
| Doxygen | 中 | 低 | 低 | 高 | No | 不准确 | 
| CodeQuery | 极高 | 中 | 中 | 高 | Yes | 添加对于框架的支持成本高 | 
Android 不同依赖方式对比
| 静态代码分析 | 基于构建工具分析 | 中间表示分析 | |
|---|---|---|---|
| 适用场景 | 代码分析、架构分析、重构工具等 | 模块间依赖 | 代码依赖分析、编译优化 | 
| 精确度 | 中。诸如注解需要定制 | 高。编译过程依赖于依赖解析 | 高。 | 
| 开发难度 | 中。已有的资源比较多 | 中。不同语言需要重新学习 | 高。相关学习资料少 | 
| 方式 | 源码分析 | 过程产出物和编译时 API | 过程和结果产出物 | 
| 工具示例 | Sonarqube、Findbugs | Android Studio | Proguard/R8、Baksmali | 
| 主要问题 | 分析结果的准确性依赖于框架的支持、语言特性分析等,类似于 IDE。想实现 100% 的准确性不太可能,适用度高,成本相对低。 | 依赖于 Gradle 的版本,需要考虑版本兼容性问题。官方文档较少,需要结合 ADT 中的 Gradle 源码。 | 由于过程和结果产出物,已经是优化的结果,想要 100% 复原是不可能的。 |