【分分5分快三官方_5分快三登入】聊聊移动端跨平台开发的各种技术

  • 时间:
  • 浏览:0

介绍

最近跳出的 分分5分快三官方_5分快三登入react Nati分分5分快三官方_5分快三登入Ve 再次让跨平台移动端开发你这俩话题火起来了,原先朋友以为在手机能能 能像桌面那样通过 Web 技术来实现跨平台开发,却大多可是我性能或功能哪些地方的疑问而放弃,不得不针对不同平台开发多个版本。

但这并越来越阻止朋友对跨平台开发技术的探索,毕竟谁我愿意降低开发成本,一次编写就处处运行呢?除了 React Native,这几年还跳出过某些其它处理方案,本文我可是我对哪些地方地方方案进行技术分析,供感兴趣的读者参考。

为了方便讨论,我将它们分为了以下 4 大流派:

  • Web 流:也被称为 Hybrid 技术,它基于 Web 相关技术来实现界面及功能
  • 代码转换流:将某个语言转成 Objective-C、Java 或 C#,可是我使用不同平台下的官方工具来开发
  • 编译流:将某个语言编译为二进制文件,生成动态库或打包成 apk/ipa/xap 文件
  • 虚拟机流:通过将某个语言的虚拟机移植到不同平台上来运行

Web 流

Web 流是朋友都比较了解的了,比如著名的 PhoneGap/Cordova,它将原生的接口封装后暴露给 JavaScript,能能 运行在系统自带的 WebView 中,也能能 自己内嵌三个多多 Chrome 内核 。

作为这几年争论的热点,网上可是我有可是我关于它的讨论了,这里我重点聊聊朋友最关心的性能哪些地方的疑问。

Web 流最常被吐槽的可是我性能慢(这里指内嵌 HTM分分5分快三官方_5分快三登入L 的性能,不考虑网络加载时间),可为哪些地方慢呢?常见的看法是认为「DOM 飞快」,然而从浏览器实现层厚来看,着实 DOM 可是我将对文档操作的 API 暴露给了 JavaScript,而 JavaScript 的调用哪些地方地方 API 后就进入内部人员的 C++ 实现了,这里面并越来越几个性能消耗,可是我从理论上来说浏览器的 DOM 肯定比 Android 的「DOM」快,可是我 Android 的展现架构大偏离 功能是用 Java 写的,在实现相同功能的前提下,C++ 不大可是我比 Java 慢(某些情况报告下 JIT 编译优化着实有可是我做得更好,但那可是我少数情况报告)。

可是我从字面意思上看「DOM 飞快」的说法是错误的,你这俩看法都不 可是我很普遍,可是我是可是我大偏离 人对浏览器实现不了解,只知道浏览器有 DOM,可是我不管哪些地方哪些地方的疑问能能 了抱怨它了。

越来越哪些地方的疑问在哪呢?在我看来有三方面的哪些地方的疑问:

  • 早期浏览器实现比较差,越来越进行优化
  • CSS 过于比较复杂,计算起来更耗时
  • DOM 提供的接口太有限,使得难以进行优化

第三个多多 哪些地方的疑问是最关键也是最难处理的,现在说到 Web 性能差主要说的是 Android 下比较差,在 iOS 下可是我很流畅了,在 Android 4 后后的 WebView 甚至都越来越实现 GPU 加速,每次重绘整个页面,有动画的后后不卡才怪。

浏览器实现的优化能能 等 Android 4.4 慢慢普及起来,可是我 4.4 后后就使用 Chrome 来渲染了。

而对于最新的浏览器来说,渲染慢的意味就主可是我第三个哪些地方的疑问:CSS 过于比较复杂,可是我从实现原理上看 Chrome 和 Android View 并越来越本质上的差别,但 CSS 太灵活功能无需 了,可是我计算成本很高,自然就飞快了。

那是都不 能能 通过比较复杂 CSS 来处理?实际上还真许多人越来越尝试了,比如 Famo.us,它最大的特色可是我不我就写 CSS,能能 了使用固定的几种布局土最好的法子,完整版靠 JavaScript 来写界面,可是我它能有效处理写出低效的 CSS,从而提升性能。

而对于比较复杂的界面及手机下常见的超长的 ListView 来说,第三个多多 哪些地方的疑问会更突出,可是我 DOM 是三个多多 很上层的 API,使得 JavaScript 无法做到像 Native 那样细粒度的控制内存及应用进程,可是我难以进行优化,则在硬件较差的机器上会比较明显。对于你这俩哪些地方的疑问,朋友一年前原先尝试过嵌入原生组件的土最好的法子来处理,不过你这俩方案时要依赖应用端的支持,或许后后浏览器会自带几个优化后的 Web Components 组件,使用哪些地方地方组件就能很好处理性能哪些地方的疑问。

现阶段这俩个多多 哪些地方的疑问都不 好处理,可是我许多人想干脆无需 HTML/CSS,自己来画界面,比如 React canvas 直接画在 Canvas 上,但在我看来这可是我现阶段处理偏离 哪些地方的疑问的土最好的法子,在里面的章节我会完整版介绍自己画 UI 的各种哪些地方的疑问,这里说个历史吧,6 年前浏览器还太难的后后,Bespin 就越来越干过,但是你这俩项目被使用 DOM 的 ACE 取代了,目前包括 TextMirror 和 Atom 在内的主流编辑器都不 直接使用 DOM,甚至 W3C 许多人专门写了篇文章吐槽用 Canvas 做编辑器的种种缺点,可是我使用 Canvas 要谨慎。

另外除了 Canvas,还许多人以为 WebGL 快,就尝试绘制到 WebGL 上,比如 HTML-GL,但它目前的实现太偷懒了,简单来说可是我先用 html2canvas 将 DOM 节点渲染成图片,可是我将你这俩图片作为贴图放上去 WebGL 中,这等于将浏览器中用 C++ 写的东东在 JavaScript 里实现了一遍,渲染下行速率 肯定反而飞快,但倒是能用 GLSL 做特效来忽悠人。

硬件加速不等同于「快」,可是我居然硬件加速一定比软件快,那你该抽空人学计算机体系社会形态了

着实除了性能哪些地方的疑问,我认为在 Web 流更严重的哪些地方的疑问是功能缺失,比如 iOS 8 就新增 3000+ API,而 Web 标准时要漫长的编写和评审过程,根本赶不上,即便是 Cordova 原先自己封装也忙不过来,可是我为了更好地使用系统新功能,写 Native 代码是时要的。

代码转换流

前面提到写 Native 代码是时要的,但不同平台下的官方语言不一样,这会意味同样的逻辑要写两次以上,于是都不 人想到了通过代码转换的土最好的法子来减少工作量,比如将 Java 转成 Objective-C。

你这俩土最好的法子着实听起来都不 很靠谱,但它却是成本和风险都最小的,可是我代码转换后就能能 用官方提供的各种工具了,和普通开发区别不大,可是我无需担心遇到各种诡异的哪些地方的疑问,不过时要注意生成的代码算不算可读,不可读的方案就别考虑了。

接下来看看目前发生的几种代码转换土最好的法子。

将 Java 转成 Objective-C

j2objc 能将 Java 代码转成 Objective-C,据说 Google 内部人员可是我使用它来降低跨平台开发成本的,比如 Google Inbox 项目就号称通过它共用了 70% 的代码,效果很显著。

可是我许多人会着实奇怪,缘何 Google 要专门开发三个多多 帮助朋友写 Objective-C 的工具?还有媒体说 Google 做了件好事,着实吧,我着实 Google 这算盘打得不错,可是我基本上重要的应用都不 一起去开发 Android 和 iOS 版本,有了你这俩工具就意味,我就先开发 Android 版本,可是我再开发 iOS 版本。。。

既然都不 成功案例了,你这俩方案着实值得尝试,可是我关键是会 Java 的人多啊,能能 通过它来快速移植代码到 Objective-C 中。

将 Objective-C 转成 Java

除了有 Java 转成 Objective-C,还有 Objective-C 转成 Java 的方案,那可是我 MyAppConverter,比起前面的 j2objc,你这俩工具更有野心,它还打算将 UI 偏离 也暗含进来,从它已转换的列表中能能 看过还有 UIKit、CoreGraphics 等组件,使得某些应用能能 不改代码就能转成功,不过这点我不须看好,对于大偏离 应用来说不须现实。

可是我目前是收费项目,我越来越尝试过,对技术细节可是我了解,可是我这里不做评价。

将 Java 转成 C#

Mono 提供了三个多多 将 Java 代码转成 C# 的工具 Sharpen,不过似乎用的人无需 ,Star 才 118,可是我看起来不靠谱。

还有 JUniversal 你这俩工具能能 将 Java 转成 C#,但目前它并越来越发布公开版本,可是我情况报告报告还待了解,它的三个多多 特色是自带了简单的跨平台库,里面包括文件处理、JSON、HTTP、OAuth 组件,能能 基于它来开发可复用的业务逻辑。

比起转成 Objective-C 和 Java 的工具,转成 C# 的这俩个多多 工具看起来都非常不心智心智心智成熟期期 期,估计是用 Windows Phone 的人少。

将 Haxe 转成其它语言

说到源码转换就不得不提 Haxe 你这俩奇特的语言,它越来越自己的虚拟机或可执行文件编译器,可是我能能 了通过转成其它语言来运行,目前支持转成 Neko(字节码)、Javascript、Actionscript 3、PHP、C++、Java、C# 和 Python,尽管许多人实现了转成 Swift 的支持,但还是非官方的,可是我要想支持 iOS 开发目前能能 了通过 Adobe AIR 来运行。

在游戏开发方面做得不错,有个跨平台的游戏引擎 OpenFL 的,最终能能 使用 HTML5 Canvas、OpenGL 或 Flash 来进行绘制,OpenFL 的开发体验做得相当不错,同一行代码不时要修改就能编译出不同平台下的可执行文件,可是我是通过转成 C++ 土最好的法子进行编译的,可是我在性能和反编译方面都不 优势,可惜目前似乎并过高 稳定,不然能能 成为 Cocos2d-x 的有利竞品。

在 OpenFL 基础上还有个跨平台的 UI 组件 HaxeUI,但界面风格我着实有点硬丑,也就能能 了在游戏中用了。

可是我目前来看 Haxe 做跨平台游戏开发或许可行,但 APP 开发就别指望了,而基于它来共用代码着实就更不靠谱了,可是我熟悉它的开发者极少,反而增加成本。

XMLVM

除了前面提到的源码到源码的转换,还有 XMLVM 你这俩与众不同的土最好的法子,它首先将字节码转成本身生活基于 XML 的里面格式,可是我再通过 XSL 来生成不同语言,目前支持生成 C、Objective-C、JavaScript、C#、Python 和 Java。

着实基于三个多多 里面字节码能能 方便支持多语言,然而它也意味生成代码不可读,可是我可是我语言中的语法糖会在字节码中被抹掉,这是不可逆的,以下是三个多多 简单示例生成的 Objective-C 代码,看起来就像汇编:

XMLVM_ENTER_METHOD("org.xmlvm.tutorial.ios.helloworld.portrait.HelloWorld", "didFinishLaunchingWithOptions", "?")XMLVMElem _r0;XMLVMElem _r1;XMLVMElem _r2;XMLVMElem _r3;XMLVMElem _r4;XMLVMElem _r5;XMLVMElem _r6;XMLVMElem _r7;_r5.o = me;_r6.o = n1;_r7.o = n2;_r4.i = 0;_r0.o = org_xmlvm_iphone_UIScreen_mainScreen__();XMLVM_CHECK_NPE(0)_r0.o = org_xmlvm_iphone_UIScreen_getApplicationFrame__(_r0.o);_r1.o = __NEW_org_xmlvm_iphone_UIWindow();XMLVM_CHECK_NPE(1)...

在我看来你这俩方案相当不靠谱,万一生成的代码哪些地方地方的疑问基本越来越修改,也越来越调试代码,可是我不推荐。

小结

着实代码转换你这俩土最好的法子风险小,但我着实对于可是我小 APP 来说共享不了几个代码,可是我类事应用大多数围绕 UI 来开发的,大偏离 代码都和 UI 耦合,可是我公共偏离 无需 。

在目前的所有具体方案中,能能 了 j2objc 能能 尝试,其它都不 心智心智心智成熟期期 期。

编译流

编译流比前面的代码转换更进一步,它直接将某个语言编译为普通平台下的二进制文件,你这俩做法有明显的优缺点:

  • 优点
    • 能能 重用某些实现很比较复杂的代码,比如后后用 C++ 实现的游戏引擎,重写一遍成本太高
    • 编译后的代码反编译困难
    • 或许性能会好些(具体要看实现)
  • 缺点
    • 可是我你这俩工具本身生活有 Bug 或性能哪些地方的疑问,定位和修改成本会很高
    • 编译后体积不小,尤其是可是我要支持 ARMv8 和 x86 话语

接下来朋友通过区分不同语言来介绍你这俩流派下的各种方案。

C++ 类

C++ 是最常见的选折 ,可是我目前 Android、iOS 和 Windows Phone 都提供了 C++ 开发的支持,它通常有本身生活做法:

  • 只用 C++ 实现非界面偏离 ,这是官方比较推崇的方案,目前有可是我应用是越来越做的,比如 Mailbox 和 Microsoft Office。
  • 使用 2D 图形库来自己绘制界面,你这俩做法在桌面比较常见,可是我可是我界面都不 个性化需求,但在移动端用得还无需 。
  • 使用 OpenGL 来绘制界面,常见于游戏中。

使用 C++ 实现非界面偏离 比较常见,可是我这里就不重复介绍了,除了能提升性能和共用代码,还许多人使用你这俩土最好的法子来隐藏某些关键代码(比如密钥),可是我你我不知道怎么才能 才能 构建原先的跨平台项目,能能 参考 Dropbox 开源的 libmx3 项目,它还内嵌了 json 和 sqlite 库,并通过调用系统库来实现对简单 HTTP、EventLoop 及创建应用进程的支持。

而可是我要用 C++ 实现界面偏离 ,在 iOS 和 Windows Phone 下能能 分别使用 C++ 的超集 Objective-C++ 和 C++/CX,可是我还比较容易,但在 Android 下哪些地方的疑问就比较麻烦了,主要意味是 Android 的界面绝大偏离 是 Java 实现的,可是我用 C++ 开发界面最大的挑战是怎么才能 才能 支持 Android,这有本身生活做法:通过 JNI 调用系统提供的 Java 土最好的法子可是我自己画 UI。

第本身生活做法着实可行,但代码太冗余了比如三个多多 简单的函数调用时要写越来越多代码:

JNIEnv* env;jclass testClass = (*env)->FindClass(env, "com/your/package/name/Test"); 

// get ClassjmethodID constructor = (*env)->GetMethodID(env, cls, "", "()V");jobject testObject = (*env)->NewObject(env, testClass, constructor);methodID callFromCpp = (*env)->GetMethodID(env, testClass, "callFromCpp", "()V");

//get methodid(*env)->CallVoidMethod(env, testObject, callFromCpp);

那自己画 UI 算不算会更方便点?比如 JUCE 和 QT 可是我自己画的,朋友来看看 QT 的效果:

看起来很不错是吧?不过在 Android 5 下就悲剧了,可是我效果都没出来,比如按钮越来越涟漪效果,甚至边框都没了,根本意味在于它是通过 Qt Quick Controls 的自定义样式来模拟的,而都不 使用系统 UI 组件,可是我它享受能能 了系统升级自动带来的界面优化,能能 了自己再实现一遍,工作量不小。

反而可是我最后后开始英文用的是 Android 原生组件就哪些地方都不 时要做,可是我还能用新的 AppCompat 库来在 Android 5 以下实现 Material Design 效果。

最后本身生活做法是使用 OpenGL 来绘制界面,可是我 EGL+OpenGL 本身生活可是我跨平台,可是我基于它来实现会很方便,目前大多数跨平台游戏底层都不 越来越做的。

既然能能 基于 OpenGL 来开发跨平台游戏,算不算能用它来实现界面?当然是可行的,可是我 Android 4 的界面可是我基于 OpenGL 的,不过它并都不 只用 OpenGL 的 API,那样是不现实的,可是我 OpenGL API 最初设计并都不 为了画 2D 图形的,可是我连画个圆形都越来越直接的土最好的法子,可是我 Android 4 中是通过 Skia 将路径转换为位置数组或纹理,可是我再交给 OpenGL 渲染的。

然而要完整版实现一遍 Android 的 UI 架构工作量不小,以下是其中偏离 相关代码的代码量:

其中光是文字渲染就非常比较复杂,可是我你着实简单,那能能 了说明你没看过你这俩世界有多大,或许你知道中文有编码哪些地方的疑问、英语有连字符(hyphen)折行,但你算不算知道繁体中文有竖排版、阿拉伯文是从右到左的、日语有平假名注音(ルビ)、印度语有元音附标文字(abugida አቡጊዳ)……?

而相比之下可是我每个平台单独开发界面,看似工作量不小,但目前在各个平台下都不 有良好的官方支持,相关工具和文档都很完善,可是我着实成本没越来越高,可是我能能 给用户和系统风格保持一致的良好体验,可是我我认为对于大多数应用来说自己画 UI 是很不划算的。

不过都不 特例,对于 UI 比较独特的应用来说,自己画也是有好处的,除了更灵活的控制,它还能使得不同平台下风格统一,这在桌面应用中很常见,比如 Windows 下我就发现几乎每个必备软件的 UI 都不 太一样,可是我好多都不 换肤功能,在你这俩情况报告下很适合自己画 UI。