设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 开源资讯 查看内容

RoboVM 1.0发布—商业许可和新功能介绍

2015-5-3 18:26| 发布者: joejoe0332| 查看: 3404| 评论: 0|原作者: 伯松, ZodiacX, 何传友, 无若, BreakingBad, Parser7SParser, 社会主义好, epiclight|来自: oschina

摘要: 经过数月的艰苦工作我们很自豪的宣布我们的第一个稳定版 RoboVM 1.0 发布了!如果没有优秀的社区给予我们反馈、缺陷的追踪,这是不可能实现的。深深的感谢2000多个测试版的订阅者的贡献! ...

  经过数月的艰苦工作我们很自豪的宣布我们的第一个稳定版 RoboVM 1.0 发布了!如果没有优秀的社区给予我们反馈、缺陷的追踪,这是不可能实现的。深深的感谢2000多个测试版的订阅者的贡献!


RoboVM 1.0 Released – Commercial Licenses & A Look under the Hood


  随着1.0的发布,我们希望我们的社区能够更深一步的壮大。基于此,我们将会揭开RoboVM的面纱,让新加入者对RoboVM是什么,它如何工作,以及我们推出它的动机有一个清晰的了解。如果你想了解更多信息,请查看 “什么是 RoboVM?”


更新了啥?

 1.0版本出现了很多新特性并修复了许多bug:

  • 调试器经历了新一轮的更迭. 所有JDWP功能现在都实现了.

  • 支持 RAM级磁盘缓存.这对于慢速硬盘来说能够帮助加速编译和链接。

  • 支持HFS+ 文件压缩。所有放入缓存的文件都是压缩的,深入加速编译同时还减少了RoboVM 所需缓存空间的大小。

  • 初始化的工程模板 且支持Maven原型。

  • 新的Eclipse工程向导,使用了模板工程。es project

  • 支持通过robovm.xml调用工具。当前支持TextureAtlas , 将来还有更多。

  • 清理并简化了Objective-C绑定,详细看绑定状态页


商业授权的发布

  首先:对于用户来说,我们以开源软件为核心是没有什么改变的!你能够在无任何人为限制的情况下继续的新建软件,并且无任何的花费。在新的商业授权下,我们增加了针对开源版的方便性操作以及支持性服务。这能够支持我们继续的开发免费的开源内核,并且这能够支持整个项目的长远发展。


  我们的商业授权能够根据你的业务规模进行调整,包括了个人开发者,初创企业,中小企业和大型企业。根据你的规划,你可以得到以下的特性和服务:

  • 模拟器或真实设备的调式都使用JDWP兼容调试器

  • 改进的崩溃报告

  • 有无服务等级协议都会得到私有的e-mail服务支持

  • JavaFX的支持

  • 补丁支持

  • 内测通道以获得新的商业特性

完整的价格信息在 http://www.robovm.com/buy.

在过去的几个月,有超过2000名开发者订阅了我们的测试版的程序。你们提供的反馈是无价的。对你们的感谢也不会仅是一句谢谢!


  所有的测试用户都可以用半价获得一份个人开发型或初创公司级别的授权(需一年的订阅)! 请使用您的e-mail地址登录试用 测试版。我们会在14天内把带折扣的授权回复于你。


下一步计划是?

  1.0 版本的发布对我们来说是一个重要的里程碑。但是我们离成功还有很长的路要走。我们会继续之前的快节奏的版本发布,下面的特色已经包含在不久将来的开发计划中:

  • 改进文档,用户指南和录制视频

  • 集成Intellij IDEA & Android Studio, 一个初步的基于Gradle的插件已经可用

  • 集成界面生成器(商业功能)

  • 支持扩展(动态库)以支持周边设备如苹果手表

  • 支持静态RoboVM到Objective-C应用的链接

  将来会是激动人心的时刻! 对于所有的这些,让我们一起来揭开RoboVM的面纱。


RoboVM是啥?

  在Trillian 手机上,我们真的很喜欢JVM生态系统. 有许多丰富强大的IDE, 生成体系,适合各种口味的语言,还有巨多的第三方库。我们认为这是身边最高产的环境。但这么多年过去了,JVM生态系统却逐渐退出了客户端,要么更好要么更坏(还有人记得applet吗?)。比起Android,客户端Java是一个东西,但那仅仅是两大手机平台阵营之一。


  我们对于 RoboVM的寄托就是让其成为后端、Android以及iOS之间的桥梁。我们想要统一数以百万计的JAVA, Scala, Kotlin, Groovy 和 Clojure上开发者的工作流,如此一来他们就可以使用他们的工具和技术为每一个平台创建真真的本机应用。


  为实现这一目标,RoboVM 平台需要如下组件:


  所有这些组件允许你编写原生的 iOS 应用程序,共享 Android 后端代码,在一个健全的构建和测试环境中,让你快乐的开发,除了调试器,所有的组件都是开源软件,可修改并提交到 Github!


  RoboVM核心采用 AOT 预编译。JVM 通常采用 JIT 即时编译器。JVM 字节码加载到运行时并翻译为机器码。苹果公司不允许在 iOS 系统中采用 JIT 即时编译器,内存分页不能被设置成可执行的。为此,RoboVM 需要你把 APP 转换成部署设备可执行的 Java 字节码。因此,RoboVM 运行时不能记载字节码,是 RoboVM 众多优点中唯一的缺陷。


  以字节码作为输入,RoboVM 并不关心字节码是由谁产生的。你可以使用 Java、 Scala、 Groovy、Kotlin,、Clojure 或其它 JVM 语言编译产生的字节码提供给 RoboVM 编译器,它将编译成本地代码。这是通过使用类似 J2Objc 进行对比处理完成的,通过使用 Java 源码而不是字节码,并且把它翻译成等价的 Objective-C 代码。无需依赖源代码就能轻易的集成第三方 JAR。


  作为编译处理的第一步:RoboVM 通过 Soot 解析类字节码文件,Soot允许我们把基于stack-machine 的JVM字节码翻译成更易于管理的3-address代码,这个过程称为 Jimple。我们在这个Jimple 代码中做了许多优化和简化:例如清除无用代码。


  一旦我们把所有的 Jimple 转换做完,我们就能够应用自定义转换,这样我们就可以支持 java 8 的特性,例如 lambda,而且我们的名为 Bro 的自定义绑定桥,具有简单可靠的 C 和来源于 java 的Objective-C 接口。




  做完这些转换之后,我们将大幅修改后的 Jimple 转换到 LLVM-IR。LLVM 是使用 Clang 的编译器基础架构,可以编译 C,C++ 和 Swift,还有其它一些语言。通过使用 LLVM,我们得到了与这些“本地”语言相同的好处:对广泛的CPU架构例如 x86,x86_64,ARM thumb v7 和 ARM 64-bit 等高度优化的参数。LLVM-IR 在手,我们就可以生成特定架构的汇编文件,然后就可以组装成最终的目标文件。


  由于编译器采用模块化方式, 我们可以添加插件改变编译的过程。 其中一个插件,允许我们把DWARF 元数据添加到 LLVM IR 中, 由此可以得知局部变量在堆栈中的位置, 或是在什么地方插入调试指令


  由于一个类文件会编译成一个对象文件, 编译是一件很耗时间的事情。所以RoboVM 采用的是渐进式编译: 只有在上一次编译过后,有修改过的文件才重新编译。编译出来的对象文件会被缓存起来, 以便再次使用。


  盲目的编译项目 classpath 中指定的类文件并不是一个明智的选择。只要给出一个 main 类作为入口点,RoboVM 就能自动算出实际用到哪些类。我们甚至可以通过tree-shaking(一个我们正在探索的新领域) 这种技术减少编译的类,方法和字段的数量。


  对于使用一个关联项目中的所有对象文件,我们能连接最后的可执行文件。Robovm 允许你轻易地指定任何外部的原生框架或者你想要连接的库,或者通过在代码中的注释或者项目配置非系统框架和库的文件。我们也需要连接 ROBOVM 的运行时间,包含像 GC,调试支持,本机代码类库等等。


  单独的可执行文件是不够的,因此,ROBOVM 也将带给你所需要的任何资源,可选择性地通过诸如TextureAtlas 工具运行它们,并且编译最终的应用程序包,准备提交到App store。


运行时

  一个虚拟机需要一个运行时来提供初级服务处理用户代码。这些服务包括垃圾回收机制,多线程,反射等等。让我们来看看Robo虚拟机的运行时吧。


  Robo虚拟机的运行时一个核心功能是垃圾回收机制(GC)。Robo虚拟机使用Boehm-Demers-Weisser 垃圾回收机制,一种最开始被用在C或者C++语言上的保守的垃圾回收机制,它扫描用来保存托管数据的指针的堆栈和寄存器 。这个听起来不是最佳处理方式,但调整和优化后Boehm垃圾回收机制能成为相当不错的垃圾回收机制。


  Robo虚拟机这样调整优化了Boehm垃圾回收机制,它工作在精准模式。GC不用盲目的扫描大量的堆栈,相反它依赖一些额外的信息。通过这种方式,GC只需要扫描部分堆栈和寄存器,这样大幅提供了性能。在这这外,我们还能本地线程分配,意味着分配内存给一个对象时我们不用使用全局锁。最终,我们能并行的标记和擦除,将GC负载分配给多个线程,减小GC延迟。


  运行时一直负责提供反馈。在标准的 JVM 中,一个 RoboVM 的可执行文件存储的所有信息需要提供整个反馈的能力,包括方法调用和 proxies。我们为之后的两个特性使用一些汇编的技巧,它让 RoboVM 有 Java 字节码般的运行时能力。


类库

  Java广泛的扩展标准类库是众所周知的。任何你的应用中第三方库依赖,你都希望这些类库是标准库。RoboVM 采用了来自安卓的类库,它是现在已不存在的 Apache Harmony 一个分支。这意味着任何第三方库可以工作在安卓上也可以工作在 RoboVM 上,除了那些安卓的特殊 API,例如安卓的UI层。


  在 iOS 系统中期望能够直接引用 Android 类库,但这并不能正常运行。正常的 Android 类库不仅包含 Java 代码,还包含与系统服务相关的接口,例如文件系统接口。同时有大量的本地 C/C++ 代码通过 JNI 的方式提供给 Java 使用。


  因此我们不得不一步步推进,使那些Android本地编译代码正常运行在 iOS 系统上。按理来说 Android 和iOS 都符合 Posix 标准。但现实情况是,在涉及到类似网络和多线程的标准中有稍许不同的解释说明。


  一个标准的类库必须是稳定的,特别是当你将它移植到新的操作系统上的时候,我们通过运行3套巨量且适当的测试用例,用于保证类库和那些依赖于虚拟机的功能是正常可以被使用的。这些测试用例需要从最初的 Apache Harmony 到 Android Dalivk/ART 运行时上运行。


绑定(The Bindings)



  使用 RoboVM,我们希望你能编写本地应用去替代你的web视图(webview)UI。这意味着你需要有完整地访问IOS框架的需求并实现你的UI,与硬件的接口一起使用的服务诸如app内的付款和通知。过去,JVM接口与本地码通过 Java Native Interface 调用 C/C++/Objective-C 代码,这是一种非常麻烦的方式。


  我们希望更简单一些,性能更好一些。这就是为什么我们带来了Bro,我们的客户使用它作为Java与本地码之间的桥梁( Java-to-native)。Bro的灵感来自于 JNA 还有其他类似的 JVM 解决方案,就像 .NET 的 p/invoke 一样。


  有了 Bro, 你就可以用 annotation 把 C 或 Objective-C 写的 API 打包到纯 Java 代码里头。下面这个例子可以用来访问 abs() 的原生代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.robovm.rt.bro.*;
import org.robovm.rt.bro.annotation.*;
 
@Library("c"
public class Abs {
    static {
        Bro.bind(); 
    }
    @Bridge private static native int abs(int i); 
    public static void main(String[] args) {
        System.out.println(abs(-100));
    }
}

@Library 告诉编译器要链接哪个库或框架。 @Bridge 告诉编译器方法 abs 绑定的是名字相同的 C 函数。


  这只是冰山一角。  RoboVM 能自动收集 Java 和原生代码之间复杂的数据类型。当然,你还可以绑定 C 的结构体, Objective-C 的类, 通过这些东西,就能完全访问 iOS 的框架和 API。 甚至可以继承  Objective-C 写的类!


  Bro 能让你以简单自然的方式使用 iOS 的框架和 API 。像绑定 iOS  框架和 API 这些繁重的工作, 我们已经解决了。下面看一个自定义视图控件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MyViewController extends UIViewController {
    private final UIButton button;
    private final UILabel label;
    private int clickCount;
 
    public MyViewController () {
        // Get the view of this view controller.
        UIView view = getView();
 
        // Setup background.
        view.setBackgroundColor(UIColor.white());
 
        // Setup label.
        label = new UILabel(new CGRect(2025028044));
        label.setFont(UIFont.getSystemFont(24));
        label.setTextAlignment(NSTextAlignment.Center);
        view.addSubview(label);
 
        // Setup button.
        button = UIButton.create(UIButtonType.RoundedRect);
        button.setFrame(new CGRect(11015010040));
        button.setTitle("Click me!", UIControlState.Normal);
        button.getTitleLabel().setFont(UIFont.getBoldSystemFont(22));
 
        button.addOnTouchUpInsideListener(() -> {          
           label.setText("Click Nr. " + (++clickCount));
        });
        view.addSubview(button);
    }
}

  MyViewController 类继承Objective-C 类的子类 UIViewController! 其余的代码流程,尤其是对于 Java 8 lambdas 来说再自然不过了。




  RoboVM会一直兼顾与Objective-C 自动引用计数(Automatic Reference Counting (ARC)) 的相互作用机制。RoboVM会做“正确的东西”,所以你不必想它太难。你需要与ARC交互,RoboVM可以让你做到这些。


  绑定到iOS框架和API后会半自动生成。如果你希望为一个存在的iOS库创建一个绑定,你应该使用我们的绑定生成器并根据你的需要修改,迄今为止,我们已经覆盖了所有iOS8.1框架和API的98%。


  现在,并不是每一个场景都可以写两个单独的UI层。尤其是在企业中,对快速得到结果有需求,对UI本地观感可以折中,在这个使用案例中,我们在iOS和安卓平台上提供JavaFX。这个方法允许你在两个平台上100%共享你的代码。我们的合作伙伴LogdON确保JavaFX能工作在iOS和安卓平台。


调试器



  RoboVM 商业许可证允许你对 Java 调试线协议(JDWP)兼容调试器的访问。JDWP 允许你从 IDE 内部调试 Java 进程。同时RoboVM 支持 JDWP,因此你可以调试这两个应用程序模拟器与设备。使用你曾经使用的工具。


  RoboVM 的实现,一个软件调试器:在特定的安全点上,运行时配合调试器;在用户代码中实现线程暂停,步进,断点和内存检查。在调试模式中,应用程序将通过 TCP 监听命令来旋转一个额外的线程。在另一边的 TCP 通道正坐落着我们的 JDWP 服务器,实现我们自定义的顶部协议以及最小的调试协议。


  诸如 GDB 与 LLDB 使用 OS 服务控制进程的替代。实际上,我们从一开始就着手对 LLDB 使用的调查,而不是直接决定反对它。首先,LLDB 是以流程为中心:如果一个线程停止,那么所有别的线程同时也停止。这不兼容 JDWP 的线程中心模式:你可以停止一个或者更多的线程,同时剩下的线程继续运行。决定反对 LLDB 的第二个原因是我们的 JDWP 服务器将必须通过 LLDB 来接管进程。这将避免你调试你的应用程序的本地端,同时也是调试 Java 端。就目前来看,你可以同时从你的 Java Ide 以及 XCode 来调试你的应用程序!


  RoboVM 调试器允许你能够使用一个正常地 JVM 调试器来编写任何东西:暂停/恢复线程,设置(条件)断点,步进/出/源代码行,在运行时通过 Eclipse 的显示视图或者 Intellij IDEA 的“看表情”对话框来修改变量和调用方法,等等。所有的这工作都是在模拟器上和设备上运行。


IDE 集成

data/attachment/portal/201505/03/182303bu2nxw6cj3v6hh4n.jpg

  在 Robovm 之上运行的最大原因之一是把 JVM 周围的模具带到 iOS。


  在过去的一年里,我们已经关注当前默认开发环境中的 Eclipse。我们 Eclipse 插件(更新url: http://download.robovm.org/eclipse/)支持这两个简单创建的控制台和 iOS 项目。它集成调试和对于一个顺利发展经验的 JUnit 支持。你也可以使用 Gradle 或者 Maven 对 Eclipse 来构建和持续集成。


  Android 已经完全转换成基于 JetBrain 的 Intellij IDEA 之上的 Android Studio,我们已经准备了一个 RoboVM Intellij IDEA 插件的初始版本并且正在努力把它当作 Eclipse 插件来使用。我们认识到支持 IDEA 与 Android Studio 的重要性,特别是在进行跨平台开发的时候。在即将到来的几周内,期待这个领域有更多新鲜事情发生。


  最后,还有一些集成 NetBeans 相关的社区工作。


  在所有功能实现后,我就能完美结合苹果公司提供的工具。现阶段我们的全部工作集中在整合界面生成器上,一旦完成就可以非常容易的创建 UI 视图。整合后的界面生成器将成为一个商业功能,计划于2015 年发布。


集成构建系统



  RoboVM 支持多种构建系统,对于其中的困难,我们就交给 RoboVM 处理,你可以像其它编译器一样通过执行命令进行编译。这样你就可以使用shell脚本,整合RoboVM编译器,用于生产环境。

  然而,我们强烈的建议使用已经建好的编译系统!我们创建了专门的 Maven 插件 ,正如 Gradle 插件一样,能让你们的生活相当容易。

  进一步,我们提供的项目模板同 IDE 集成一样也包含了 Maven 原型,建立的不再仅仅是 iOS 项目,同时也是跨平台的,可用于 iOS 和 Android 项目。


接下来怎么办?

  现在,你应该已经对RoboVM 有了一个相当的了解,它如何能帮助你。如果我们激起了你的兴趣,前往我们的文档页面,并立即开始使用!


  如果你只是想要查看一下代码,我们建议通过我们的苹果示例应用模版进行查看。

  最后,如果你还不满足,你可以从 Github上获得 RoboVM 源码!


关于RoboVM

  RoboVM 开源项目的目标是使Java和其它JVM语言运行在iOS平台上。RoboVM能够将Java字节码翻译成ARM或X86机器码,直接运行在CPU上无需解释字节码。它的运行环境包括一个基本的Android类库和Java到Objective-C桥,使Java或其它JVM语言能够容易使用本地IOS Cocoa Touch API。


联系方式:

Web site: http://www.robovm.com
GitHub: https://github.com/robovm/robovm
Google Groups: https://groups.google.com/group/robovm
Twitter: https://twitter.com/robovm


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部