一、需求

由于在应用启动的前,可能会由于平台或外设不同的原因,导致应用启动时的参数发生变更,因此需要在应用移植时将应用与硬件进行解耦,因此需要在启动脚本之间进行数据传递,以实现通过平台启动脚本控制应用顺利启动的目的。

二、方案设计

2.1软件逻辑

由平台启动脚本sys_app.sh发起运行,通过应用配置脚本app_config.sh进行参数配置,最终转到应用启动管理脚本app_start.sh执行操作

2.2文件结构

  • root
    • sys
      • shell
        • sys_app.sh
    • app
      • shell
        • app_config.sh
        • app_start.sh

2.3数据结构(举例)

  1. 脚本名称
  2. 分辨率
  3. 设备事件

三、脚本源码

3.1sys_app.sh

#!/bin/sh
echo "------sys_app-----"

head_path=$(dirname $(dirname $(dirname $0)))
app_path="app/shell/app_config.sh"
${head_path}/${app_path} $1

解析:

此文件内容固定,通过传递需要启动的应用名称参数实现控制应用启动。

3.2app_config.sh

#!/bin/sh
echo "------app_config-----"

#用户配置区域
#必备参数
app="wifiManager"
screen_width=1920
screen_height=1080
#可选参数
event="event2"

#自动化代码
if [ $1 ] ; then
    app=$1
fi
if [ ${event} ] ; then
    event="/dev/input/"${event}
fi
export  app=${app}
export  screen_width=${screen_width}
export  screen_height=${screen_height}
export  event=${event}
$(dirname $0)/app_start.sh

解析:

此文件中的用户配置区数据可随固件同步更改,从而决定使用不同的设备参数。将配置后的数据以export方法向外声明使用,最终运行app启动脚本。

3.3app_start.sh

#!/bin/sh
echo "------app_start-----"

#自动化代码

app_bin="app_bin"
cmd_app_file="app.ev"
cmd_width=" --width "${screen_width}
cmd_height=" --height "${screen_height}
cmd_must=${cmd_width}${cmd_height}

app_dir=./${app}/${cmd_app_file}

if [ ${event} ] ; then
    cmd_event=" --event "${event}
else
    cmd_event=""
fi

cmd_need=${cmd_event}
cmd=${cmd_must}${cmd_need}

echo ./${app_bin} ${app_dir} ${cmd}
./${app_bin} ${app_dir} ${cmd}

解析:

配置基本的应用启动指令,参数内容由app_config.sh提供。

四、运行效果

$ ./sys/shell/sys_app.sh test1
------sys_app-----
------app_config-----
------app_start-----
./app_bin ./test1/app.ev --width 1920 --height 1080 --event /dev/input/event2
./app/shell/app_start.sh: line 24: ./app_bin: No such file or directory

五、情况分析

5.1相同平台

5.1.1应用移植

直接将/root/app文件夹移植即可。

5.1.2应用与固件独立开发

固件配置情况在app_config.sh中进行,配置后上传git分支,不影响应用开发。

5.1.3立即启动

直接调用sys_app.sh脚本,参数传递要启动的应用名称,或对app_config.sh的默认应用名称进行配置,直接启动sys_app.sh而不传参。

5.2不同平台

5.2.1跨平台导致的路径问题

可在sys_app.sh中更改head_path,直接指向app文件夹即可。

六、总结

为方便协同开发而制定此方案,便于固件与应用独立维护。

01-15 23:59