Android Dalvik VM vs. Java VM

Google Android 開發團隊為了技術自主、迴避 Java 商標爭議等考量,建構了嶄新的 Dalvik Virtual Machine,骨子裡頭仍支援 Java 程式語言,但 Dalvik VM 設計稍異於典型 JVM,網路上已有豐富的比較,本文就不贅述,筆者想探討的,則是日本 eFlow 公司最近提出的 'Android™'s Dalvik VM on "Mobile Java"',目標就是讓原本的 Java 執行平台 (主要是 Java ME),得以運作針對 Android Dalvik VM 設計的應用程式。日前該專案已開放原始程式碼,主體依據 GNU GPLv2,以下是相關資訊:

目前的進度來說 (svn r22),支援以下功能:
至於是否能達到 eFlow 公司 CEO -- Koichi Makabe 所預期的效益:
"We believe this implementation will particularly benefit manufacturers currently developing Android-powered devices, with a number of which we are cooperating to port the Dalvik VM to their specific hardware and software architectures. By making this implementation available today as open source, and by accelerating our porting and development efforts, we have the firm intention to make a significant contribution to the broader Android community."
這裡無從得知,不過,該專案四月底時,一併將 dalvikvm_benchmark 釋出,伴隨內部的效能分析數據,非常有意思。從裡頭的資料來看,標的硬體平台有兩個:
前者無疑就是用來比較的基準,硬體是 Qualcomm 平台,軟體組態當然是跑 Dalvik VM,運作時脈為 528 MHz。後者就相當有意思,P905i 是日本 NTT 電信的第三代手機平台,以豐富的多媒體與超長待機時間著稱,硬體採用 Panasonic UniPhier 家族,運作時脈達 500MHz,軟體方面,則內建 JBlend 這個商業 Java ME CLDC/MIDP 執行環境。儘管軟硬體組態均大相逕庭,不過研究 android-dalvik-vm-on-java 提供的內部的效能分析數據,多少有參考的價值。筆者整理為以下圖表:
綠色部份 (靠右側者) 為 Google Dev Phone 1,紅色 (靠左側者) 則是 P905i,分數越高者越佳。在同一份 benchmark 測試方式來看,兩者有極為顯著的落差,整體表現數據為:
數字背後的意義則是,Dalvik VM 進一步優化的空間仍相當大,至於如何在 ARM11 平台,透過若干進階的技巧 (JIT, register allocation, ...),發揮 Dalvik 這個 register-based VM 的效能,是不少研究人員關心的議題。

read on
Posted 張貼者: jserv 於 下午10:04 on 2009年5月10日 星期日 | 2 意見
Filed under: , , , ,
 

Android 上的原生 OpenGL/ES

olv 日前在「一千零一夜之 Android Binder」一文提及:

surface manager 可以準備一塊 surface,把 surface 的 fd (一塊 ashmem 記憶體) 傳給一個 app,讓 app 可以在上面作畫。有了這層理解,我們對 android 可以有更自由的發揮,例如,可以不改一行 cairo 的程式碼,就利用 cairo 與 c++ 寫出一個會動的時鐘
而 Surface manager 顧名思義,就是管理邏輯上眾多的 surface,其底層對應於 OpenGL|ES 的實做。透過 surface 的處理,我們可讓像 fdclock 這樣原生 (native) 的 C 語言程式,透過同樣在 GNU/Linux 上原生的 Cairo 函式庫,無痛的顯示處理。這實在很吸引人,畢竟若能在 Android 平台充分重用 GNU/Linux 既有的軟體功能,會是多麼有趣的事。且讓我們思考是否能在 Android 上撰寫 C 語言的 OpenGL/ES 應用程式。

Android 已提供初步的 OpenGL/ES 封裝,實做則是透過 agl (Android OpenGL) 底層的 PixelFlinger 與 GPU。關於 Java 部份的 OpenGL APIs 操作,可參閱原始程式碼 frameworks/base/opengl/java/android/opengl/GLSurfaceView.java ,不過現在只看 C 程式的部份。動態連結函式庫必須連結到以下三者:
  • libEGL : OpenGL/ES APIs
  • libGLESv1_CM : Reference implementation
  • libui : Android UI framework (native)
準備好我們的程式碼之後,其建構過程如下:
$ . build/envsetup.sh
$ cd angeles-test/
$ mm
make: Entering directory `/home/jserv/Myth/mydroid'
target arm C: angeles-test <= /home/jserv/Myth/mydroid/angeles-test/demo.c
...
參考的螢幕顯示如下:

不過,在模擬器顯示的狀況會比實體遜色頗多,可見到相當嚴重的重繪動作,但基本上是可用的。

read on
Posted 張貼者: jserv 於 下午5:26 on | 0 意見
Filed under: , ,
 
Developer at 0xlab.