补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试

简介: 补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试


打开:

指向:AppPlugin 类,跟下:

上节说过:插件类都继承于 Plugin,入口函数 apply(),但在这里没找到,跟下:AbstractAppPluginBasePlugin

① BasePlugin

行吧,在BasePlugin中重写了 apply() 方法,里面调用了两个函数,先跟下:basePluginApply()

执行一些检查操作,接着是 插件的初始化及配置,而另一个函数:pluginSpecificApply() 则是空实现,接着跟下:配置项目、配置扩展及创建Tasks的过程。

② 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()

2333,跟上面的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 resourceSets = getConfiguredResourceSets(preprocessor)

接着往下走:

继续:

点进merger.mergeData() → ResourceMerger.mergeData() → DataMerger.mergeData()

呕吼,实际上调用的还是 MergedResourceWriter 类里的方法,跟下addItem():

不同文件会创建对应的 CompileResourceRequest 实例,并添加到 mCompileResourceRequests 中,后者是一个ConcurrentLinkedQueue队列,资源最后会在end()方法处处理:

最终调用 AaptV2CommandBuilder.makeCompileCommand() 方法生成aapt2命令去处理资源。

Tips:将图片转为webp格式的插件一般在此Task前处理~


8. createDebugCompatibleScreenManifests

过程简述:manifest文件中生成compatible-screens,用于屏幕适配 相关代码:CompatibleScreensManifest.kt


9. processDebugManifest

过程简述:合并AndroidManifest.xml文件 相关代码:ProcessApplicationManifest.java、ProcessLibraryManifest.java


10. processDebugResources

过程简述:调用aapt2 link 打包资源并生成R.java文件 相关代码:TaskManager.java → createProcessResTask()


11. compileDebugKotlin

过程简述:编译Kotlin文件为字节码 相关代码:没找到…可能在kotlin插件源码里


12. prepareLintJar

过程简述:拷贝lint jar包到指定位置 相关代码:PrepareLintJar.java


13. avaPreCompileDebug

过程简述:生成annotationProcessors.json文件 相关代码:JavaPreCompileTask.java


14. ompileDebugJavaWithJavac

过程简述:编译java文件 相关代码:AndroidJavaCompile.java


15. compileDebugNdk

过程简述:编译NDK 相关代码:NdkCompile.java


15. mergeDebugShaders

过程简述:合并Renderscript文件(.rs) 相关代码:MergeSourceSetFolders.java


16. compileDebugShaders

过程简述:编译Renderscript文件(.rs) 相关代码:ShaderCompile.java


17. mergeDebugAssets

过程简述:合并assets文件 相关代码:MergeSourceSetFolders.java


18. validateSigningDebug

过程简述:验证签名 相关代码:ValidateSigningTask.kt 附加信息:检查当前Variant的签名配置中是否存在密钥库文件,如果当前密钥库默认为debug keystore,那密钥库不存在也会进行相应的创建。


19. signingConfigWriterDebug

过程简述:编写SigningConfig信息 相关代码:SigningConfigWriterTask.kt


20. checkDebugDuplicateClasses

过程简述:检查重复class 相关代码:CheckDuplicateClassesTask.kt 附加信息:检查项目外部依赖是否不包含重复类,打包成dex的时候再检测报错不怎么友好,所以引入了这个Task用于快速失败。


21. transformClassesWithDexBuilderForDebug

过程简述:将class打包成dex 相关代码:DexArchiveBuilderTransform.java

核心代码解析:

定位到 transform() 方法,可以看到对class的处理分为了两种,目录下的 class和.jar里的class:

跟下 processJarInput()

继续跟:convertJarToDexArchive()

对class两种处理方式,最后都走到 convertToDexArchive(),其中调用了 launchProcessing()

这里的 dexArchiveBuilder.convert() 其实就是内部调用dx或d8来打dex,跟下赋值处:


22. transformDexArchiveWithExternalLibsDexMergerForDebug

过程简述:打包第三方库的dex 相关代码:ExternalLibsMergerTransform.kt 核心代码解析:

同样跟 transform()

创建了一个 DexMergerTransformCallable 实例,然后调 call() 方法:

作者2013年从java开发,转做Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

参与过不少面试,也当面试官 面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我整理了一份阿里P7级别的最系统的Android开发主流技术,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括阿里,以及字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术。如果你想深入系统学习Android开发,成为一名合格的高级工程师,可以收藏一下这些Android进阶技术选型

我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

Java语言与原理;

大厂,小厂。Android面试先看你熟不熟悉Java语言

高级UI与自定义view;

自定义view,Android开发的基本功。

性能调优;

数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。

NDK开发;

未来的方向,高薪必会。

前沿技术;

组件化,热升级,热修复,框架设计

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多,GitHub可见;《Android架构视频+学习笔记》

当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。

不出半年,你就能看出变化!


相关文章
|
3月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
109 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
295 83
|
2月前
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
148 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
3月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
118 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
3月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
86 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
3月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
95 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
3月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
319 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
4月前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
238 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
4月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
78 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
307 76

热门文章

最新文章

  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    148
  • 2
    Android历史版本与APK文件结构
    295
  • 3
    Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡
    80
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    118
  • 5
    【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
    238
  • 6
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    78
  • 7
    apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
    107
  • 8
    使用Kivy创建“Hello World”应用并打包成APK
    652
  • 9
    使用keytool查看Android APK签名
    642
  • 10
    解决android apk安装后出现2个相同的应用图标
    501