前言
在平时的项目开发过程中,除了业务逻辑的编写以外,还有一些其它的琐事需要处理,比如资源更新、单元测试、资源压缩等。本文旨在说明如何通过脚本来处理一些代码逻辑之外的琐事,让开发者更加专注于业务的开发。
一、
什么是脚本
脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。
二、
使用场景示例
1
crash日志格式化
需求描述:项目中做了崩溃异常捕获的机制,当app发生崩溃时,保存当时的栈信息,保存在SD卡中。如果当时没有连上AS调试,那么可以去SD卡中的.crash文件夹中查看对应app包名的文件夹中的不同时间的崩溃信息文件。但是有个小问题,里面关于崩溃信息的是单行的文本,如果信息很长不好定位问题所在。大概长这样:
\n\tatandroid.app.FragmentManagerImpl.moveToState(FragmentManager.java\:993)\n\tat android.app.FragmentManagerImpl
分析一下就可以看出,是转义字符出现了问题。\n保存成了\\n;\t保存成了\\t。可以手动在需要制表符的地方空4格,需要换行的地方按下回车换行。但是对于崩溃日志比较长的文本就会很费时。
使用脚本:
方案一:使用C语言写一个控制台程序,读取文件中的内容将\\n转换成\n,将\\t转换成\t。再使用批处理文件调用这个控制台程序,传入文件的路径作为参数即可。批处理接收文件的路径作为参数。
C语言的代码如下:
char buff[300000] = {0};
ifstream myfile(argv[1]);
myfile.read(buff, 300000);
myfile.close();
int len = strlen(buff);
/// 处理一下 遇到 \\n \\t 就转换为\n \t
for (size_t i = 0; i != len - 1; i++)
{
if (buff[i] == '\\' && buff[i + 1] == 'n')
{
buff[i] = ' ';
buff[i + 1] = '\n';
}
else if (buff[i] == '\\' && buff[i + 1] == 't')
{
buff[i] = ' ';
buff[i + 1] = '\t';
}
}
生成一个convertLog.exe,在批处理中进行调用代码如下:
call convertLog %1
可以将崩溃文件直接拖到该批处理上,批处理会将该文件的路径作为第一次参数,并传递给convertLog的可执行程序。
方案二:
使用python直接转换代码如下:
# -*- coding:utf-8 -*-
text = open('crash.cr').read()
print(text.replace("\\n", "\n").replace("\\t", "\t"))
两行代码搞定,前提是要安装python3的环境。
2
切换手机屏幕分辨率
项目中的app是为1920×1080分辨率的机器开发的,后来公司准备要推出一款1080×720分辨率的机器,需要将app都适配到新的机器上。但是机器正在研发暂时没有样机,不能在1080×720的机器上调试。后来有位大神就提出可以修改1920×1080手机的配置,让其模拟1080×720的分辨率。
具体步骤是:
要修改/system/build.prop文件需要先将该文件pull出来,修改了内容以后再pull进去,pull的时候需要设置文件为可写。由于在app适配的过程中需要经常来回切换分辨率查看不同分辨率下的效果,重复性比较高,而且比较繁琐,所以就想到利用脚本来自动切换分辨率。
脚本方案:
首先预先修改好对应的分辨率的build.prop文件中的内容,切换到不同的分辨率直接push对应的文件即可。具体代码如下:
set device=M166023E2K
adb -s %device% root
adb -s %device% remount
adb -s %device% shell "chmod 777 /system/build.prop"
adb -s %device% push 320/build.prop /system/
adb -s %device% shell "wm size 720x1280"
adb -s %device% reboot
pause
切换到不同的分辨率修改其中的文件路径和设置的分辨率即可。我是写了两个批处理,这样在切换到不同分辨率时双击运行对应的批处理即可。几秒搞定,再也不用记那些繁琐的命令了。
3
资源更新
需求描述:项目中会使用到的一些资源如图片、音频、视频、字体、H5页面等。当资源有更新时我们需要将更新的资源同步到我们的res或者assets中。以下以图片为例。
一般的做法是:视觉的同事将图片完成放到图片的服务器上,软件的同事将图片从图片服务器上将图片拷贝到工程的资源文件夹中进行替换或者新建。
这其中可能会有问题:
1、视觉的同事输出的图片名称为了辨别很多都是用的中文,我们在拷贝到工程中的时候需要进行改名,改成我们工程中需要的英文名称;
2、当文件比较多的时候,对少量的文件更新定位文件也比较麻烦,省事的做法就是全部替换一遍。在项目开发过程中资源的修改会经常有,会浪费我们不少时间。
使用脚本:本人是在Windows下面开发,所以优先使用的是批处理。 使用脚本从图片服务器上拷贝图片到工程的res文件夹并重命名图片;
关键代码如下:
@echo off
set SRC_PATH=\\192.168.100.230\项目文件\某个项目
set DEST_PATH=D:\项目\某个项目\resset
src_name=%1
set dest_name=%2
copy "%SRC_PATH%\%src_name%.png" "%DEST_PATH%\%dest_name%.png"
将该批处理命名为pullPic.bat,但是这个是单个图片进行的操作。该批处理使用的是输入的两个参数作为初始的名称和修改后的名称。
为了实现批量操作,需要一个改名表。可用excel来保存改名表,这个表可以由美术人员或者软件人员维护,当有资源新增时修改excel中的数据即可。改名表形式如下:
将原名称放在C列,将目标名称放在D列。A列放批处理的命令,B列放刚才的批处理的名称。
可以复制ABCD中所有的内容保存到文本中保存为pullAllPic.bat。直接从excel复制到notepad++中的形式如下:
保存成批处理后可直接运行,在需要更新资源的时候,直接双击pullAllPic.bat即可。几秒钟搞定。
4
资源压缩
需求描述:为了减少apk的体积,很多资源图片是可以在无损失或者轻微损失不影响视觉的情况下进行压缩的。压缩后可以明显的减少apk的体积。
目前有几种压缩的方法:
方法一:到www.tinypng.com 网站上进行压缩,这种比较麻烦,需要上传到网站上,压缩后还需要下载,如果是批量下载还要解压等,而且需要网络,很可能还带有泄漏图片资源的风险;
方法二:使用PngYu进行压缩直接将图片的文件夹拖进去,点击开始即可进行压缩。这种是比较方便的,但是也还是要进行拖动等等的操作。其实查看这个软件的工作目录,会发现这个软件其实是使用一个叫pngquant.exe的控制台程序进行压缩的。
我们可以利用脚本直接调用这个控制台程序进行压缩即可,关键代码如下:
echo "开始处理..."
for /R %%i in (123\*.png) do (
pngquant -f --ext .png --quality 80-80 "%%i"
)
pause
说明:80这个参数是经过验证的,这个参数下不会失真且压缩率比较高。当我们在发布apk之间双击一下批出及几秒钟搞定资源压缩。
5
monkey测试
需求描述:使用adb的monkey命令可以对我们的apk进行一些随机事件的测试。平时我们有些很难操作出来的情景可以通过monkey出现。monkey跑通过了说明我们的项目的稳定性较好。我们的项目中对稳定性要求是:连续48小时monkey不应出现闪退和anr的问题,每次跑完monkey以后需要把monkey的结果放到以供分析。一般流程是:打开cmd,输入monkey命令,跑完monkey以后,打开文件服务器,将生成的monkey文件拷贝到对应的目录。
其实可以使用脚本来进行这些操作。如果对monkey的命令不熟悉的话每次去跑monkey的时候,也需要去网上查找一下命令,如果放在批处理中,每次双击运行就好。批处理其实也是一个文档。脚本如下:
@echo off
adb shell monkey -p com.example.test -vvv 100000 >test.txt
copy test.txt \\192.168.100.230\个人文件\monkey\
pause
跑10w次monkey,跑完以后将生成的文件拷贝到文件服务器中的某个路径。需要跑monkey的时候双击运行脚本就可以了。
三、
自定义脚本控制台
上面说了几种使用脚本的方案,其实都比较散的点,现在我们将这些功能整合起来,定义自己的脚本控制台。步骤如下:
步骤一:在项目的根目录的中新建一个scripts的文件夹。
将以上的脚本都放在该目录中,名称分别为:updateRes.bat(更新资源)、zipRes.bat(压缩资源)、unitTest.bat(单元测试)、runMonkey.bat(monkey测试)。注意路径变换后这些批处理中的相对路径需要改变。
步骤二:定义一个与项目名称相同的批处理,如TestProject.bat用来调度其它批处理。
代码如下:
@echo off
if "%1"=="updateRes" call updateRes.bat goto END
if "%1"=="zipRes" call zipRes.bat goto END
if "%1"=="runMonkey" call runMonkey.bat goto END
if "%1"=="unitTest" call unitTest.bat goto END
echo wrong param
:END
pause
步骤三:将该scripts文件夹添加到系统的环境变量中。
使用:当需要更新资源的时候,在任何地方打开命令行,输入TestProject updateRes即可更新资源,其它的使用类似。
结语
我们的愿景是:项目一键测试、一键部署、一键发布。在项目开发的过程中能够将主要精力集中在业务的逻辑上,而不是被一些琐事浪费时间。
批处理文件也是文档,如果有新人进入团队,可以让他查看脚本文档,也可以对项目的工作流程有一定的理解。
以上只是说了一些很简单的应用,还有一些其它的可以需求可以使用脚本来实现。当在工作中需要做一些重复的工作就要考虑到是否可以使用工具来实现。希望大家多动脑筋,做一个懒人。
小贴士
本文版权归Open软件开发小组所有,如需转载请联系主编申请授权。