1. 场景:需要多次数统计Android的开机时间
在移植完汇编解释执行后,需要对比c++的解释执行和汇编解释执行这两种情况下的开机时间。一开始采用的比较土的自己掐秒表方法,但一方面需要统计的次数比较多,另一方面自己掐秒表太费时也太耗精力,如何使用shell脚本实现自己开机,统计。
首先通过查询,android启动成功的标志为Android字样出现,在riscv汇编解释执行的情况下在logcat中会生成I ActivityTaskManager: Displayed com.eswin.tv.launcher/.homepage.HomepageActivity:
,本来想直接查看logcat中该字符串出现的时间,但是在log中时间参数会发生两次跳变,因此需要通过计算自身pc的时间:从emulator启动到该字符串出现。
2. shell脚本需要注意的事项
- shell脚本其实就是在linux终端中敲得命令集合生成的一个文件,相当于我们把所有敲得命令都放到一个文件中,执行这个文件就可以直接运行很多代码。这样做可以大幅度减少测试的时间,提高开发的效率。最简单的shell脚本就是把你要执行的文件复制到一个sh文件中,然后执行。
- 在终端中创建一个shell脚本,此次创建的脚本名称为
launch_time.sh
,如果直接./launch_time.sh
那么是无法执行的,需要先进行增加权限操作chmod +x launch_time.sh
再./launch_time.sh
方可以执行。在一些情况下,不需要改变权限,通过source的方式可以直接运行脚本。但是在这次的测试的时候发现如果source launch_time.sh
终端会直接挂掉,具体原因不得而知。 - 在vscode中创建sh脚本文件最麻烦的一点就是没有命令的提示。这就导致在上下文中如果变量比较多,自己写就很容易写错。所以所有的变量不要手写,在定义一次之后就全部复制。比如我在写的时候就出现了这个问题:
sum_time=$(($sumtime+$total_time))
本意是实现sum_time每次运行之后加上total_time,但sumtime
和sum_time
在这里被我搞混了。在计算机眼中,这是两个变量,这就导致自加失败,因为sumtime如果没有定义的情况下,默认为0 - shell脚本和c语言不同之处在于,shell脚本不需要编译,而是直接运行,但是其语法与c又有相似之处。在shell脚本中,变量是不要定义的,可以直接使用比如
pid=1
。 - shell脚本对格式的要求是比较高的,很多地方必须要加上空格比如
if [ -n "$pid" ];then
-n前,“pid”后必须得有空格。在if和then之间需要加;
,但是在if的实现中是不需要加;
的。还有比如变量的定义pid=1
等号两边是不能空格的,如果写成pid = 1
就错了,这些在c语言中空格等不会影响程序。
#3、代码实现
function get_starttime(){
starttime=$(date +%Y-%m-%d\ %H:%M:%S)
# echo "start emulator: $starttime" | tee -a launch_time.txt
}
# function可以用来定义函数,其函数的定义格式和c比较像。
# 但是该函数没有返回值,如果调用该函数只不过是把这个函数中的代码进行移动。
# 如果定义的是函数,如果没有调用函数,该函数中的内容也不会执行。
# date指令可以实现打印时间,读者可以再终端中直接敲date命令,会显示出时间。
# %Y-%m-%d\ %H:%M:%S分别代表年月日,小时,分钟,秒:2021-03-25 17:00:22
#这个时间的格式也需要注意,因为接下来我们会用字符串出现的时间减去emulator开启的时间
# 所有变量的使用都要加上$ 不然默认的是字符串