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

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

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() 方法:


网络异常,图片无法展示
|


比较简单,就是调下dx或d8将上面生成的依赖库的dex合并成一个dex。


23. transformDexArchiveWithDexMergerForDebug


过程简述:打包最终的dex相关代码:DexMergerTransform.transform() → mergeDex() 核心代码解析:


网络异常,图片无法展示
|


跟下 submitForMerging()


网络异常,图片无法展示
|


也是创建了一个 DexMergerTransformCallable 实例,剩余逻辑同上~


24. mergeDebugJniLibFolders


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


25. transformNativeLibsWithMergeJniLibsForDebug


过程简述:合并jnilibs相关代码:MergeJavaResourcesTransform.java


26. transformNativeLibsWithStripDebugSymbolForDebug


过程简述:去掉native lib里的debug符号相关代码:

StripDebugSymbolTransform.java


27. processDebugJavaRes


过程简述:处理java res相关代码:MergeJavaResourcesTransform.java


28. transformResourcesWithMergeJavaResForDebug


过程简述:合并java res相关代码:MergeJavaResourcesTransform.java


29. packageDebug


过程简述:打包APK相关代码:PackageApplication.java → PackageAndroidArtifact.doTask()


核心代码如下:


网络异常,图片无法展示
|


而上面的这些updateXxx()方法,调用的都是:IncrementalPackager → updateFiles()


网络异常,图片无法展示
|


网络异常,图片无法展示
|


最终调用mApkCreator.writeZip将上述内容写入到APK中。


30. extractProguardFiles


过程简述:生成混淆文件相关代码:ExtractProguardFiles.java


补充:锚点Task → 空Task


上面的Tasks过滤了锚点Task,啥事锚点Task?答:空Task,用来表明处于某种状态

preBuild 为例,全局搜它,定位到: TaskManager → MAIN_PREBUILD


网络异常,图片无法展示
|


跟下引用处:createTasksBeforeEvaluate()


网络异常,图片无法展示
|


注册了一个名为 **MAIN_PREBUILD**的Task,但没有传闭包(任务内容),即空Task。


小结


以上就是本节的全部内容



相关文章
|
20天前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
66 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
2天前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
62 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
4月前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
30天前
|
存储 安全 小程序
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
62 32
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
|
21天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
24 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
68 0
|
4月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
148 5
|
4月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
68 2
|
4月前
|
开发工具 Android开发 iOS开发
Android vs iOS:构建移动应用时的关键考量####
本文深入探讨了Android与iOS两大移动平台在开发环境、性能优化、用户体验设计及市场策略方面的差异性,旨在为开发者提供决策依据。通过对比分析,揭示两个平台各自的优势与挑战,帮助开发者根据项目需求做出更明智的选择。 ####
|
Java Android开发
【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
254 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【03】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第三篇安卓APP上架华为商店后面的步骤-华为应用商店相对比较麻烦一些-华为商店安卓上架
  • 3
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 4
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 5
    apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
  • 6
    【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
  • 7
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 8
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    Android 网路编程
  • 10
    Android学习笔记--程序调试