红联Linux门户
Linux帮助

如何把一个qmake的Ubuntu手机应用打包为一个snap应用

发布时间:2016-07-13 15:21:32来源:Ubuntu手机作者:Ubuntu手机
我们知道Ubuntu平台提供了良好的融合(convergence)设计.通过融合设计,使得我们的同样一个应用在不需要修改任何代码的情况下,重新打包就可以运行到不同的屏幕尺寸的设备上.当然,Canonical公司最终的目的是实现snap应用运行到所有设备上,而不需要进行任何的重新打包的动作.目前Ubuntu手机上支持的应用打包格式是click包.在为了的Ubuntu SDK中,最终我们会把snap的支持加入到我们的SDK之中去.那么目前我们怎么把我们已经开发好的应用打包成为一个snap应用包,并可以成功部署到我们的电脑桌面(16.04)上呢?
如果大家对如何安装一个snap应用到16.04的桌面系统上的话,请参阅文章"安装snap应用到Ubuntu 16.4桌面系统"(http://www.linuxdiyf.com/linux/22311.html)。
 
1)通过Ubuntu SDK开发一个我们需要的手机应用
我们可以通过Ubuntu SDK来创建一个我们想要的项目.关于如何创建一个Ubuntu手机应用,这个不在我们的这个教程范围!
值得指出的是:在今天的教程中,我们将教大家如何把一个qmake的Ubuntu手机应用打包为一个snap的应用.这里,我们将利用之前我已经开发的一个项目作为例程来开始.我们在terminal下打入如下的命令:
$ git clone https://github.com/liu-xiao-guo/rssreader_snap
下载后的源码结构如下:
liuxg@liuxg:~/snappy/desktop/rssreader$ tree -L 2  
.  
├── snapcraft.yaml  
└── src  
├── manifest.json.in  
├── po  
├── rssreader  
└── rssreader.pro
从上面的结构上,我们可以看到:在src目录下的整个项目是有我们的Ubuntu SDK所创建的一个qmake项目,它有一个项目文件.pro文件.在手机上的运行情况如下:
如何把一个qmake的Ubuntu手机应用打包为一个snap应用
同时,在我们项目的根目录下,我们发现了另外一个文件snapcraft.yaml.这个文件就是为了能够让我们把我们的qmake项目最终打包为snap应用的文件.
 
2)为我们的qmake项目打包
我们已经提到了我们项目的snapcraft.yaml文件.现在我们把这个文件展示如下:
snapcraft.yaml
name: rssreader-app  
version: 1.0  
summary: A snap app from Ubuntu phone app  
description: This is an exmaple showing how to convert a Ubuntu phone app to a desktop snap app  
confinement: strict  
apps:  
rssreader:  
command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/rssreader  
plugs: [home,unity7,opengl]  
parts:  
rssreader:  
source: src/  
plugin: qmake  
qt-version: qt5  
build-packages:  
- cmake  
- gettext  
- intltool  
- ubuntu-touch-sounds  
- suru-icon-theme  
- qml-module-qttest  
- qml-module-qtsysteminfo  
- qml-module-qt-labs-settings  
- qtdeclarative5-u1db1.0  
- qtdeclarative5-qtmultimedia-plugin  
- qtdeclarative5-qtpositioning-plugin  
- qtdeclarative5-ubuntu-content1  
- qt5-default  
- qtbase5-dev  
- qtdeclarative5-dev  
- qtdeclarative5-dev-tools  
- qtdeclarative5-folderlistmodel-plugin  
- qtdeclarative5-ubuntu-ui-toolkit-plugin  
- xvfb  
stage-packages:  
- ubuntu-sdk-libs  
- qtubuntu-desktop  
- qml-module-qtsysteminfo  
- ubuntu-defaults-zh-cn  
snap:  
- -usr/share/doc  
- -usr/include  
after: [desktop/qt5]  
初以乍看,这个文件和我们以往所看到的文件都不同.似乎很复杂!
在这里,我们做一个简单的解释:
name: 这是最终的包的名称.针对我们的情况,我们最终的snap包的名字为rssreader-app_1.0_amd64.snap
version: 这是我们包的版本信息.就像我们包的名称rssreader-app_1.0_amd64.snap所展示的那样.1.0是我们的版本信息
summary: 这是一个描述我们包信息的字符串.根据我们的设计,他只能最多长达79个字符
description:这是一个描述我们包的字符串.它可以比summary来得更长一些
confinement: 受限的种类:strict 或 devmode.当我们设置为devmode时,在安装时加上--devmode选项时,可以使得我们的应用不接受任何的安全的限制.就像我们以前在Ubuntu电脑上开发一样.我们可以随意地访问任何一个我们想要访问的目录等等
apps: 在这里定义我们的应用及其运行时所需要的命令.针对我们的情况,我们定义rssreader为我们的应用.当我们执行我们的应用时,我们需要使用<<包名>>.<<应用名>>来运行我们的应用.针对我们的情况,我们使用rssreader-app.rssreader来通过命令行来运行我们的应用
command:这是用来启动我们应用所需要的命令行.针对我们的情况:desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/rssreader.这里的desktop-launch来自我们下面的已经预先编译好的包 desktop/qt5
plugs:这一项定义了我们的snap应用所访问的权限.通过我们的设定,我们可以访问系统的$HOME目录及使用opengl
parts: 每个part定义了我们软件所需要的部分.每个part就像一个mini的小项目.在我们编译时可以在parts的目录中分别找到对应的部分
rssreader: 我们定义的part的名称.它的名字可以是任何你所喜欢的名称
source: 定义part的源码.它可以在网站上的任何一个软件(bzr, git, tar)
plugin: 定义编译part所需要用到的plugin
qt-version:这个是针对Qt plugin来说的.定义Qt的版本
build-packages:定义在这里的每个包都是为了用来编译我们的项目的.需要安装的.它们将不会出现在最终的snap文件中
stage-packages:这些定义的包都要最终被打入到snap包中,并形成运行该应用所需要的文件.特别值得指出的是:我们加入了中文包ubuntu-defaults-zh-cn,从而使得我们的应用可以看见中文的显示.当然,我们包的大小也从100多兆增加到300多兆.注意这里的包都对应在我们通常ubuntu下的debian包
snap:定义了我们需要的或不需要的文件.在这里我们通过"-"来把一些不想要的文件剔除从而不打入到我们的包中
after:表明我们的这个part的编译必须是在desktop/qt5下载之后.对于有些项目,我们必须先得到一个part,并使用这个part来编译我们其它的part.在这种情况下,我们可以使用after来表明我们的先后顺序
当然我们只做了一个简单的描述。
 
3)编译我们的snap应用
为了编译我们的snap应用,其实非常简单.我们直接进入到我们的项目的根目录下,并打入如下的命令:
$ snapcraft  
这样,我们就可以编译我们的应用,并最终生产我们所需要的.snap文件:
312M 7月  13 12:25 rssreader-app_1.0_amd64.snap  
就像我们上节中介绍的那样,由于我们加入了中文字体,所以我们的应用变得非常庞大.
 
4)安装及运行我们的应用
我们可以通过如下的命令来安装我们的.snap文件:
$ sudo snap install rssreader-app_1.0_amd64.snap  
我们可以通过如下的命令来运行我们的应用:
$ rssreader-app.rssreader  
运行时的画面如下:
如何把一个qmake的Ubuntu手机应用打包为一个snap应用
从上面可以看出来.我们没有经过任何的修改,但是我们的手机应用也可以在16.04的桌面上运行得非常好.在本应用中,它也使用了融合(Convergence)技术,从而使得我们的应用在不同的屏幕尺寸上自动适配。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/22344.html