RoboVM 1.0 釋出 —— 商業許可和新功能介紹

oschina發表於2015-05-01

經過數月的艱苦工作我們很自豪的宣佈我們的第一個穩定版 RoboVM 1.0 釋出了!如果沒有優秀的社群給予我們反饋、缺陷的追蹤,這是不可能實現的。深深的感謝2000多個測試版的訂閱者的貢獻!

隨著1.0的釋出,我們希望我們的社群能夠更深一步的壯大。基於此,我們將會揭開RoboVM的面紗,讓新加入者對RoboVM是什麼,它如何工作,以及我們推出它的動機有一個清晰的瞭解。如果你想了解更多資訊,請檢視 “什麼是 RoboVM?”

RoboVM 1.0 釋出 —— 商業許可和新功能介紹

更新了啥?

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 1.0 釋出 —— 商業許可和新功能介紹

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 1.0 釋出 —— 商業許可和新功能介紹

使用 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() 的原生程式碼:

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));
    }
}

@Libraryannotation 告訴編譯器要連結哪個庫或框架。 @Bridgeannotation 告訴編譯器方法 abs 繫結的是名字相同的 C 函式。

這只是冰山一角。  RoboVM 能自動收集 Java 和原生程式碼之間複雜的資料型別。當然,你還可以繫結 C 的結構體, Objective-C 的類, 通過這些東西,就能完全訪問 iOS 的框架和 API。 甚至可以繼續  Objective-C 寫的類!

Bro 能讓你以簡單自然的方式使用 iOS 的框架和 API 。像繫結 iOS  框架和 API 這些繁重的工作, 我們已經解決了。下面看一個自定義檢視控制元件的例子:

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(20, 250, 280, 44));
        label.setFont(UIFont.getSystemFont(24));
        label.setTextAlignment(NSTextAlignment.Center);
        view.addSubview(label);

        // Setup button.
        button = UIButton.create(UIButtonType.RoundedRect);
        button.setFrame(new CGRect(110, 150, 100, 40));
        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 1.0 釋出 —— 商業許可和新功能介紹

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 整合

RoboVM 1.0 釋出 —— 商業許可和新功能介紹

在 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 1.0 釋出 —— 商業許可和新功能介紹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。

相關文章