设为首页收藏本站返回主页

Ubuntu Kylin技术论坛

 找回密码
 立即注册
搜索
查看: 748|回复: 0

涨知识:如何在优麒麟和银河麒麟社区版上构建Linux跨平台的snap/flatpak包?

[复制链接]
  • TA的每日心情
    慵懒
    2017-3-21 09:26
  • 签到天数: 216 天

    [LV.7]常住居民III

    参加活动: 4

    组织活动: 12

    发表于 2017-5-10 14:40:50 | 显示全部楼层 |阅读模式

    摘要:Snap和Flatpak是新一代的Linux打包格式,它们通过将软件和依赖同时安装在一个沙盒中,使得采用snap和flatpak的应用,可以跨越不同的发行版,降低了开发和维护成本,同时大大提高了系统的安全性。本文将通过实例,来介绍如何在优麒麟/银河麒麟社区版上构建这两种跨平台的软件包。

    首先,我们使用gtk编写一个最简单的“hello world”窗口程序。

    // 主程序main.c

    1. #include
    2. static gboolean quit(GtkWidget *widget, gpointer data)
    3. {
    4.     gtk_widget_destroy(widget);
    5.     gtk_main_quit();
    6.     return FALSE;
    7. }
    8. int main(int argc, char *argv[])
    9. {
    10.     gtk_init(&argc, &argv);
    11.     GtkWidget *main_win;
    12.     GtkWidget *label;
    13.     main_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    14.     gtk_window_set_title(GTK_WINDOW(main_win), "my window");
    15.     gtk_window_set_default_size(GTK_WINDOW(main_win), 300, 100);
    16.     label = gtk_label_new("hello world!");
    17.     gtk_container_add(GTK_CONTAINER(main_win), label);
    18.     g_signal_connect(G_OBJECT(main_win), "destroy", G_CALLBACK(quit), NULL);
    19.     gtk_widget_show_all(main_win);
    20.     gtk_main();
    21.     return 0;
    22. }
    复制代码

    # CMake项目文件:CMakeLists.txt

    1. project (hello)
    2. cmake_minimum_required (VERSION 3.0.0)
    3. set (SRC_LIST main.c
    4. )
    5. find_package (PkgConfig REQUIRED)
    6. set (HELLO_DEPS
    7.     gtk+-3.0
    8. )
    9. pkg_check_modules (CACHED_HELLO_DEPS REQUIRED ${HELLO_DEPS})
    10. include_directories (${CACHED_HELLO_DEPS_INCLUDE_DIRS})
    11. link_directories (${CACHED_HELLO_DEPS_LIBRARY_DIRS})
    12. add_executable (hello ${SRC_LIST})
    13. target_link_libraries (hello ${CACHED_HELLO_DEPS_LIBRARIES})
    14. install (TARGETS hello DESTINATION "bin")
    复制代码

    把这两个文件放在hello目录下,并将hello目录压缩成hello.tar.gz,放在主目录下供之后调用:

    1. $ tar cvfz hello.tar.gz hello
    复制代码

    其次,将其打包成snap格式。

    snaps 是Ubuntu推出的新一代打包格式,它安装迅速,创建方便,具有自动进行事务性更新的能力,可以在众多 Linux 桌面、服务器、云或者设备上完美、安全地运行。

    安装snapd(运行和管理snaps所需的服务)和snapcraft(构建snap包的工具)

    1. $ sudo apt install snapd snapcraft
    复制代码

    (其他系统安装方式请参见:https://snapcraft.io/docs/core/install

    初始化:

    1. $ mkdir hello_snap && cd hello_snap
    2. $ snapcraft init
    复制代码

    这会在你的目录下产生“snap/snapcraft.yaml”这个文件,而这个文件控制着snap包的构建过程以及向用户暴露的属性。(在16.04系统上,比如银河麒麟社区版和优麒麟16.04,直接在本目录下生成snapcraft.yaml文件,且默认内容也更简单)

    默认产生的snapcraft.yaml是这样的:

    1. name: my-snap-name # you probably want to 'snapcraft register'
    2. version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
    3. summary: Single-line elevator pitch for your amazing snap # 79 char long summary
    4. description: |
    5.   This is my-snap's description. You have a paragraph or two to tell the
    6.   most important story about your snap. Keep it under 100 words though,
    7.   we live in tweetspace and your description wants to look good in the snap
    8.   store.
    9. grade: devel # must be 'stable' to release into candidate/stable channels
    10. confinement: devmode # use 'strict' once you have the right plugs and slots
    复制代码

    其中:

    grade: 定义此snap的质量等级,“devel”表示开发版本,“stable”表示稳定版本。

    confinement: 定义此snap的限制级别,“strict”,“devmode”或“classic”,每个等级,软件具有的权限不同,具体区别见:https://snapcraft.io/docs/reference/confinement

    parts:snaps的主要构建部分,包括创建snap的源码,包,压缩包和组织步骤。

    yaml文件完整语法规则在:https://snapcraft.io/docs/build-snaps/syntax

    根据本例,修改默认内容为如下:

    1. name: hello-snap
    2. version: '0.1'
    3. summary: Say hello.
    4. description: |
    5.      Open a window, and say hello to the world!
    6. grade: devel
    7. confinement: devmode
    8. apps:
    9.     hello:
    10.     command: desktop-launch hello
    11.     plugs: [x11]       #所需系统权限
    12. parts:
    13.     gnu-hello:
    14.     # 参见 'snapcraft plugins'
    15.     source: /home/feng/snappy_flatpak/hello.tar.gz
    16.     plugin: cmake
    17.     stage-packages:
    18.         - libmirclient9
    19. after: [desktop-gtk3]  #提供了各种gtk库
    复制代码

    对于银河麒麟社区版或者优麒麟16.04,由于snap版本更早,我们修改snapcraft.yaml为:

    //snapcraft.yaml
    1. name: hello-snap
    2. version: '0.1'
    3. summary: Say hello.
    4. description: |
    5.      Open a window, and say hello to the world!
    6. apps:
    7.      hello:
    8.      command: hello
    9.      plugs: [x11]
    10. parts:
    11.      gnu-hello:
    12.      # 参见 'snapcraft plugins'
    13.      source: /home/feng/snappy_flatpak/hello.tar.gz
    14. plugin: cmake
    15. stage-packages:
    16.      - libcanberra-gtk-module:amd64
    17.      - libcanberra-gtk3-module:amd64
    18. after: [desktop/gtk3]       #注意此处格式不一样
    复制代码

    编译:

    1. $ snapcraft
    复制代码

    此命令将会在本目录下(hello-snap)生成hello-snap_0.1_amd64.snap文件。(对于银河麒麟社区版,需要先把/etc/lsb-release中“DISTRIB_RELEASE=4.0.2”改为“ DISTRIB_RELEASE=16.04”)

    安装运行:

    1. $ sudo snap install hello-snap_0.1_amd64.snap --devmode  // 以开发者模式安装
    2. $ hello-snap.hello       // 最终的程序名构成为“name”.“apps”
    复制代码

    对于银河麒麟社区版和优麒麟16.04,通过以下命令打开:

    1. $ /snap/bin/hello-snap.hello
    复制代码

    你可以将此snap包上传至ubuntu 商店(可以通过snap find 查看ubuntu 商店中现有的软件),或者直接发送到其他操作系统上,然后通过sudo snap install 安装(需要先安装snapd),非常方便。

    然后,将其打包成flatpak格式。

    Flatpak是一种用于构建,分发,安装和运行应用程序的技术。它主要针对的是Linux桌面,通过在沙箱中隔离应用程序来提高Linux桌面的安全性,允许应用程序安装在任何Linux发行版上。

    我们先来了解几个基本概念:

    运行时(runtimes)

    “运行时”提供应用程序所需的基本依赖。有各种各样的“运行时”,比如“ Freedesktop 运行时”,“ GNOME 运行时 ”。“ Freedesktop 运行时”包含一系列必要的库和服务,包括 D-Bus, GLib, PulseAudio, X11 和 Wayland 等。“ GNOME 运行时”基于“ FreeDesktop 运行时”,增加了一些GNOME平台相关的库,比如GStreamer, GTK+, GVFS等。必须针对运行时构建每个应用程序,并且必须在主机系统上安装此运行时才能运行应用程序。用户可以同时安装多个不同的运行时,包括不同版本的同一个运行时。

    SDK(软件开发套件)

    SDK也是一个“运行时”,是用于构建应用程序的特殊类型的运行时,它包含了构建和打包工具,如头文件,编译器和调试器。通常,SDK与“运行时”配对,由应用程序使用。

    沙箱

    使用Flatpak,每个应用程序都是在孤立的环境中构建和运行的。默认情况下,应用程序只能“查看”自身及其“运行时”,访问用户文件,网络,graphics sockets,总线和设备上的子系统必须明确授予权限,访问其他内容(如其他进程)是不允许的。

    安装Flatpak

    对于优麒麟16.04,银河麒麟社区版:

    1. <span style="color: rgb(51, 51, 51); font-family: 宋体, SimSun; line-height: 1.5; background-color: rgb(255, 255, 255);">$</span><span style="line-height: 1.5;">sudo apt install software-properties-common elfutils</span>
    复制代码

    对于优麒麟17.04:

    1. $ sudo apt install flatpak flatpak-builder
    复制代码

    安装程序所需的“运行时”和Sdk:

    1. $ flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo
    2. $ flatpak install gnome org.gnome.Platform//3.24 org.gnome.Sdk//3.24
    复制代码

    初始配置:

    1. $ mkdir hello-flatpak && cd hello-flatpak
    2. $ gedit com.kylin.Hello.json
    复制代码

    添加以下内容至com.kylin.Hello.json文件:

    {

    1.     "app-id": "com.kylin.Hello",
    2.     "runtime": "org.gnome.Platform",  #所需“运行时”
    3.     "runtime-version": "3.24",     
    4.     "sdk": "org.gnome.Sdk",       #所需Sdk
    5.     "command": "hello",
    6.     "finish-args": ["--socket=x11"],  #所需系统权限
    7.     "modules": [
    8.         {
    9.             "name": "hello",
    10.             "cmake": true,
    11.             "sources":[
    12.                 {
    13.                     "type": "archive",
    14.                     "path": "/home/feng/snappy_flatpak/hello.tar.gz"
    15.                 }

    16.         }

    17. }
    复制代码

    json文件等同于前文snap的yaml文件,包含着构建flatpak包的所有信息。

    编译、安装、运行:

    1. $ flatpak-builder --repo=repo hello com.kylin.Hello.json
    2. $ flatpak --user remote-add --no-gpg-verify --if-not-exists tutorial-repo repo
    3. $ flatpak --user install tutorial-repo com.kylin.Hello
    4. $ flatpak run com.kylin.Hello
    复制代码

    你可以将程序打包成flatpak格式,分发出去:

    1. $ flatpak build-bundle repo hello.flatpak com.kylin.Hello
    复制代码

    然后在另一个系统安装这个程序(需要先安装相应“运行时”和Sdk):

    1. $ flatpak install --user --bundle hello.flatpak
    复制代码

    或者托管在仓库里(官方推荐方式),具体见:http://docs.flatpak.org/en/latest/distributing-applications.html

    更多详细信息,可以点击以下链接:

    snap:https://www.ubuntu.com/desktop/snappy   

    flatpak:http://flatpak.org/



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|Ubuntu Kylin    

    GMT+8, 2017-7-21 18:40 , Processed in 0.053489 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表