2. 野火demo 发布

上一章节讲了野火demo的编译,编译生成了ARM架构下的可执行文件。

这一章讲讲如何将野火demo打包,并发布给用户(主要讲Debian发布)。

2.1. 野火demo打包

首先野火工程分为三个子项目,App,QtUi和Skin。

App包括主程序,QtUi则是界面类的实现,Skin则是资源文件。QtUi和Skin最终以动态库的形式被App调用。

App中还会使用到很多资源以及部分配置文件等等这些都是需要打包进安装包的。

在工程目录下有提供一个打包脚本dpkg_ebf_qtdemo.sh

下面是 debian_buster 的打包脚本,请切换到该分支。

首先需要先编译我们的程序,参照上一章 野火demo 编译

然后切换到工程下面的 app_bin 目录,随后执行脚本

./dpkg_ebf_qtdemo.sh

dpkg_ebf_qtdemo.sh 脚本内容如下

Version=1.0.0.0
Package=ebf-6ul-test_1.0.0.0_armhf.deb

# if [ ! -e App ]; then
#     echo "Please compile the program first"
#     exit
# fi

echo "Package ${Package}"
echo "Version ${Version}"


echo -e "Copy temporary files"

#deb包 临时目录
PackageDir=ebfdemo

mkdir -p  $PackageDir

rm -rf $Package

USRLIB=$PackageDir/usr/lib
mkdir -p ${USRLIB}

#ffmpeg相关的库
cp -d -R ../ffmpeg/linuxlib/libavformat*              ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libavcodec*               ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libavutil*                ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libavfilter*              ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libswresample*            ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libavdevice*              ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libavfilter*              ${USRLIB}
cp -d -R ../ffmpeg/linuxlib/libswscale*               ${USRLIB}

#qtui和skin库
cp -d -R ../thirdpart/libskin/lib/libSkin*            ${USRLIB}
cp -d -R ../thirdpart/libqui/lib/libQtUi*             ${USRLIB}

#字体
# USRFONT=$PackageDir/usr/share/fonts
# mkdir -p ${USRFONT}
# cp -r    ttf/*                                      ${USRFONT}

#输入法
# INPUT=$PackageDir/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforminputcontexts/
# mkdir -p ${INPUT}
# cp -r conf/platforminputcontexts/libSoft-keyboard.so ${INPUT}

#qt-app中的资源文件和配置文件
APPINSTALL=$PackageDir/usr/local/qt-app
mkdir -p ${APPINSTALL}
cp -r        conf                                       ${APPINSTALL}
cp -r        dict                                       ${APPINSTALL}
cp -r        ebook                                      ${APPINSTALL}
cp -r        lrc                                        ${APPINSTALL}
cp -r        music                                      ${APPINSTALL}
cp -r        nes                                        ${APPINSTALL}
cp -r        notepad                                    ${APPINSTALL}
cp -r        photos                                     ${APPINSTALL}
cp -r        record                                     ${APPINSTALL}
cp -r        translations                               ${APPINSTALL}
cp -r        video                                      ${APPINSTALL}
cp -r        App                                        ${APPINSTALL}
cp -r        run.sh                                     ${APPINSTALL}

#修改脚本执行权限
chmod 775 $PackageDir/usr/local/qt-app/run.sh

#deb控制信息
echo -e "Creating deb control information"

# systemd执行qt run.sh
mkdir -p $PackageDir/lib/systemd/system
cat >$PackageDir/lib/systemd/system/ebf-qtdemo.service<<EOF
[Unit]
Description = ebf-qtdemo qtdemo

[Service]
ExecStart = /usr/local/qt-app/run.sh
Type = simple

[Install]
WantedBy = multi-user.target
EOF

mkdir -p $PackageDir/DEBIAN
# 添加程序信息
cat >$PackageDir/DEBIAN/control<<EOF
Package: ebf-qtdemo-test
Version: $Version
Section: utils
Priority: optional
Architecture: armhf
Depends:devscan,libts-bin,alsa-utils,qt5-default,libqt5multimedia5,libqt5multimedia5-plugins,gstreamer1.0-plugins-base,gstreamer1.0-tools,gstreamer1.0-plugins-bad,gstreamer1.0-plugins-good,gstreamer1.0-alsa,gstreamer1.0-libav
Installed-Size: 512
Maintainer: embedfire <embedfire@embedfire.com>
Description: soft package
EOF

# 添加自启动服务
cat >$PackageDir/DEBIAN/postinst<<EOF
#!/bin/bash
systemctl enable ebf-qtdemo
EOF

chmod 775 $PackageDir/DEBIAN/postinst


#打包
echo -e "Package..."
dpkg -b $PackageDir $Package

rm -rf $PackageDir

echo -e "Package complete"

脚本进行了如下工作

  • 复制我们指定的文件到ebfdemo这个文件下,比如我们交叉编译的ffmpeg,qtui和skin的lib等,defdemo相当于程序安装的根目录root

  • 添加程序控制信息,设置程序的自启动,依赖,标明程序架构等等信息

  • 打包程序。

最终就会生成一个 ebf-6ul-test_1.0.0.0_armhf.deb 的deb包,其版本为1.0.0.0

下面就是我们整个安装包的结构(不同分支的结构可能不同,修改打包脚本里面的cp文件部分实现):

cd ebfdemo
tree
.
├── DEBIAN
│   ├── control
│   └── postinst
├── lib
│   └── systemd
│       └── system
│           └── ebf-qtdemo.service
└── usr
    ├── lib
    │   ├── libavcodec.so -> libavcodec.so.57.107.100
    │   ├── libavcodec.so.57 -> libavcodec.so.57.107.100
    │   ├── libavcodec.so.57.107.100
    │   ├── libavdevice.so -> libavdevice.so.57.10.100
    │   ├── libavdevice.so.57 -> libavdevice.so.57.10.100
    │   ├── libavdevice.so.57.10.100
    │   ├── libavfilter.so -> libavfilter.so.6.107.100
    │   ├── libavfilter.so.6 -> libavfilter.so.6.107.100
    │   ├── libavfilter.so.6.107.100
    │   ├── libavformat.so -> libavformat.so.57.83.100
    │   ├── libavformat.so.57 -> libavformat.so.57.83.100
    │   ├── libavformat.so.57.83.100
    │   ├── libavutil.so -> libavutil.so.55.78.100
    │   ├── libavutil.so.55 -> libavutil.so.55.78.100
    │   ├── libavutil.so.55.78.100
    │   ├── libQtUi.so -> libQtUi.so.1.0.0
    │   ├── libQtUi.so.1 -> libQtUi.so.1.0.0
    │   ├── libQtUi.so.1.0 -> libQtUi.so.1.0.0
    │   ├── libQtUi.so.1.0.0
    │   ├── libSkin.so -> libSkin.so.1.0.0
    │   ├── libSkin.so.1 -> libSkin.so.1.0.0
    │   ├── libSkin.so.1.0 -> libSkin.so.1.0.0
    │   ├── libSkin.so.1.0.0
    │   ├── libswresample.so -> libswresample.so.2.9.100
    │   ├── libswresample.so.2 -> libswresample.so.2.9.100
    │   ├── libswresample.so.2.9.100
    │   ├── libswscale.so -> libswscale.so.4.8.100
    │   ├── libswscale.so.4 -> libswscale.so.4.8.100
    │   └── libswscale.so.4.8.100
    └── local
        └── qt-app
            ├── App
            ├── conf
            │   ├── asound.state
            │   ├── city.json
            │   ├── config.ini
            │   ├── cursor.json
            │   ├── lib
            │   │   ├── libgstaudiodecoder.so
            │   │   ├── libgstcamerabin.so
            │   │   ├── libgstmediacapture.so
            │   │   └── libgstmediaplayer.so
            │   └── platforminputcontexts
            │       └── libSoft-keyboard.so
            ├── dict
            │   ├── dict_pinyin.dat
            │   └── dict_pinyin_user.dat
            ├── ebook
            │   ├── 仙逆-上.txt
            │   ├── 仙逆-下.txt
            │   └── 仙逆-中.txt
            ├── InfoNes
            ├── lrc
            │   └── 猪之歌-香香.lrc
            ├── music
            │   ├── 猪之歌-香香.lrc
            │   └── 猪之歌-香香.mp3
            ├── nes
            │   ├── SuperMarie.nes
            │   ├── 超级玛丽无敌版.nes
            │   ├── 次银战士.nes
            │   ├── 飞机救人.nes
            │   ├── 疯狂赛车.nes
            │   ├── 魂斗罗.nes
            │   ├── 冒险岛1.nes
            │   ├── 冒险岛2.nes
            │   ├── 冒险岛3.nes
            │   ├── 忍者神龟3无限人.nes
            │   ├── 坦克大作战.nes
            │   └── 雪人兄弟.nes
            ├── notepad
            │   └── 野火开发板6ULL使用说明.txt
            ├── photos
            │   ├── 1.jpg
            │   ├── 2.jpg
            │   ├── 3.jpg
            │   ├── 4.jpg
            │   ├── 5.png
            │   ├── 6.png
            │   ├── 7.png
            │   └── 8.png
            ├── record
            │   ├── call_coming.wav
            │   └── net_off.wav
            ├── run_eglfs.sh
            ├── run.sh
            ├── translations
            │   ├── qt_en.qm
            │   └── qt_zh.qm
            └── video
                └── 123.mp4

如果想要我们上面打包好的 deb 在我们鲁班猫的板子上运行起来,需要先将deb包拷贝到开发板上,依次执行下面的命令:

sudo dpkg -i ebf-6ul-test_1.0.0.0_armhf.deb
sudo apt update
sudo apt-get -f -y install

建议开发板先烧录一个纯镜像,然后开发板联网,之后再才安装deb包。 使用纯镜像是避免文件冲突,联网则是安装野火demo运行所需要的依赖包。

当然最终效果可能不理想,比如触摸屏等等一些组件运行不起来,更多的细节请参考 野火demo 运行, 里面有更多的内容介绍了野火demo的运行环境,这里更多的是演示一个野火demo的发布过程。

2.2. 发布野火demo

上面的构建了一个deb包,并且可以通过离线的方式安装到我们的鲁班猫开发板上。 离线安装的方式更多的是用于调试,通常情况下我们是通过 apt 来安装。

比如安装我们完整的 野火demo 只需要执行

sudo apt install ebf-qtdemo

实际上这是一个很复杂的过程,apt是debian中一个管理源的工具。

Debian采用集中式的软件仓库机制,将各式各样 的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。 然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Debian用户随时都能获得最新版本的安装软件包。 因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)。

然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。 为了能够有选择地访问,在Debian系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。

野火软件源

deb [arch=armhf] https://cloud.embedfire.com/mirrors/ebf-debian buster main
deb [arch=armhf] https://cloud.embedfire.com/mirrors/ebf-debian carp-imx6 main

即使这样,软件源配置文件只是告知Debian系统 可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。

软件包管理系统使用一个私有数据库跟踪列表中软件包的当前状态:已安装、未安装或可安装。 apt-get通过该数据库来确定如何安装用户想用的软件包以及正常运行软件包所必须的其它关联包(软件包依赖关系),这大大简化了安装和卸载软件包的过程。 更新软件包管理系统时将扫描/etc/apt/sources.list文件中所指路径中的软件包列表文件,以便本地主机查询。

更新包管理工具数据库列表

sudo apt-get update

安装软件使用 sudo apt-get install xxx , xxx为你要安装的软件包。 这时,apt会扫描它的数据库找到最新的版本的软件包,并将它从sources.list中所指的地方下载到本地。 如果该软件包需要其它软件包才能正常运行,这时apt会做关联性检查并自动安装所关联软件包。

安装野火demo

sudo apt-get intsall ebf-qtdemo

安装野火demo会自动安装其他依赖,这里的依赖即打包脚本中的:Depends:devscan,libts-bin,alsa-utils

install_ebfdemo001

卸载野火demo以及相关联的依赖包

sudo apt-get remove ebf-qtdemo

apt包管理工具很强大,至于如何维护一个软件源,这里就不作展开,我们就暂时只介绍这些。