背景介绍
我们的软件开发了支持UOS统一国产化操作系统的版本,需要研究一下UOS中的打包规范,使我们软件的安装包能够符合UOS商店的上架规范。
Linux下有两种主流的打包工具,dpkg和rpm。其中dpkg用于Debian社群,包括大名鼎鼎的Ubuntu。而rpm由Red Hat公司开发,主要用在Centos,Fedora上。由于我们的UOS国产化系统属于Debian,所以我们本篇讲解dpkg的使用方法。
1、目录规范
在打包之前,我先介绍下打包目录的规范,完整的目录结构为:
注意事项
1、注意看包名外面一层名称为com.apps.vplayer-1.0.0,这由三部分组成:包名,-符号和版本号。这个名称不能乱改,只能改动版本号,不然打包的时候会报错。
2、 entries文件夹里面我们需要注意applications文件夹里面的文件。这个文件是描述桌面快捷方式的。它使用的是Desktop Entry文件标准来配置信息。Desktop Entry文件标准是由FreeDesktop.org制定的。我们来看一个例子:
上面文件的名称为com.apps.vplayer.desktop,位置是放在applications目录下。所有的桌面快捷方式名称都是.desktop结尾的。下面我们解释上面一些字段的意思:
Name[必选],指定了应用程序的名称
Exec[可选],这个选项只有当Type字段为Application时才有意义。指定了启动程序的路径。
Icon[可选],指定了应用程序的图标,就是放在icons目录下的图片。
Type[必选],常见有两种类型,Application表示应用程序,Link表示指向一个URL。
Categories[可选],指定应用程序在菜单中显示的类别,我们的应用程序是播放器,所以值为Video。
更多关于桌面快捷方式,可以参考文章
3、files文件夹下放入我们的库文件和执行文件。
4、info文件是应用的描述文件,使用json格式,完整的info文件格式如下:
各字段的意思如下:
appid:应用标识
name:应用名称
version:版本号
arch:架构,支持架构如下:
amd64:x86架构CPU
mips64:龙芯系列CPU
arm64:ARM64位CPU
sw_64:申威CPU
permissions:应用权限描述
autostart:是否允许自启动
notification:是否允许使用通知
trayicon:是否运行显示托盘图标
clipboard:是否允许使用剪切板
account:是否允许读取登录用户信息
bluetooth:是否允许使用蓝牙设备
camera:是否允许使用视频设备
audio_record:是否允许进行录音
installed_apps:是否允许读取安装软件列表
2、创建debian目录
在打包之前,我们需要创建DEBIAN目录,在该目录下至少要有control文件,还可能有copyright,changlog,postinst,postrm等。其中control文件最重要,也是必不可少的。主要描述了软件包的名称,版本,描述等等属性,用于引导软件安装和卸载管理。我们先来介绍dh_make命令。UOS默认没有安装该命令。我们可以使用sudo apt-get install dh-make来安装。注意安装命令是dh-make,不是dh_make,dh_make是使用命令。
dh_make --createorig -s命令来创建debian文件夹和control文件等。
修改如下:
这样我们就有了自己的control了,至于copyright,changlog等都可以在生成的debian目录下找到对应的模板,因为他们都是可选的,所以不在讲述。
3、二进制打包
经过上面的准备,我们可以开始打包了,打包分为二进制打包和源码打包。我们先讲二进制打包,稍后讲解源码打包。二进制打包比较简单,我们可以通过下面步骤来实现打包。
在任一目录下,新建一个文件夹,我们取名为com.apps.vplayer.test,然后在该目录下新建文件夹DEBIAN,在DEBIAN目录下放入我们上面修改后的control文件。结构如下所示:
根据UOS商店规定,所有的第三方软件都要安装在/opt/apps/目录下。所以我们需要新建opt和apps文件夹,然后把opt文件夹放到和DEBIAN同一级目录,然后我们需要把我们在第二章节目录规范创建好的文件夹com.apps.vplayer放到/opt/apps/目录下,整个结构如下图所示:
注意事项
icons文件夹下我就放了一个png文件,为了方便,没有根据上面要求来,你们可以严格的根据上面的要求来。
我们退回到com.apps.vplayer.test目录的父目录上,上面的父目录就是home目录。我们使用命令sudo dpkg-deb -b com.apps.vplayer.test对目录com.apps.vplayer.test进行打包。等待一段时间,打包就成功了,在home上就能看到com.apps.vplayer.test.deb文件。
4、源码打包
源码打包比较复杂,上面我们讲到通过dh_make命令创建了debian文件夹,我们可以看到debian文件夹下有很多文件,我们根据默认的control修改来开始打包过程。
修改后的control文件如下所示:
修改debian目录下rules文件
便于文件太长,删掉了一部分注释。其中,命令dh $@会去自动调用一系列的dh命令,包括clean,build,make等等。但是因为源代码的构建经常需要参数和库调用,所以常常要修改命令参数,这就通过override_dh_*命令实现。因为我的源代码用到了qt编译环境,所以我重新设置了配置参数qmake KDLocalPlayer.pro -spec linux-clang CONFIG+=debug CONFIG+=qml_debug && /usr/bin/make,如上图所示。同理make,clean操作。因为我的库函数依赖不是源码编译,同样也不需要剥离ELF,所以我不需要使用shlibdeps和strip操作。那么我只需要把它们设置为空就行。如上图所示。
接下来我们要指定安装包的路径,我们使用debian/install实现。在debian目录下写一个install,内容如下:
可以看到内容比较多,第二行的意思是把com.apps.vplayer目录按照规则复制到/opt/apps/目录下。也就是debian/com.apps.vplayer/目录下。下面几行主要是把源码生成的执行文件和一些库文件,配置文件等复制到files目录下。我们通过上面几章节知道files目录主要存放执行文件和相关库文件。
我们把源码文件放到和debian同一级目录,其中qt的pro文件一定要放到和debian同一级目录。目录结构整理如下:
注意事项
上图中的files不用放任何库文件和执行文件,因为库文件和执行文件放在了dist目录下。打包的时候会自动放入到debian/com.apps.vplayer/opt/apps/com.apps.vplayer/files目录下。
最后一步,我们退回到vplayer.test目录,就是debian的父目录。使用命令sudo dpkg-buildpackage -b进行打包,因为源码编译的关系,时间可能比较长。构建完成之后,在vplayer.test目录的父目录上就能看到打好的deb包了。同样,你也可以检查下debian/com.apps.vplayer/opt/apps/com.apps.vplayer/files目录下有没有相关的库文件和最新的执行文件。
小结
我们在打包规范文章中,粗略的介绍了在国产化系统中进行二进制打包和源码打包的一些操作,主要符合了一些国产化商店的规范要求,比如所有的第三方软件都需要安装在/opt/apps/目录下,软件名称约定为com.apps.*,以及不能使用钩子,就是一些脚本文件,所以本篇也没有提及。
最后,对于本篇文章中的一些命令,比如dh_make,dpkg-deb,dpkg-buildpackage没有做过多的介绍,在Linux环境中可以使用man dpkg-deb这样的命令来查看相关的资料。