前两天接到一个活,对一款竞品的OCR识别结果进行分析统计,要对两万多张图片进行识别,而后统计各个字段的识别正确率,对于手动测试来说,这基本上是不可能的。shell
接到这活后马上想到如下思路:对竞品代码进行反编译,在关键节点插入本身代码,对竞品选择图片和识别结果进行记录,而后自动化驱动模拟手动测试就好了,这是最快的解决方案。下午搞定,晚上挂上手机次日就坐等结果了,可反编译后修改完代码编译打包失败,即便反编译后不进行任何代码修改从新打包都失败,之前遇到过相似的包,也google过缘由和解决方案,没有很好的解决的办法,这条路算是走不通了;数据库
好在这款竞品图像识别的部分是经过JNI调用C++写的so文件,只要理清逻辑顺序,本身写一个demo一样调用也行,因而半个小时梳理了一下代码,他图片识别前要进行图片剪切,锐化处理,各类JNI调用要进行十好几回,果断放弃了;缓存
故事进行到这里就走不通了,而后adb shell进入手机去看看了缓存文件,发现它识别的一些数据缓存到本地数据库中了,但数据库中记录的文件名称不是输入图片的名称,是通过剪切锐化处理后的图片,并且名称是随机生成的,因而一个思路诞生了,我只要记录下图片输入的顺序,就能把图片名跟数据库中相应的记录一一对应。那怎么获取图片的顺序呢?查看了一下logcat输出,其并无对选择图片进行记录输出,彷佛又陷入了绝境。安全
那就只有最后一个办法了,图片的位置是不会发生变化的,再写一个自动化程序对图片进行遍历,记录图片名称。因而整个思路成了:先把图片导入手机,运行自动化程序对手机图库进行遍历,获取图片名字,而后再运行一个自动化程序,按照图片遍历的顺序依次模拟手动进行图片输入识别,而后拉出数据库,进行数据提取整理,完成一一对应的过程比对结果,统计分析。这也是最后也是惟一的解决方法了,虽然有点麻烦,但总仍是避免了大量人力浪费在这上边。app
对别人的app进行业务上的竞品对比,原本就很麻烦,由于你得不到对方开发团队的任何支持,因此必要的逆向工程技术,开阔的视野,灵活的思路对自动化人员来说很重要。测试
附记:作竞品测试时必定要注意对本身数据的保护,若是没有任何保护手段,那此次成功的竞品测试就给对手增长了两万的真实数据。google
经过对各类类型的app的逆向工程,我能够很负责任的说,不偷用户数据,安全性作得很好的app真的不多。图片