介绍
如果想获取MeeGo平台的开发概览,最好地方的是MeeGo developers。这里讨论的是一些更细节化的问题,比如MeeGo APIs的详细内容。
MeeGo应用程序开发教程
-
(1)在 Linux 上使用 MeeGo SDK
介绍
MeeGo SDK由以下部分构成:
- 一个MeeGo chroot环境,这包含了一个基于Xephyr (http://www.freedesktop.org/wiki/Software/Xephyr) 的MeeGo应用程序模拟器(仅支持Linux),一些在Xephyr里启动/停止MeeGo桌面的脚本,以及可以远程配置和部署MeeGo设备的Qt Creator。
- 一个启动MeeGo chroot环境,并运行模拟器和Qt Creator的meego-sdk-chroot脚本。
要安装MeeGo SDK,最简单的方法是下载这些组件的打包版本。这将在下一节讨论。
系统要求
要在Xephyr里运行MeeGo模拟器,你需要一个比较新的Linux发行版(例如Fedora 11,Ubuntu 9.10)以及Intel的硬件环境。硬件环境有以下要求:
- CPU: 32bit Intel(r) Atom(tm) or Intel(r) Core(tm) 2 CPU (support for SSSE3)
- 注意: MeeGo模拟器无法在不支持SSSE3的CPU上运行。
- 一块兼容的Intel显卡。GMA-500,Nvidia,以及ATI的芯片组都无法提供支持
译注:这是MeeGo模拟器的要求,不是SDK的要求。我可以在AMD处理器和NV显卡的机器上,运行 MeeGo SDK ,并正常编译/调试程序。
安装MeeGo chroot环境
MeeGo chroot压缩包是一个大文件(接近800M)。它不仅有MeeGo自身的所有库文件,也其他有用的东西(Xephyr, scripts, Qt Creator)。
下载MeeGo chroot压缩包文件:
wget http://download3.meego.com/meego-sdk-0524.tar.bz2
解压MeeGo chroot压缩包文件:
tar zxvf meego-sdk-0524.tar.gz
另一个方案是自己创建一个MeeGo chroot,参见Building a MeeGo chroot on Linux。
安装meego-sdk-chroot脚本
meego-sdk-chroot脚本会设置chroot环境的挂载点,然后用恰当的方式启动root环境;在离开chroot环境时,它也会尝试正确地卸载整个环境,并清除在chroot环境中启动的进程。
下载:
wget http://download3.meego.com/meego-sdk-chroot
给脚本可执行权限:
chmod +x meego-sdk-chroot
移动到/usr/bin:
mv meego-sdk-chroot /usr/bin
为模拟器配置host
下一步,是配置host的X环境,让模拟器(在chroot环境下运行)可以正确地显示在普通用户的屏幕上:
xhost +local:
(每次重启后,在运行模拟器和Qt Creator之前你都需要执行这一步)
进入 MeeGo chroot 环境
meego-sdk-chroot脚本将设置一个MeeGo chroot环境,并给你一个该环境下的shell:
sudo meego-sdk-chroot ~/meego-sdk-0524
(用你的chroot目录代替上面的’~/meego-sdk-0524)
注意,这个脚本使用了chroot命令。有些时候,root用户无法在PATH环境变量里定位这个命令(在Fedora里,chroot命令在/usr/sbin路径下)。你可以在meego-sdk-chroot脚本的顶部添加一行alias,以解决这个问题:
alias chroot='/usr/sbin/chroot'
脚本运行后,会输出下面这样的内容:
mount --bind /proc /home/ell/meego-sdk-0524/proc mount --bind /sys /home/ell/meego-sdk-0524/sys mount --bind /dev /home/ell/meego-sdk-0524/dev mount --bind /dev/pts /home/ell/meego-sdk-0524/dev/pts mount --bind /tmp /home/ell/meego-sdk-0524/tmp mount --bind /var/lib/dbus /home/ell/meego-sdk-0524/var/lib/dbus mount --bind /var/run/dbus /home/ell/meego-sdk-0524/var/run/dbus cp /etc/resolv.conf /home/ell/meego-sdk-0524/etc/resolv.conf root@meego-netbook-sdk:/#
安装其他软件
你可以在chroot环境下正常安装软件(和最新的netbook镜像一样)。
进入chroot环境,然后执行:
zypper install <package>
下面这个命令可以将整个MeeGo镜像更新到最新版本:
zypper dist-upgrade
运行模拟器
在chroot环境下,以root的身份执行:
startmeego &
这将启动Xephyr服务器,并运行一个脚本。这个脚本在Xephyr里启动一个MeeGo桌面。
如果你想在chroot环境里启动一个程序,并显示在模拟器窗口里,你可以:
DISPLAY=:2 glxgears
(用你想启动的程序名代替glxgears)
在模拟器里Debugging
如果你的模拟器出现了问题,可以使用debug脚本,看看具体发生了些什么:
startmeego-debug
这个脚本会在控制台输出一些信息,这些信息应该能给你问题的线索。
模拟器里的 Netbook UX 界面
它看起来像这样:
已发现的问题:
- 一些依赖DBus的工具条组件(比如电池,网络)无法报告设备的工作状态。
停止模拟器
要停止模拟器,只需要离开chroot shell:
exit
这会停止模拟器启动的所有进程,并卸载chroot环境使用的路径。这会输出下面这样的信息:
exit umount /home/ell/meego-sdk-0524/proc umount /home/ell/meego-sdk-0524/sys umount /home/ell/meego-sdk-0524/dev/pts umount /home/ell/meego-sdk-0524/dev umount /home/ell/meego-sdk-0524/tmp umount /home/ell/meego-sdk-0524/var/lib/dbus umount /home/ell/meego-sdk-0524/var/run/dbus
-
(2)Hello World – Linux上的 MeeGo x86 开发
介绍
这个教程介绍了Linux下的 MeeGo x86 开发。教程解说了基本的开发流程,重点介绍了如何使用SDK附带的那些工具。
教程不会涉及一些开发细节,例如 Qt 和 MeeGo 的 API、或是如何将程序整合到 MeeGo 环境中。
如何开发 (简要说明)
- 获取并安装 MeeGo SDK
- 进入 MeeGo SDK 环境
- 启动模拟器
- 启动 Qt Creator
- 使用 Qt Creator 创建一个项目, 配置项目的 DISPLAY 环境变量,让项目能够在模拟器中运行
- 使用 SDK 的 Qt 库编译项目。
- 在模拟器中运行程序
- 在模拟器中为程序 Debug
如果你有一台真实的 MeeGo 设备:
- 准备设备
- 在设备上运行程序
- 在设备上为程序 Debug
如何开发 (详细说明)
在你的机器上安装 MeeGo SDK
请参阅 在 Linux 上使用 MeeGo SDK 的介绍。
进入 MeeGo chroot 环境
请参阅 这个介绍 。
运行模拟器
把所有东西安装配置完成后,你应该可以在 MeeGo chroot 环境中 运行模拟器 了。
使用 Qt Creator 创建项目
让 startmeego 脚本继续运行,然后启动 Qt Creator :
qtcreator &
这会在 host 上运行 Qt Creator (而不是在 Xephyr 里):
然后,配置一个新项目:
- 创建一个新项目(File > New File or Project)。 在 Projects 对话框中, 选择 Qt Gui Application ,然后点击 OK。
- 输入 helloworld 作为项目名称,选择一个保存项目的目录 (例如,如果你使用 root 账户工作的话,可以选择 /root )。 然后点击 Next。
- 保持 Class Information 对话框的默认配置,然后点击 Next。
- 在 Project Management 对话框里,点击 Finish。
输入一些代码:
- 打开 Forms 目录,双击 mainwindow.ui 打开图形窗体编辑器。
- 从窗体编辑器左边的组件列表里,拖出一个 label ,放到编辑中的窗体上。
- 修改 label 的文本( “Hello world” 是个不错的选择 )。
- 再拽几个你喜欢的东西上去。
然后配置项目:
- 点击 Qt Creator 窗口左边的 Projects 图标。
- 配置 Qt 版本:
- 确认 Qt Version 的设置,应该是 Default Qt Version (Qt in PATH) 。
- 然后,配置运行环境,用模拟器来显示运行的程序:
- 点击 Run Settings 标签。
- 点击 Run Environment 下面的 More 按钮。
- 双击 Display 环境变量边上的文本区,将 :0.0 改为 :2 。这会让 Qt Creator 使用 :2 号显示区域来运行程序,也就是在 Xephyr 中运行。
在模拟器中运行程序
现在你已经做好了运行程序的准备。
在 Qt Creator 里,点击左下角那个大大的绿色箭头,就可以运行程序。在第一次运行时,这会编译整个项目(使用你设置的 Qt 库版本),然后在 :2 号 display (也就是 Xephyr 里的 MeeGo 模拟器)上显示程序。
在模拟器里,程序可能会在后台运行,不会直接显示在屏幕上。这时你可以需要点击 MyZone 图标激活程序:
在模拟器中为程序 Debug
在 Qt Creator 里启动程序后,如果你激活了 Debug 模式,你就可以监视这个程序的运行状态。
在之前的 小节 里,我们已经为当前版本的 Qt 库创建了 debugging helper 。这必须预先做好,不然你无法调试程序。
点击左边工具栏中的 bug 图标,这会激活 Qt Creator 的 Debug 模式。这会在窗口里增加一个面板,以显示运行栈、变量和表达式的值、以及其他有用的信息。
然后,你需要一些 Bug 好进行 debug。我在程序窗体里添加了一个 Push Button :
然后为这个按钮添加了点击事件。当点击这个按钮时,一个字符串变量将会被打印到控制台上。代码是这样的:
/* file: Headers/mainwindow.h */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void changeEvent(QEvent *e); private: Ui::MainWindow *ui; private slots: void on_pushButton_clicked(); }; #endif // MAINWINDOW_H
/* file: Sources/mainwindow.cpp */ #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QString> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::on_pushButton_clicked() { QString message; message = "I have been well and truly clicked"; qDebug() << message; }
大部分代码继承自原本的项目,只有 MainWindow::on_pushButton_clicked 这个方法是我自己添加的。需要注意的是,我还在头文件里定义了一个私有的槽。
译者注:信号和槽是 Qt 里的概念,请参考介绍 Qt 的文章。
然后在编辑器里,在你想要 debug 的语句左边点击一下,添加一个断点。看起来像是这样:
(注意 34 行左边的那个红色圆圈)
然后点击那个带着 bug 标志的绿色箭头(在左下角),这会以 Debug 模式启动程序。程序将会显示在模拟器中:
现在,在模拟器里的程序窗口中,点击那个 Push Button ,这会在刚才设置的断点上中断程序。回到 Qt Creator 里,看下 debug 面板:
我们可以看到,在 Locals and Watchers 标签里, message 变量的值,已经被设置为 “I have been well and truly clicked” 了。