在移动开发中,动态化技术极其重要,一方面让APP保持最新的版本,也可以让业务开发变得更加快捷。动态化技术主要包含4种,补丁、插件化、Web和混合方案,在总结动态化技术前我们需要先总结移动开发中常见的技术,主要包含:
- iOS
- Android
- Flutter
- Web
1. 补丁技术
补丁技术很好理解,补丁技术是针对原生开发的,在iOS可以通过JavaScriptCore+Runtime技术即可实现补丁技术,但是现在已经是被严厉禁止了。在Android上,Google Play也是严厉禁止的,但是在国内的应用市场还是可以继续使用,最有名的就是腾讯的Tinker技术,Tinker不但可以用来实现补丁修复,还可以用来实现整个APP的更新,比如用来实现APP的控量灰度发布,降低APP全量发布的风险。除了补丁技术,Android还可以通过动态加载so文件实现C++动态化,这个技术还可以降低apk大小,在游戏开发中特别常见。
2. 插件化
插件化技术和补丁的技术很相似,不过只有 Android才可以实现,可以参考360团队的 RePlugin 、滴滴团队的VirtualAPK。
3. Web
Web技术具备天然的动态性特征,而且还有跨平台特征,现在手机的性能已经大幅度提升,Web的体验已经可以得到了非常重大的提升,我们可以使用Web承担部分业务开发。但是Web技术还是有很大的缺点,由于Web服务是要部署在服务器,手机需要通过网络请求的方式显示,会带来一些体验的缺失。但是我们可以通过优化WebView,比如把部分的代码提前下载到本地,这样浏览的速度就可以大幅度提升。
4. 混合技术
除了补丁技术和Web技术,我们还可以通过定制特定的DSL,对现有的技术进行增强。
3.1模板动态化(iOS、Android)
在原生开发中,我们可以使用特定的DSL语言,比如Flexlayout,使用原生代码按照规则生成UI,从而实现UI的动态化,比如美团的MTFlexbox。这种方式可以实现局部的UI实现动态化,由于无法编写复杂的控制逻辑,所以不能实现整个业务的功能,可以参考Litho在美团动态化方案MTFlexbox中的实践。
3.2 Flutter
Flutter是一门跨平台的开发框架,但是它和原生开发是差不多的,也不具备动态化技术,Flutter的布局主要是基于Flex方式,而且具备跨平台,相比原生开发,更加适合定制特定的DSL语言来实现UI的描述,但是局限性和原生也一样,无法开发复杂的逻辑,也只能在局部区域上使用,可以参考美团外卖Flutter动态化实践。
3.3 原生+JavaScriptCore
前面介绍了可以定制特定UI描述语言,实现原生UI动态化技术,然而div+css就是一个非常好的UI描述语言,我们可以让原生根据div+css生成相应的UI,再使用JavaScript实现复杂的逻辑运算,在iOS上是使用JavaScriptCore,在Android上是使用V8引擎,这方便最有名的就是React Native,在国内Weex也是非常的有名字,使用这方面的技术我们可以实现整个APP的动态化,但是这个技术局限性也很大,特别是Android和iOS的UI差异性上,容易出现各种兼容性问题,加上又必须使用原生代码去解决,导致整体开发效率并没有提升太多,反而小问题一大堆,比较适合用来开发简单的纯UI功能,如果要开发依赖手机硬件的功能会比较麻烦。
3.4 Flutter+JavaScriptCore
由于Flutter越来越火,而且Flutter缺少动态性特征,所以开发者也希望把React Native的方案应用到Flutter,毕竟只有一个平台,适配的成本相比原生也更加低,但是和(原生+Web)一样也是具备很大的局限性,也只适合用来开发纯UI的功能,必有著名的方案有腾讯开源的MXflutter和阿里巴巴开源的kraken。
3.5 原生+WebView(小程序)
现在手机的性能是非常的好,我们可以通过对WebView进行增强,再赋予更多原生的能力,使用Web技术就可以实现各种复杂的业务开发,微信小程序也证明了这一点是可行了,各大互联网公司都在跟进,使用Web技术可以非常快速地开发业务,更新维护也简单。