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

简介: Android Gradle Plugin,简称 AGP,老早之前就想好好研究下Android APK的打包过程,毕竟 APK包体积优化 的前置知识之一。

② 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前处理~


相关文章
|
12月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
334 3
|
12月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
1045 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
1888 83
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
1159 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
689 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
存储 安全 小程序
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
663 32
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
1766 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
726 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
2004 11
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
437 0

热门文章

最新文章