借助Gradle如何分析类的依赖路径
2018-03-02 本文已影响32人
SMSM
捡瓶子能赚1个亿,两个说法,哪个更具有吸引力
赚1个亿,捡瓶子
捡瓶子,赚一个1亿
如何做分享?目标先行,大纲如下
groovy语法、gradle构建流程、打包流程、实际应用。由后往前推,采用问题连接下个阶段。
实际应用
目标:
- 借助Plugin整理类的依赖关系
- 借助Plugin搜索Jar哪些类中包含『关键字』
猜猜目标plugin有哪些用途?
思路:
- 遍历Java每一行判断是否包含该『关键字』
- 但是Jar中的是class二进制文件,不是Java文件。有以下两个方案
- class转化为Java后,扫描(pass,路径长,效率低)
- 直接解析class文件(ok)
- class文件的格式:魔数、常量池、Class信息区包含interface和super等、属性区、方法区。常量池是为了减少class文件大小而设计的,集合该类全部的字符,减少重复字符,达到压缩的目的。
总结:
解析Jar中class文件,遍历常量池中字符,是否包含该『关键字』,存在则输出该class全类名
那么问题来了:
从哪里能获得该工程依赖的所有的aar、jar文件?
打包流程
- Android打包流程,java -> class -> dex&_ap -> apk。但是完整的打包流程是什么呢?
- 【打包流程图】
- 由此可知需要hook Dex流程
那么问题来了
但是对应打包流程的哪个阶段 ?
gradle基础构建流程
- 【./gradlew assembleDebug 日志】 http://aci.sankuai.com/view/%E4%B8%9A%E5%8A%A1%E9%A2%91%E9%81%93/job/erp/view/boss/job/erp_boss_assemble/10329/console
- 看task任务tree,认识task,圈出来是哪个task对应上面的打包流程。
- 如何新建一个task?action是什么?
- tasktree是什么时候生成的?构建的3个阶段,初始化、tasktree、执行。
- gradle、project、task、action、extensions概念(app、activity、xmllayout中view、view的绘制流程顺序、主题样式等配置)
groovy语法
闭包
如何自定义plugin
定义plugin
发布
附件资料
GradleAndroid简介
https://guides.gradle.org/building-android-apps/
Gradle构建生命周期
https://docs.gradle.org/4.5/userguide/build_lifecycle.html
Android打包流程
https://juejin.im/entry/58b78d1b61ff4b006cd47e5b