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


小结


以上就是本节的全部内容



相关文章
|
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 -重要-优雅草卓伊凡
|
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为例-优雅草央千澈
2005 11
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
2536 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
Java Android开发 Windows
使用keytool查看Android APK签名
本文介绍了如何使用Windows命令行工具和keytool查看APK的签名信息,并提供了使用AOSP环境中的signapk.jar工具对APK进行系统签名的方法。
2985 0
使用keytool查看Android APK签名
|
Java Android开发
安卓apk包反编译
拿到安卓的apk包如何,如何反编译呢。流程如下
1177 0
安卓apk包反编译
Android APK反编译就这么简单 详解(附图)
Android APK反编译就这么简单 详解(附图)
1529 0
Android APK反编译就这么简单 详解(附图)

热门文章

最新文章