Moblin的全稱“嵌入式Linux系統發展計劃”,以啟動MID和其他面向消費者設備的目標使用模型。對於移動終端設備,用戶體驗是至關重要的,比如iPhone的風靡,界面的好壞直接影響到產品的銷售。
由於個人對ubuntu的偏愛和熟悉,下面的開發過程無論主機環境還是moblin的平台都采用的是ubuntu,然而,moblin 2.0貌似不再使用ubuntu,而僅支持fedora,不知何故。
啟動MIC,Platform選擇memlow-lpia-ubuntu-hardy,target選擇ububtu-mobile,自動生成即可,等待的時間那叫一個長啊。這也是工具的好與不好,之前敲命令,交叉編譯了Gnome Mobile框架的幾乎所有模塊,吃盡了苦頭,但不至於閒著沒事干;而由工具自動生成呢,清閒了很多,也不太關心編譯的細節,就是盼著趕快編完,好做測試。接下來,生成Image文件,選擇Live RW USB。
此時以為大功告成了,點擊Launch VM,沒有反應...郁悶阿。Google,運行KVM需要CPU支持Intel VT才行,手頭又沒有MID,那就試試Qemu吧。把編成的映象文件(Launch VM時選擇的文件)直接扔給Qemu,結果“checking device /dev/sda for installation source...”,問題出在哪呢,把映象文件掛到本地也沒有看出個所以然,其實,Qemu無法直接跑出畫面也在預料之中(此處Qemu的使用可能存在問題 qemu -hda moblin.img)。由於內核、文件系統由MIC生成,使得很多處理的細節無法得知,但編譯的文件總是存在的吧,我想完全可以根據MIC生成的文件來創建Qemu仿真所需的文件。內核可以在${Project Name}/targets/${Target Name}/fs/boot中找到,主要的工作是建立根文件系統的ext3文件:
dd if=/dev/zero of=1G.img bs=1M seek=1000 count=0
mkfs.ext3 1G.img
sudo mount 1G.img ${Mount Dir} -o loop
接下來就比較簡單了,拷貝${Project Name}/targets/${Target Name}/fs下的所有內容到${Mount Dir},根文件系統就算形成了(沒用的內容請刪掉,我的目錄下有內核的連接)。
使用以下命令進行仿真:
qemu -kernel vmlinuz-
linux啟動過程一切順利,提示輸入用戶名和密碼...再次掛載根文件系統1G.img,刪掉shadow?還是用文明一點的辦法吧,拷貝本機/etc/shadow到${Mount Dir}/etc。再次啟動,得到了shell,可還是沒有圖形界面(如果MID需要手工啟動X,感覺有點多此一舉,問題可能出在配置上,沒有深究,跑起X再說)。沒有/etc/init.d/gdm,還是startx吧,令人沮喪的事再次發生,“(EE):no valid modes found”。沒辦法,只能再次掛載根文件系統,添加Modes “800x480”(僅僅是我添加的模式,不知是否支持其他)。總算見到畫面了,也許是費了些周折的緣故吧,覺得Moblin的界面還是很漂亮的。
使用同樣的方法,可以用Qemu對其他Platform進行仿真(沒有一一驗證,測試過netbook-lpia-moblin2)。
之所以選擇Python,首先,易於移植,Python解釋器把源代碼轉換成字節碼,然後再把它翻譯成機器語言並運行,不需要擔心如何編譯程序,如何連接到正確的庫等等,只需要把Python程序拷貝到目標機上,它就可以工作了;其次,最近一直在寫Python,覺得它可以快速地把想法變成現實,就懶得用C了;最後呢,Python是一種極其流行的解釋性語言,我們可以看到在Gnome Mobile的原型中也保留了Python的編程接口。
Python提供了系統調用、線程、GTK等模塊,可以利用它搭建原型,驗證想法的可行性,當然,它也可以極其方便的應用到Moblin平台的開發。開發應用程序之前,配置環境必不可少,毫無疑問,使用的工具是 Moblin Image Creator,需要保證所需的工具以及庫已經安裝,包括Python,核心的模塊(python-dbus python-gtk2 python-hildon),由於之前選擇的平台是ubuntu,只需要用apt-get就可以輕松的安裝這些包了。此時,在moblin上開發Python的環境以及基本建成了。接下來,在桌面上創建圖標,並啟動相應的Python程序,毫無疑問是Hello World。包括幾個文件:py-hello-world,py-hello-world.desktop,py-hello-world.png, org.moblin.pyhelloworld.service,內容比較簡單就不做解析了。
1 拷貝py-hello-world.png到${Mount Dir}/usr/share/mobile-basic-flash/icons
2 拷貝Python程序py-hello-world到${Mount Dir}/usr/bin
#!/usr/bin/python
import dbus, dbus.service, gtk, hildon
class DBusObject(dbus.service.Object):
def __init__(self, app):
self.app = app
self.name = 'org.moblin.pyhelloworld'
self.path = '/org/moblin/pyhelloworld'
bus_name = dbus.service.BusName(self.name, bus = dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name, self.path)
class HildonHelloWorld(hildon.Program):
def __init__(self):
self.dbus_obj = DBusObject(self)
hildon.Program.__init__(self)
self.window = hildon.Window()
self.add_window(self.window)
self.window.set_title("Hello World")
self.window.connect("destroy", gtk.main_quit)
label = gtk.Label("Hello World! (hildon)")
self.window.add(label)
self._add_menu()
self._add_toolbar()
self.window.show_all()
def _add_menu(self):
menu = gtk.Menu()
mnuItmQuit = gtk.MenuItem("Quit")
mnuItmQuit.connect("activate", gtk.main_quit)
menu.add(mnuItmQuit)
self.set_common_menu(menu)
def _add_toolbar(self):
toolbar = gtk.Toolbar()
tlbItmQuit = gtk.ToolButton(gtk.STOCK_QUIT)
tlbItmQuit.connect("clicked", gtk.main_quit)
toolbar.insert(tlbItmQuit, -1)
self.set_common_toolbar(toolbar)
toolbar.show_all()
def run(self):
gtk.main()
if __name__ == "__main__":
app = HildonHelloWorld()
app.run()
3 拷貝py-hello-world.desktop到
${Mount Dir}/usr/share/mobile-basic-flash/applications
[Desktop Entry]
Version=1.0
Type=Application
Encoding=UTF-8
Name=Hello World
Icon=py-hello-world
Exec=py-hello-world
Categories=Mobile;Testing
X-Osso-Service=org.moblin.pyhelloworld
4 拷貝org.moblin.pyhelloworld.service到${Mount Dir}/usr/share/dbus-1/services
[D-BUS Service]再次啟動Qemu,將看到下面的畫面(截圖的失誤啊,左邊留了個虛框)。
Hildon確實比較適合觸摸屏的設備,容易點擊。
Moblin的開發,主要是在Moblin.org的幾個開源項目基礎上,針對應用程序的開發,我們可以根據MID的特性編寫新的應用,或者移植現有的GTK、Python程序等等。但我個人認為,首先要熟練掌握一套API,切勿貪多,因為都是大同小異的東西。以上是我對moblin的一點簡單認識,還有實踐的經驗,水平有限,有什麼不對的地方希望大家指正。
展望一下未來吧,MID的前景,如果解決了低功耗的問題(這也是Intel的主要貢獻),使它能待機三四天,而不是短短的幾個小時的話,它將會從“玩具”變成像如今手機一樣的必需品,到那時,恐怕日益衰落的PDA也該壽終正寢了。