不知道大家是否先前试过我的一个Qt的应用"如何把一个qmake的Ubuntu手机应用打包为一个snap应用".在那个教程中,我们尝试把所有的Ubuntu SDK库包ubuntu-sdk-libs都打入到我们的应用中,结果是我们的snap包的文件非常大.几乎达到800M-900M.显然这样的应用不具有实用性.我也尝试只把我们最需要的Qt库打入到我们的snap包中.你们可以发现我更新后的代码.即使是这样的,我们最终形成的包的大小也达到120M左右.显然,这也不是一个小的文件.那么我们有什么办法可以使得我们的Qt应用的包变得更小呢?

答案是我们使用canonical公司所提供的ubuntu-app-platform snap应用.这个应用把我们最需要的Qt库打入到我们的snap应用中,并通过content sharing的方法把ubuntu-app-platform中的Qt库文件mount到我们的应用中,从而使得我们的Qt应用能够使用ubuntu-app-platform所提供的所有Qt库.这样我们的所有的在一个Ubuntu Core系统的所有的snap应用都可以共享同一份Qt库,从而达到减少我们snap应用大小的目的.

在下面,我们来详细介绍如何利用content interface来实现这个目的.


1)安装


首先,对于英文比较好的开发者来说,我们可以在如下的地址找到我们所需要的信息:

https://developer.ubuntu.com/en/blog/2016/11/16/snapping-qt-apps/

就像在那篇文章中介绍的那样,我们在我们的Ubuntu 16.04 Desktop中,必须安装stabe-phone-overlay以确保我们的Qt版本是Qt 5.6.1的.否则我们有些Qt应用的打包会有文件.我们可以通过如下的方式来检查我们的Qt版本:

liuxg@liuxg:~$ qmake --version
QMake version 3.0
Using Qt version 5.6.1 in /usr/lib/x86_64-linux-gnu

为什么需要把我们的Qt版本安装为5.6.1版本呢?细心的开发者,可以发现在ubuntu-app-platform的链接中,它表明该snap是基于Qt 5.6.1的版本的.先前在我的电脑上安装的Qt 版本为Qt 5.5.1.当我用该版本打包我的Qt应用时,在运行时会出现一个错误.

我们按照如下的步骤来安装我们的Qt 5.6.1版本:

$ sudo add-apt-repository ppa:ci-train-ppa-service/stable-phone-overlay
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade

在执行完上面的命令后,我们再次确认我们的Qt版本信息是否为5.6.1.这一步的安装非常中,不正确的Qt版本可能使得有些Qt应用运行正常,但有些可能会出错.


2)利用ubuntu-app-platform来重构Qt应用


我们先前的RSSreader Ubuntu Phone应用的源码可以在 地址找到:

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 # devmode

apps:
  RSSreader:
    command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/RSSreader
    plugs: [network,network-bind,network-manager,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:
      - libsdl2-2.0-0
      - libqt5gui5
      - libqt5qml5
      - libqt5quick5
      - libqt5widgets5
      - libqt5network5
      - libqt5multimedia5
      - libqt5declarative5
      - qml-module-qtquick2
      - qml-module-qtquick-window2
      - qml-module-qtquick-layouts
      - qml-module-qtquick-controls
      - qml-module-qt-labs-settings
      - qml-module-ubuntu-components
      - qml-module-qtquick-xmllistmodel
      - ubuntu-ui-toolkit-theme
      - qml-module-ubuntu-connectivity
      - qml-module-ubuntu-layouts
      - qml-module-ubuntu-performancemetrics
      - fonts-wqy-zenhei
      - fcitx-frontend-qt5
    snap:
      - -usr/share/doc
      - -usr/include
    after: [desktop/qt5]

显然在上面的snapcraft.yaml中,我们把太多的Qt库打入到我们的snap包中.其结果就是大大增加了我们的snap包的大小.为了能够利用ubuntu-app-platform所提供的 platform interface,我们把我们的应用的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 # devmode

apps:
  RSSreader:
    command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/RSSreader
    plugs: [network,opengl,platform]

parts:
  RSSreader:
    source: src/
    plugin: qmake
    qt-version: qt5
    snap:
      - -usr/share/doc
      - -usr/include
    after: [desktop-ubuntu-app-platform]
  
  plat:
    plugin: dump
    source: .
    snap: [ubuntu-app-platform]
    
plugs:
  platform: # plug name,to be used later
    interface: content
    content: ubuntu-app-platform1 # content being mounted and the version,currently 1
    target: ubuntu-app-platform # the mount directory created
    default-provider: ubuntu-app-platform # default content source snap,currently the only provider too

从上面的新的snapcraft.yaml文件中,我们可以看出来:我们把stage-packages里所有的相关的debian包都已经删除了,取而代之的是在我们的应用中加入了 platform这个plug.在我们的应用中,我们也定义了我们的platform plug interface.另外,我们值得指出的是,我们在我们的应用的根目录下创建了一个空的 ubuntu-app-platform目录.这个目录的作用是被platform interface作为mount点从而把Qt库分享给我们的应用.如果没有这个空的文件目录,在运行我们的Qt应用时会出错.整个项目的文件结果如下:

liuxg@liuxg:~/snappy/desktop/RSSreader_platform$ tree -L 2
.
├── setup
│ └── gui
├── snapcraft.yaml
├── src
│ ├── manifest.json.in
│ ├── po
│ ├── RSSreader
│ └── RSSreader.pro
└── ubuntu-app-platform

在确保我们的项目完成后,我们在项目的根目录下打入如下的命令:

$ snapcraft

这样就会在当前的目录下生产我们想要的.snap文件包.我们来重新查看一下我们所生产的snap包的大小:



显然我们的snap包的文件大小只有18M,比我们先前的120M要小好多.细心的开发者可能已经发现所有的Qt库文件.它包含了我们运行一个Qt应用最基本的库:

liuxg@liuxg:~/snappy/desktop/RSSreader_platform/prime/usr/lib/x86_64-linux-gnu$ l
libdouble-conversion.so.1  libpcre16.so.3      libX11-xcb.so.1      libXdamage.so.1
libdrm.so.2                libproxy.so.1       libXau.so.6          libXdmcp.so.6
libglapi.so.0              libQt5Core.so.5     libxcb-dri2.so.0     libXext.so.6
libgraphite2.so.3          libQt5Gui.so.5      libxcb-dri3.so.0     libXfixes.so.3
libharfbuzz.so.0           libQt5Network.so.5  libxcb-glx.so.0      libxshmfence.so.1
libicudata.so.55           libQt5Qml.so.5      libxcb-present.so.0  libXxf86vm.so.1
libicui18n.so.55           libQt5Quick.so.5    libxcb.so.1          mesa/
libicuuc.so.55             libX11.so.6         libxcb-sync.so.1

我们可以按照如下的方式进行安装:

liuxg@liuxg:~/snappy/desktop/RSSreader_platform$ sudo snap install RSSreader-app_1.0_amd64.snap --dangerous
RSSreader-app 1.0 installed

当我们尝试第一次运行我们的应用时,我们可以看到如下的信息:

liuxg@liuxg:~/snappy/desktop/RSSreader_platform$ RSSreader-app.RSSreader 
You need to connect the ubuntu-app-platform package with your application 
to reuse shared assets,please run:
snap install ubuntu-app-platform
snap connect RSSreader-app:platform ubuntu-app-platform:platform

显然,它是提示我们需要安装相应的ubuntu-app-platform snap应用:

liuxg@liuxg:~$ sudo snap install ubuntu-app-platform
ubuntu-app-platform (stable) 1 from 'canonical' installed
liuxg@liuxg:~$ sudo snap connect RSSreader-app:platform ubuntu-app-platform:platform

至此,我们已经把我们的应用的platform plug和ubuntu-app-platform的platform slot进行了手动连接.我们可以通过如下的命令来查看:



在我们的命令行中执行如下的命令:

liuxg@liuxg:~/snappy/desktop/RSSreader_platform$ RSSreader-app.RSSreader 
You need to connect the ubuntu-app-platform package with your application 
to reuse shared assets,please run:
snap install ubuntu-app-platform
snap connect RSSreader-app:platform ubuntu-app-platform:platform

显然我们的应用在执行时遇到了问题.它并没有启动我们的应用,而是显示和我们上面同样的信息.这是由于一个我们在目前snapd版本中设计的bug所致.我们目前可以通过如下的方法来消除这个问题.

$ sudo /usr/lib/snapd/snap-discard-ns RSSreader-app

我们可以再重新安装我们的应用.在没有connect之前, 不要运行我们的应用!如果你已经运行了,那么请执行上面的命令来删除name space,然后再重新安装,connect,再最后运行我们的应用:

$ RSSreader-app.RSSreader



整个应用的源码可以在地址找到: https://github.com/liu-xiao-guo/rssreader_platform
更多例程: https://code.launchpad.net/~tpeeters/+junk/blog-snapping-qt-apps

利用ubuntu-app-platform提供的platform接口来减小Qt应用大小的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部