2012年8月26日 星期日

node.js for Android

這是我給自己練習NDK的作業,選擇node.js的原因是, 沒啥, 就只是覺得應該會蠻好玩的, 之前就有念頭想po, 加上node.js所需要的像是openssl, v8等等, 在Android上早就有了, 想說porting應該也不會有太大的困難吧, 應該也不用改太多code才對

實際是,還是有點問題, 需要改些東西, ndk的build system可以說是原本Android的簡化版, 所以有些東西並沒有, 所以並不是把原本的Android.mk copy過來就沒問題了, 比如說v8, LOCAL_GENERATED_SOURCES, intermediates 這些東西雖然有在原本aosp的build system內, 但在NDK就完全不存在, 但由於v8和node都有需要把js lib轉成CPP一起build進去, 所以這時候就要借助這類的東西:
$(shell python $(JS2C_PY) $(GEN1) CORE off $(LOCAL_JS_LIBRARY_FILES))

起初我並沒注意到js2c這部份, 結果最後link不過, 缺了一堆東西, trace之後才發現少這部份

此外, 在uv的部份, 由於uv是node的native library的部份, 有一些OS相關的code, 但由於Andorid的bionic比起libc是算簡化版本, 有些API並不存在, 因此除了為android產生一些專屬的config.h (我從linux的版本去改的), 還要改一些code

目前的進度是, 可以用ndk-r8b build出Android可用的可執行檔(還沒完全測過, 應該有些bug代解), 先全用static link的

Source codes放在GitHub : https://github.com/julianshen/node-android

還有一些想做的還沒做:
  1. 接上NativeActivity
  2. 透過AssetManager存取js files
  3. OpenGL ES apis
  4. Android apis
  5. 其他? (Packaging tools and etc..)

2012年8月10日 星期五

Firefox OS on HTC Sensation

目前放出來的Firefox OS (https://github.com/mozilla-b2g)好像也就只有Samsung的手機....一來不想用Samsung的手機來玩, 二來用emulator沒fu, 再來就是也好久沒玩玩這種硬東西, 就打算拿手邊的Sensation來自己PO, 好久沒玩這種東西有點生疏, 繞了很多冤枉路, 最後發現, 其實也不難

Firefox OS是基於Android 4.0 ICS, 所以照理說有支援ICS的裝置應該是沒問題才對, 所以就打算從CM9 (Cyanogenmod 9)的source來po, 至少它已經把ICS這段做完了

以下是我抓來用的source:
For HTC Sensation (使用Qualcomm msm8660):
https://github.com/CyanogenMod/android_device_htc_pyramid
https://github.com/CyanogenMod/android_device_htc_msm8660-common
For Qualcomm hardware:
https://github.com/CyanogenMod/android_hardware_qcom_display
https://github.com/CyanogenMod/android_hardware_qcom_gps
https://github.com/CyanogenMod/android_hardware_qcom_media

還有改了一些東西, 像是"frameworks/base/libs/ui/" 裡的東西, 不過實際改了哪些, 還沒整理(也很懶), 就有點忘了, 反正就讓這些build過, 然後讓"b2g"可以成功的跑起來, 差不多這樣就夠了

一開始把system.img燒進去後, 發現不能正常開機, adb一直說找不到/system/bin/sh, 我裝了4ex recovery去看, 居然無法mount system partition, 所以我就改變策略, 想說做成update package來安裝, 但build update package時發現, b2g做了些手腳, 像是把java導到一個fake java去, 使得我沒辦法順利build 出update package, 所以再動了些手腳, 把東西做出來, 然後用4ex recovery format system partition之後從SD card裝update package (這個我動過手腳重包過, update script裡面會刷full的system image), 但重開機後...黑屏.....看log研究一下發現, 我一開始只放了device目錄裡面的東西, hardware目錄裡面的東西都沒放, 所以build出的東西缺少了qualcomm的lib, 所以又去抓來重build, 但後來黑屏還是沒解掉.....但卻發現一點...之前燒進去的system image之所以有問題似乎是Sensation的hboot似乎不吃sparse image, 所以最後用simg2img (build好的host binary可以找到) 轉成一般的image改用zip燒, 所以就又放棄update package這條路 

接下來是我這整個過程中我幹的最蠢的事, 開機可以成功, 但卻一直是黑屏, 一直搞不懂到底哪出了問題, 還抓了kernel source, 一路從底下看到b2g....framebuffer也dump出來看, 一切都沒問題呀!今天, 終於發現, 我少做了最後一個步驟!

我忘了install Gaia了(以下步驟):
cd B2G/gaia
GAIA_DOMAIN=foo.org make install-gaia
我是怎發現的?因為我後來自己build emulator...也是黑屏呀...想說到底哪不對, 連emulator都打算去trace了....後來查了一下才發現, 我還真的少做這步驟呀....浪費了好幾天.... orz

反正成功了.... update package那條路搞不好也是通的, 其實這樣一來應該不用做full image, 做一包來patch應該也ok, 搞不好就只需要改init.rc跟放/system/b2g/的東西再install gaia就好了....不過也懶得試了....之後再說吧.....