要换工作了,整理以前做的东西,找到两个moblin相关的东西。
启动 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-2.6.24-16-lpia -initrd initrd.img-2.6.24-16-lpia -hda 1G.img --append root=/dev/sda |
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] Name=org.moblin.pyhelloworld Exec=/usr/bin/py-hello-world |
再次启动 Qemu ,将看到下面的画面(截图的失误啊,左边留了个虚框)。
Hildon 确实比较适合触摸屏的设备,容易点击,见下图。
Moblin 的开发,主要是在 Moblin.org 的几个开源项目基础上,针对应用程序的开发,我们可以根据 MID 的特性编写新的应用,或者移植现有的 GTK 、 Python 程序等等。但我个人认为,首先要熟练掌握一套 API ,切勿贪多,因为都是大同小异的东西。以上是我对 moblin 的一点简单认识,还有实践的经验,水平有限,有什么不对的地方希望大家指正。