基于原生的移动跨平台研究和实践

基于原生主要是针对基于webview+h5比较来说的,基于H5的我不想再讨论了,我想尝试的是从UI到功能都是原生,而不是用H5模拟的所谓原生体验。

背景

我们从开发角度来考虑,但凡想从事长远的开发工作,都有自己的技术积累,最简单的就是一些UI组件和功能组件的封装。

举例,我在一个App里实现了一个点击一下能自动切换背景颜色的Button,包括点击的动画效果,我肯定会考虑封装成一个类,比如叫MyButton,在Android下它继承Button类, 在ios下它继承UIButton类。做下一个App,我要重用就把MyButton类文件直接拷贝到新项目里,或者引用一个jar包或a文件。

还是不够,我还想进一步,我想让做App的开发和做原生的开发彻底分离,原生开发人员不需要理解和接触任何App业务,只需要封装类似MyButton这种组件提供给App开发人员使用,而App开发人员是不需要懂android和ios技术的开发人员。ReactNative只能做到部分分离,做不到真正的跨平台,我想做到真正的一次开发跨Android和iOS平台,有没有可能实现,怎么实现?

问题

设想很简单,但是真正仔细去研究可行性,会发现巨量的问题和细节需要考虑和研究,我先列出19个基本问题:

  1. 要跨平台,最基本的是选择一个第三方语言,如果考虑运行时肯定首选JavaScript或lua之类的脚本语言。也可以像xamarin那样用编译型语言,不过难度肯定更大。

  2. 如果要ui也跨平台,不考虑html的话,就得使用JSON或XML来描述ui层次结构。

  3. 如果用JSON和XML描述,就得需要有可视化的工具来方便用户开发ui,否则直接文本编辑不可想象。

  4. 如果使用JS,需要选择JS引擎,是JSCore还是V8,这需要研究差异和优劣。

  5. Android最基础的Activiy如何封装,在iOS对应UIViewControlller?生命周期怎么考虑?肯定需要考虑多层,多层之间数据如何交互?

  6. JS引擎实例整个App就用一个还是多个?需要释放吗?如何释放?

  7. Android的文件管理和iOS的如何统一?二者有相似处,也有很大差异。

  8. 线程怎么处理,允许App业务开发者直接构建和使用线程吗?

  9. Android除Activity之外还有services等基础组件,iOS找不到对应的,如何统一?

  10. 虽然不是以H5为核心,但是webview肯定要支持,那webview里的h5如何和原生交互?如何让webview加载的h5的js和跨平台框架的js之间通信?

  11. 肯定需要一个统一的事件机制,包括button点击这种系统事件的处理,也包括自定义事件,如何设计和实现android和ios的统一事件机制?

  12. 屏幕适配如何处理,这一块非常麻烦,我们的目标是让App业务开发者尽量不去考虑这种细节,如何设计和实现?

  13. 布局怎么设计,Android有很多布局类,iOS少一点主要是绝对布局,这一块如何统一?

  14. 类似列表类型的组件应该有一个统一的处理方式,列表的复用机制在android和ios里都有类似的概念,android用ListView,iOS用UITableView,怎么统一?

  15. 代码编写的时候怎么调试?修改一点ui或逻辑代码,如何马上看到效果?能否单步?如何看到实时错误信息和调试信息?

  16. Android和iOS的闪退怎么办?App开发者不懂android和ios如何面对闪退问题?

  17. 代码编写完了,如何打包生成Android和iOS的安装包?如果对外服务,如何替换证书,第三方的一些key,打包失败了怎么办,这需要一个完整的云打包服务,里面有很多问题需要解决。

  18. 怎么扩展功能?除了我们以外,怎么能让其他原生开发人员来扩展功能?

  19. 如何实现组件插件化,可以根据需要裁剪,如何保证多个组件打包的冲突?

我只是列出一部分技术问题,而且每个问题的不同解决方案都会带来无数小的问题。我们想实现这个框架对外服务,除了技术环节外,还有不少非技术的因素我们暂且不提。

方案

每个问题的解决展开来都可以分析很长,所以我们只能先总体上简单说一个大概。后续可以针对具体的问题再单独发文探讨。

  1. 调试和最终的发布App都是插件化,可裁剪的

  2. 有一个组件商店由我们和其它原生开发者维护

  3. App开发者利用可视化IDE拖拽ui,利用js代码编写逻辑,填充数据,更新ui

  4. 有一个云打包系统把App开发者开发的js代码和ui文件和原生开发的组件合并编译打包

  5. 核心框架包含运行时脚本引擎解析js代码,包含ui解析引擎解析json并构建原生ui树。

实践

DeviceOne从2015年初开始设计开发,到2015年9月份发布,从发布到现在一年半了,它已经不是一个研究项目了,而是服务众多开发者的一个平台级产品了,有几百App上线了。这种跨平台的想法我估计大家都不难想到,但是从设想到实现到产品,国内还是少有的,我们的努力证明这种思路是可行的并能达到了很好的效果,希望给大家带来启发。

原文地址:https://www.cnblogs.com/onlydo/p/6602326.html