组件化开发Android知识Android开发

插件化阿里Atlas之单bundle调试功能源码解析

2017-05-14  本文已影响444人  dengyin2000

大家都知道插件化对于一个巨大的项目有着非常多的好处,能够让项目模块之间解耦,而且插件化的热更新能力还能支持模块的独立更新,这样就可以摆脱版本发布时间点的束缚,热更新还可以用来快速的做AB测试,快速验证产品功能。不过这里要说的是Atlas插件化单bundle调试功能提升我们开发效率这件事。

本人在一个电商公司,安卓、ios团队分别大概20人左右,3个星期2个版本,每个版本大概2,3十个需求,这些年项目越做越大,以至于现在clean build apk需要15分钟左右,随意修改一行代码增量build也需要4,5分钟,这些时间是在i5cpu,16gb内存,ssd台式机上的结果,每次build大家都想砸机器了。开发时间大部分都浪费在编译上了,一次次漫长的等待足以让思如泉涌、文笔如飞的你兴致全无。当我们把项目完成atlas插件化后使用单bundle调试功能时发现,之前随意修改一下编译需要4,5分钟的时间降到了2,3十秒。这大大提升了我们的开发效率。

什么是单bundle调试功能

请看官方解释:

单bundle调试

当你只是修改了某个bundle时,你不用编译出整个apk,只需要编译当前的bundle,然后通过类似插件补丁的方式安装到手机。当你的bundle拆的足够细时,这样编译单个bundle就足够快了。:)

单bundle调试流程

首先在github上把atlas整个项目clone下来,把atlas/atlas-demo/AtlasDemo导入到Android studio中,如下:

工程项目

atlas-plugin是atlas插件源码,AtlasDemo是atlas官方demo。

gradle assemblePatchDebug做了什么事情

通过插件atlas-plugin项目源码可以知道AssemblePatchTask依赖AwoInstallTask,AwoInstallTask又依赖AwoPackageTask,其实整个的依赖规则是下层的task会依赖上层的task,怎么处理依赖的请看com.taobao.android.builder.tasks.manager.MtlTaskInjector#injectTasks方法,设置了多少task请看com.taobao.android.builder.manager.AtlasLibTaskManager#createAwoTask方法。

tasks依赖

查看AwoPackageTask源码发现这个task主要是对bundle模块进行编译,最后生成插件的so文件。so文件生成在插件模块的build/outputs/awbs目录中。

AwoPackageTask

AwoInstallTask做了两件事,一是把生成的插件so文件push到sdcard上指定路径,然后然后发出com.taobao.atlas.intent.PATCH_APP广播通知atlas来安装这个插件。

AwoInstaller

继续跟踪源码可知道so文件push的路径为"/sdcard/Android/data/" + packageName + "/files/atlas-debug/",atlasDemo的话,路径为"/sdcard/Android/data/com.taobao.demo/files/atlas-debug"。详情请看com.taobao.android.builder.tasks.awo.utils.AwoInstaller#installPatchIfDeviceConnected方法。
push到sdcard上然后再发送指定的广播,命令为"adb shell am broadcast -a com.taobao.atlas.intent.PATCH_APP -e pkg ${packageName}",详情请看com.taobao.android.builder.tasks.awo.utils.AwoInstaller#notifyApppatching方法。
最后assemblePatchDebug任务其实啥都没干,只是依赖AwoInstallTask而已。OK,广播发送完了,接下来要看看App这边做了些什么。

AwoPatchReceiver

在项目中引入了atlasupdate项目aar的应用后,在AndroidMenifest中会加入AwoPatchReceiver的定义:

AwoPatchReceiver

所以在上一步中发出这个广播后,AwoPatchReceiver就能启动了,继续查看源码我们能知道先会通过push到指定目录的插件so文件生成真正的atlas的tpatch补丁文件,然后会删除插件so文件,最后也是通过com.taobao.atlas.update.AtlasUpdater#update方法来加载生成的tpatch补丁文件,详情请看com.taobao.atlas.update.AwoPatchReceiver.PatchTask类。

PatchTask

OK,这样单bundle调试功能就都串起来了,另外:这个功能是只能在debug模式下运行。大家快来试试吧。

Reference: https://github.com/alibaba/atlas/tree/master/atlas-demo

上一篇 下一篇

猜你喜欢

热点阅读