一、需求
由于在应用启动的前,可能会由于平台或外设不同的原因,导致应用启动时的参数发生变更,因此需要在应用移植时将应用与硬件进行解耦,因此需要在启动脚本之间进行数据传递,以实现通过平台启动脚本控制应用顺利启动的目的。
二、方案设计
2.1软件逻辑
由平台启动脚本sys_app.sh发起运行,通过应用配置脚本app_config.sh进行参数配置,最终转到应用启动管理脚本app_start.sh执行操作
2.2文件结构
- root
- sys
- shell
- sys_app.sh
- shell
- app
- shell
- app_config.sh
- app_start.sh
- shell
- sys
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文件夹即可。
六、总结
为方便协同开发而制定此方案,便于固件与应用独立维护。