② configureProject() → 配置项目
创建DataBindingBuilder实例,强制使用不低于当前所支持的最小插件版本,应用Java插件,如果启用了构建缓存选项,创建buildCache实例,添加了一个回调:所有project执行完后执行资源回收相关操作。
③ configureExtension() → 配置DSL扩展
完成下述几项工作:
- ① 创建build.gradle中的Android DSL;
- ② 创建VariantFactory、TaskManager、VariantManager实例;
- ③ 注册新增/移除配置的回调,包括:signingConfig,buildType,productFlavor;
- ④ 创建默认的debug签名、debug和release两种buildType;
④ createTasks() → 创建Tasks
跟下 createAndroidTask():
跟下 createAndroidTasks():
注意下:这里遍历了所有的variantScope,然后调用 createTasksForVariantData() 创建变体数据对应的Tasks:
跟下:createTasksForVariantScope():
抽象方法,看下哪里实现了这个方法,搜下:extends TaskManager
最终定位到了:ApplicationTaskManager 类
噢吼,就是在这里完成APK打包过程的Tasks,可以简单跟跟验证下:
createAnchorTasks(),创建锚点Tasks:
跟下:createVariantPreBuildTask()
跟上面的APK打包Task链的相呼应,AGP插件的构建过程就跟到这里,接着了解下APK打包的Task。
0x6、Apk的打包过程
Tips:分享下搜索Task的实现类的技巧 → 全局搜 "xxx", "yyy" 即可快速定位对应Task类,如 "compile", "Aidl",或者搜索整个Task,然后删删删匹配。
1. compileDebugAidl
过程简述:将.aidl文件通过aidl工具转换成编译器能够处理的Java接口文件相关代码:AidlCompile.java → AidlProcessor.java → call()
2. checkDebugManifest
过程简述:检查AndroidManifest.xml文件是否存在相关代码:CheckManifest.java
3. compileDebugRenderscript
过程简述:处理Renderscript文件(.rs)相关代码:RenderscriptCompile.java
4. generateDebugBuildConfig
过程简述:生成 BuildConfig.java 文件相关代码:GenerateBuildConfig.java
5. mainApkListPersistenceDebug
过程简述:持久化APK数据到apk-list.gson中相关代码:MainApkListPersistence.kt
6. generateDebugResValues
过程简述:遍历res下的values目录下xml文件,生成resValues文件generated.xml相关代码:GenerateResValues.java → generate() → ResValueGenerator.java
7. mergeDebugResources
过程简述:使用AAPT2合并资源文件相关代码:MergeResources.doFullTaskAction() → ResourceMerger.mergeData() → MergedResourceWriter.end() → mResourceCompiler.submitCompile() → AaptV2CommandBuilder.makeCompileCommand()
核心源码解析:
实现了isIncremental()方法,返回true,说明支持增量编译,跟下全量编译方法 doFullTaskAction()
ResourcePreprocessor preprocessor = getPreprocessor(); List<ResourceSet> resourceSets = getConfiguredResourceSets(preprocessor)
接着往下走:
继续:
点进merger.mergeData() → ResourceMerger.mergeData() → DataMerger.mergeData()
呕吼,实际上调用的还是 MergedResourceWriter 类里的方法,跟下addItem():
不同文件会创建对应的 CompileResourceRequest 实例,并添加到 mCompileResourceRequests 中,后者是一个ConcurrentLinkedQueue队列,资源最后会在end()方法处处理:
最终调用 AaptV2CommandBuilder.makeCompileCommand() 方法生成aapt2命令去处理资源。
Tips:将图片转为webp格式的插件一般在此Task前处理~