深度商店:应用投递

来自Deepin Community Wiki
跳到导航 跳到搜索

深度商店虽然同样采用 .deb 包的形式分发软件包,但是自2019年起深度商店规定了一种特殊的打包规则,并规定只有遵循此规则打包的应用才能上架应用商店。此规定将限制软件包中的大部分文件都将安装在 /opt 下,以便将系统软件和应用软件的安装位置区分开。深度安装器在全盘安装深度操作系统时,会将/opt挂载于数据盘,同样被挂载于数据盘的还有 /home/var

打包规范

下面将详细介绍投递应用需要遵循的打包规范。

应用标识(包名)

应用标识/包名(appid)是应用的唯一标识,深度商店只接受使用倒置域名规则命名的应用,如:

com.apps.demo

推荐使用你已经拥有的域名作为应用名称。如果使用未拥有的域名作为前缀,可能会引起该域名拥有者进行申诉,导致你的应用被删除。

目录结构

应用的全部安装文件必须在如下目录:

/opt/apps/${appid}/

应用根目录下面有 entriesfiles 两个目录和一个 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目录下应当有 applicationsautostartservicespluginsicons 等目录.开发者请按规范将对应的文件放到指定的目录进行打包,安装完成之后系统会自动链接到对应目录。

Note: 安装后自动链接该目录是 deepin 和 UOS 特有的机制,该机制在其他基于 Debian 的发行版上无效。也就是说,按照此规范制作的 deb 包将不能在其他发行版中达到预期效果。
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 的目的是为了其他应用提供一种插件机制,使得其他应用程序可以访问本应用提供的内容。

  1. 在 plugins 目录中,必须以目标的插件类型(plugin-mimetype)子目录名称,在对应的插件类型子目录中放置需要共享给宿主应用的内容。
  2. 一个应用可以给多个应用提供插件,需要对每一个插件类型创建对应的子目录,并在里面放置共享的内容。
  3. 需要在描述文件中列出需要注入宿主应用的插件类型。

技术上,安装器将会根据 info 文件描述的 plugins 列表,将对应插件 link 到相关程序的/opt/apps/${target_appid}/plugins/${plugin-mimetype} 目录中, 同时在宿主应用程序启动时会设置一个 APP_PLUGIN_DIR,使得宿主程序可以获取注入的内容。 注意事项:

  1. desktop/service 请指向自己的应用目录的 /opt/apps/com.apps.demo/files 目录下的文件。
  2. 对于特殊的应用,有多个入口的 desktop 文件,表示功能不同的程序。对于这种需要有多个入口的程序,采用严格限制的白名单方式进行申请。一般应用程序不允许有多个入口的 desktop 文件。
  3. 在 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/ 进行注册成为开发者,然后便可以进行软件的投递。投递的软件将经过自动化及人工审核,审核通过后便会上架应用商店。