补齐Android技能树——从AGP构建过程到APK打包过程


0x2、如何查看插件源码


研究对象是AGP的源码,所以要先搞一份源码,方法有下述几种:

1. 下载完整源码

如果磁盘空间比较充足,可以通过repo的方式,将Android Gradle Plugin的源码下载到本地(貌似30多G):

最新源码的只有3.4.0的

repo init -u https://android.googlesource.com/platform/manifest -b gradle_3.4.0

repo sync

2. 下载部分源码

当然不需要编译的话,可以直接下对应源码包,来到下述地址:build-system

点tgz下载:

然后用VS Code之类的代码查看工具查看即可~

3. 取巧(推荐)

在app层级的build.gradle添加下述依赖:

implementation ‘com.android.tools.build:gradle:3.4.0’

build下,然后在左侧 External Libraries 即可找到源码:


0x3、阅读源码前的一些补充


阅读源码前建议温习下我前面写的三篇文章,另外补充点姿势:

Gradle Plugin 中的Task主要有三种:普通Task增量TaskTransform

Task一般会继承 DefaultTaskIncrementalTask,而 @TaskAction 注解的方法,就是此Task做的事。

继承 IncrementalTask 的类为增量Task,这个增量是相对于全量来说的,全量指的是:调用完clean后第一次编译过程,修改代码或资源后再次编译,就是增量编译。几个关键方法:

public abstract class IncrementalTask extends BaseTask {

// 是否需要增量,默认false

@Internal protected boolean isIncremental() { }

// 需要子类实现,全量时执行的任务

protected abstract void doFullTaskAction() throws Exception;

// 增量时执行的任务,默认什么都不执行,参数是增量时修改过的文件

protected void doIncrementalTaskAction(Map<File, FileStatus> changedInputs) throws Exception{ }

@TaskAction

void taskAction(IncrementalTaskInputs inputs) throws Exception {

// 判断是否是增量,是执行doIncrementalTaskAction,否则执行doFullTaskAction

// 获取修改文件

private Map<File, FileStatus> getChangedInputs(IncrementalTaskInputs inputs) { }

}

至于 Transform(变换),是Android官方提供给开发者,在**.class → .dex转换期间用来修改.class文件的一套API**,留意 transform() 方法的实现就好。


0x4、执行gradle assemble的Task链


我们常常使用下面的命令来打包APK:

gradlew assemble

可以由此入手,看下打包一次都涉及到了哪些Task,键入下述命令(linux、mac使用./gradlew):

gradlew assemble --console=plain

输出结果及要点简述如下所示:

:app:preBuild UP-TO-DATE → 空task,锚点

:app:preDebugBuild → 空task,锚点

:app:compileDebugAidl NO-SOURCE → 处理AIDL

:app:checkDebugManifest → 检查Manifest是否存在

:app:compileDebugRenderscript NO-SOURCE → 处理renderscript

:app:generateDebugBuildConfig → 生成 BuildConfig.java

:app:mainApkListPersistenceDebug → 生成 app-list.gson

:app:generateDebugResValues → 生成resvalue,generated.xml

:app:generateDebugResources → 空task,锚点

:app:mergeDebugResources → 合并资源文件

:app:createDebugCompatibleScreenManifests → manifest文件中生成compatible-screens,指定屏幕适配

:app:processDebugManifest → 合并manifest.xml文件

:app:processDebugResources → aapt打包资源

:app:compileDebugKotlin → 编译Kotlin文件

:app:prepareLintJar UP-TO-DATE → 拷贝 lint jar包到指定位置

:app:generateDebugSources → 空task,锚点

:app:javaPreCompileDebug → 生成 annotationProcessors.json 文件

:app:compileDebugJavaWithJavac → 编译 java文件

:app:compileDebugNdk → 编译ndk

:app:compileDebugSources → 空task,锚点

:app:mergeDebugShaders → 合并 shader文件

:app:compileDebugShaders → 编译 shaders

:app:generateDebugAssets → 空task,锚点

:app:mergeDebugAssets → 合并 assests文件

:app:val

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值