看看阿里的动态组件化: https://github.com/alibaba/atlas/tree/master/atlas-docs
背景:
-
现在项目中都追求模块化开发、组件化开发。一个是避免代码重复开发(重复造轮子),另一个是方便维护和项目集成。
-
Android 项目有方法数的限制(常说的64K限制),如果项目太大或者引用了太多的三方库(依赖库的方法数量也会计算在64k中)。现在通常使用的方法是 使用 multiDex。
-
一个很大的项目, 比如美团、淘宝、支付宝等。里面会融合很多功能。比如美团APK里面可能需要集成 猫眼APK、酒店民宿apk、外卖apk、抢票apk等等。这些项目在开发的时候是分布进行的。作为一个用户,如果我下载美团apk,不希望直接把所有相关的内容apk都带下来。我可能只是想用外卖或者电影票的功能。
host | 基础支持 | 包含独立的中间件,以及一个Base的工程,里面可能包含应用的Application,应用icon等基础性内容 | |
bundle | 业务层基本单位 | 运行期按需动态加载。bundle可以调用host的代码和资源,同时bundle之间允许存在依赖关系。 |
|
接下来看看Atlas能做什么:高复用、低耦合、可插拔
-
host和bundle都可以独立的进行开发和调试 。
-
支持运行bundle中的四大组件 。
-
bundle可以直接使用host中的代码和资源 。
-
业务需要时,才会去加载对应bundle中的代码和资源
-
减少包体积。不常用的bundle放在云端,需要时按需下载。当用户设备空间紧张时,可以清理掉一些长期不用的组件 。
-
动态部署:类似于热更新。但是比热更新更加强大。
-
业务灰度新的sdk,快速测试效果,同时有问题以及时回滚
-
及时上线新需求,快速生效。
-
动态修复线上故障
-
这个框架已经支持了大部分的Android 设备:
接下来看下,如何接入这个框架:使用https://github.com/alibaba/atlas/tree/master/atlas-demo/AtlasDemo 官方的Demo
-
根目录Build.gradle
-
Host:
atlas { atlasEnabled true tBuildConfig { autoStartBundles = ['com.taobao.firstbundle'] //自启动bundle配置 outOfApkBundles = ['remotebundle'] preLaunch = 'com.taobao.demo.DemoPreLaunch' classInject false dataBindingBundles = ['com.taobao.databindbundle'] } manifestOptions { addAtlasProxyComponents true } patchConfigs { debug { createTPatch true } } buildTypes { debug { if (apVersion) { baseApDependency "com.taobao.android.atlasdemo:AP-debug:${apVersion}@ap" patchConfig patchConfigs.debug } } } }
-
Bundle:
atlas { bundleConfig { awbBundle true } buildTypes { debug { baseApFile project.rootProject.file('app/build/outputs/apk/app-debug.ap') } } } group = 'com.atlas.demo' version = '1.0.1'
-
看看APP是如何运行的;
-
首先app 的gradle中规定了默认编译三个middlewarelibrary、splashscreen、activitygroupcompat 这三个module进入apk中。
-
在Manifest中定义com.taobao.splashscreen.WelcomeActivity 是进入应用第一个加载的Activity。
-
WelcomeActivity 中代码延迟3秒进入 com.taobao.demo.MainActivity (这里必须用全路径)------这不是普通的module之间的互相引用Activity
-
接下来就有两个问题了, 如何实现模块的独立动态更新 以及 如何实现依赖模块 使用时下载后加载。
准备工作:gradlew clean assembleDebug publish
adb install app/build/outputs/apk/app-debug.apk
-
如何实现远程依赖加载:各个业务bundle可以根据业务需求修改更新各自bundle的代码
-
app工程目录下执行`../gradlew clean assembleDebug -DapVersion=apVersion -DversionName=newVersion`, 其中apVersion为之前打的完整APK的版本,newVersion为此次动态部署要生成的新的版本号。
gradlew clean assembleDebug -DapVersion=1.0.0 -DversionName=1.0.1
-
检查build/output/tpatch-debug 目录下文件是否生成,将远程patch下载到你的设备上
-
adb push app/build/outputs/tpatch-debug/update-1.0.0.json /sdcard/Android/data/com.taobao.demo/cache/update-1.0.0.json
adb push app/build/outputs/tpatch-debug/patch-1.0.1@1.0.0.tpatch /sdcard/Android/data/com.taobao.demo/cache/patch-1.0.1@1.0.0.tpatch
-
-
如何实现 Bundle使用时下载后加载
-
添加远程bundle的依赖,参考 app/build.gradle下的 bundleCompile project(':remotebundle')
-
声明远程bundle列表,参考 app/build.gradle下的atlas { tBuildConfig { outOfApkBundles = ['remotebundle'] }
-
gradlew clean assembleDebug publish,远程bundle 路径:app/build/outputs/remote-bundles-debug
-
将远程so下载到你的设备上(主动下载和被动推送都可以),这里直接在PC上执行adb push app/build/outputs/remote-bundles-debug/libcom_taobao_remotebunle.so /sdcard/Android/data/com.taobao.demo/cache/libcom_taobao_remotebunle.so
-