深度商店:应用投递
深度商店虽然同样采用 .deb 包的形式分发软件包,但是自2019年起深度商店规定了一种特殊的打包规则,并规定只有遵循此规则打包的应用才能上架应用商店。此规定将限制软件包中的大部分文件都将安装在 /opt
下,以便将系统软件和应用软件的安装位置区分开。深度安装器在全盘安装深度操作系统时,会将/opt
挂载于数据盘,同样被挂载于数据盘的还有 /home
和 /var
。
打包规范
下面将详细介绍投递应用需要遵循的打包规范。
应用标识(包名)
应用标识/包名(appid)是应用的唯一标识,深度商店只接受使用倒置域名规则命名的应用,如:
com.apps.demo
推荐使用你已经拥有的域名作为应用名称。如果使用未拥有的域名作为前缀,可能会引起该域名拥有者进行申诉,导致你的应用被删除。
目录结构
应用的全部安装文件必须在如下目录:
/opt/apps/${appid}/
应用根目录下面有 entries
和 files
两个目录和一个 info 文件。
大致的目录结构如下:
├── DEBIAN │ ├── control │ └── md5sums └── opt └── apps └── com.apps.demo ├── entries │ ├── applications │ │ └── com.apps.demo.desktop │ ├── icons │ │ └── hicolor │ │ └── scalable │ │ └── apps │ │ └── com.apps.demo.svg │ ├── mime │ │ └── packages │ │ └── com.apps.demo.xml │ ├── plugins │ │ ├── fcitx │ │ └── libinput.so │ │ └── browser │ │ └── libbrowser.so │ └── services │ │ └── com.apps.demo.xml ├── files │ ├── bin │ │ └── com.apps.demo │ ├── doc │ │ ├── changelog.gz │ │ └── copyright │ └── lib │ └── com.demo.app.so.5.2.1 └── info
info 文件
info 文件是应用的描述文件,使用 json 格式,info 内容模板如下:
{ "appid": "com.apps.demo", "name": "Demo", "version": "5.0.0.0", "arch": ["amd64", "mips64"], "permissions": { "autostart": false, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false }, "support-plugins": [ "plugins/demo" ], "plugins": [ "plugins/browser", "plugins/fcitx" ] }
info 文件中各个字段的说明如下:
- appid:应用标识
- name:应用名称
- version:应用版本,格式为 {MAJOR}.{MINOR}.{PATCH}.{BUILD},所有版本号均为纯数字
- arch:应用支持架构,当前商店支持如下CPU架构
- amd64:x86架构CPU
- mips64:龙芯系列CPU
- arm64:ARM64位CPU
- sw_64:申威CPU
- permissions:应用权限描述。
- autostart:是否允许自启动
- notification:是否允许使用通知
- trayicon:是否运行显示托盘图标
- clipboard:是否允许使用剪切板
- account:是否允许读取登录用户信息
- bluetooth:是否允许使用蓝牙设备
- camera:是否允许使用视频设备
- audio_record:是否允许进行录音
- installed_apps:是否允许读取安装软件列表
- support-plugins: 支持的插件类型
- plugins:实现的的插件类型,在对应的plugins目录下,按照实现的插件类型放置文件。
entries目录
存放程序的各种入口文件,一般在entries目录下应当有 applications
、autostart
、services
、plugins
、icons
等目录.开发者请按规范将对应的文件放到指定的目录进行打包,安装完成之后系统会自动链接到对应目录。
applications目录
applications是程序启动文件放置的位置,一般会有一个以appid命名的desktop文件放置在这个目录中。目前使用标准的desktop格式。
相关标准可以参考 [Desktop Entry Specification]
该目录中的所有文件将在安装时将其中的所有文件软链接至 /ust/share/applications
目录中。
autostart 目录(应用自启动)
程序自启动入口文件。注意如果需要程序自启动,请在 info 文件中配置打开自启动权限,即设置 autostart 为 true。
自启动权限为高风险权限,用户可以在不告知应用的情况下关闭应用的自启动权限。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /etc/xdg/autostart
目录中。
service 目录
程序注册的 dbus 服务目录,例如:
[D-BUS Service] Name=com.apps.demo Exec=/opt/apps/com.apps.demo/files/bin/com.apps.demo --dbus
一个应用只允许配置一个 service。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /usr/share/dbus-1/service
目录中。
plugins 目录
plugins 目录放置提供给其他应用使用的内容,plugins 目录下面可以有多个子目录。plugins 的目的是为了其他应用提供一种插件机制,使得其他应用程序可以访问本应用提供的内容。
- 在 plugins 目录中,必须以目标的插件类型(plugin-mimetype)子目录名称,在对应的插件类型子目录中放置需要共享给宿主应用的内容。
- 一个应用可以给多个应用提供插件,需要对每一个插件类型创建对应的子目录,并在里面放置共享的内容。
- 需要在描述文件中列出需要注入宿主应用的插件类型。
技术上,安装器将会根据 info 文件描述的 plugins 列表,将对应插件 link 到相关程序的/opt/apps/${target_appid}/plugins/${plugin-mimetype} 目录中, 同时在宿主应用程序启动时会设置一个 APP_PLUGIN_DIR,使得宿主程序可以获取注入的内容。 注意事项:
- desktop/service 请指向自己的应用目录的 /opt/apps/com.apps.demo/files 目录下的文件。
- 对于特殊的应用,有多个入口的 desktop 文件,表示功能不同的程序。对于这种需要有多个入口的程序,采用严格限制的白名单方式进行申请。一般应用程序不允许有多个入口的 desktop 文件。
- 在 plugins 机制中,plugins 的每一个子目录以及主程序目录均是无法相互访问的,在开发过程中请尤其注意这一点。
icons 目录
放置应用图标 icons,目录结构与系统 icons 目录结构保持一致即可,建议路径为 icons/hicolor/scalable/apps/com.apps.demo.svg,使用 svg 格式图标。
如果使用非矢量格式,请按照分辨率来放置图标,如:
icons/hicolor/24x24/apps/com.apps.demo.png icons/hicolor/16x16/apps/com.apps.demo.png
支持的分辨率包括: 16/24/32/48/128/256/512。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /usr/share/icons
目录中。
polkit 目录
polkit 是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。该目录用于存放 polkit 配置文件,文件是 XML 格式,以 .policy 结尾,目录结构与系统 polkit 目录结构保持一致即可。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /usr/share/polkit-1
目录中。
mime 目录
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。该目录用于存放 mime 配置文件,目录结构与系统 mime 目录结构保持一致即可,文件是 XML 格式,以 .xml 结尾。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /usr/share/mime
目录中。
fonts 目录
存放字体和配置文件,包含 files 和 conf 两个子目录。
- files 用来保存字体文件目录结构与系统 fonts 目录结构保持一致即可
- conf 目录用来存放字体配置
该目录中 files 目录和 conf 目录中的所有文件将被软链接至 /usr/share/fonts
目录中。
printer 目录
用于存放打印机支持相关文件,包含 model、conf、filter 和 backend 四个子目录。
- model 用来保存 cups 过滤器模板 pdd 文件
- conf 保存 cups 服务 printer 配置目录
- filter 用来指出对于相应的 MIME,该找到哪个 filter 转换它
- backend 用来保存打印机进一步处理的可执行文件目录
软链接位置:
model:/usr/share/cups/model conf:/etc/cups filter:/usr/lib/cups/filter backend:/usr/lib/cups/backend
locale 目录
locale 是国际化与本土化过程中的一个非常重要的概念,目录结构与系统 locale 目录结构保持一致即可。
该目录中的所有文件将在安装时将其中的所有文件软链接至 /usr/share/locale
目录中。
files 目录
存放应用程序需要的各种文件,对于该目录放置文件并无限制,但是建议将可执行程序放置到 bin 子目录。应用程序或者插件依赖的第三方库推荐放置在/opt/apps/${appid}/files/lib 目录,启动时建议使用脚本添加环境变量启动,不允许安装到系统目录。
注意:lib 目录下的库请不要相互依赖,否则可能会导致应用启动插件库加载不正常。
文件系统权限
系统目录
系统分区为只读状态,主要用于为应用提供基本的运行依赖库。请不要依据系统目录内容来做任何特性,后期系统将会将应用运行在沙箱中,系统目录中的内容将会都不可信。
用户目录
软件包不允许直接向 $HOME 目录直接写入文件,后期系统将会使用沙箱技术重新定向 $HOME,任何依赖该特性的行为都可能失效。
建议应用使用如下环境变量写入数据和配置:
$XDG_DATA_HOME $XDG_CONFIG_HOME $XDG_CACHE_HOME
以下目录可能需要用户同意才能进行写入
$XDG_DESKTOP_DIR="$HOME/Desktop" $XDG_DOCUMENTS_DIR="$HOME/Documents" $XDG_DOWNLOAD_DIR="$HOME/Downloads" $XDG_MUSIC_DIR="$HOME/Music" $XDG_PICTURES_DIR="$HOME/Pictures" $XDG_PUBLICSHARE_DIR="$HOME/Public" $XDG_TEMPLATES_DIR="$HOME/Templates" $XDG_VIDEOS_DIR="$HOME/Videos"
相关标准可以参考[ XDG Base Directory Specification]
注意事项
- 禁止使用 deb 的 postinst 等钩子对系统进行修改,包含这些脚本的软件包都无法上架
- 应用只允许使用普通用户权限启动,禁止应用以任何形式获取root权限。
应用投递平台
想要为 deepin/UOS 商店投递应用,可前往 https://store.chinauos.com/ 进行注册成为开发者,然后便可以进行软件的投递。投递的软件将经过自动化及人工审核,审核通过后便会上架应用商店。