🍵补齐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。


小结


以上就是本节的全部内容



相关文章
|
10月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
980 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
1781 83
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
1096 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
653 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
1692 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
678 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
Android开发 开发者
Android Split APK介绍
【2月更文挑战第5天】
|
XML API Android开发
android S 上 安装apk出现android.os.FileUriExposedException
android S 上 安装apk出现android.os.FileUriExposedException
702 6
|
设计模式 缓存 Java
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
补齐Android技能树——从AGP构建过程到APK打包过程,安卓rxjava面试
|
Android开发
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
Android Gradle开发—脚本实现自动打包后复制一份APK文件,并修改APK名称,到指定目录作备份
1362 0

热门文章

最新文章