前两天接到一个活,对一款竞品的OCR识别结果进行分析统计,要对两万多张图片进行识别,然后统计各个字段的识别正确率,对于手动测试来讲,这基本上是不可能的。

  接到这活后立刻想到以下思路:对竞品代码进行反编译,在关键节点插入自己代码,对竞品选择图片和识别结果进行记录,然后自动化驱动模拟手动测试就行了,这是最快的解决方案。下午搞定,晚上挂上手机第二天就坐等结果了,可反编译后修改完代码编译打包失败,即使反编译后不进行任何代码修改重新打包都失败,以前遇到过类似的包,也google过原因和解决方案,没有很好的解决的办法,这条路算是走不通了;

  好在这款竞品图像识别的部分是通过JNI调用C++写的so文件,只要理清逻辑顺序,自己写一个demo同样调用也行,于是半个小时梳理了一下代码,他图片识别前要进行图片剪切,锐化处理,各种JNI调用要进行十好几次,果断放弃了;

  故事进行到这里就走不通了,然后adb shell进入手机去看看了缓存文件,发现它识别的一些数据缓存到本地数据库中了,但数据库中记录的文件名称不是输入图片的名称,是经过剪切锐化处理后的图片,而且名称是随机生成的,于是一个思路诞生了,我只要记录下图片输入的顺序,就能把图片名跟数据库中相应的记录一一对应。那怎么获取图片的顺序呢?查看了一下logcat输出,其并没有对选择图片进行记录输出,似乎又陷入了绝境。

  那就只有最后一个办法了,图片的位置是不会发生变化的,再写一个自动化程序对图片进行遍历,记录图片名称。于是整个思路成了:先把图片导入手机,运行自动化程序对手机图库进行遍历,获取图片名字,然后再运行一个自动化程序,按照图片遍历的顺序依次模拟手动进行图片输入识别,然后拉出数据库,进行数据提取整理,完成一一对应的过程比对结果,统计分析。这也是最后也是唯一的解决方法了,虽然有点麻烦,但总还是避免了大量人力浪费在这上边。

  对别人的app进行业务上的竞品对比,本来就很麻烦,因为你得不到对方开发团队的任何支持,所以必要的逆向工程技术,开阔的视野,灵活的思路对自动化人员来讲很重要。

 

  附记:做竞品测试时一定要注意对自己数据的保护,如果没有任何保护手段,那这次成功的竞品测试就给对手增加了两万的真实数据。

  通过对各种类型的app的逆向工程,我可以很负责任的说,不偷用户数据,安全性做得很好的app真的很少。

posted on 2014-05-07 13:08  salomon  阅读(1491)  评论(4编辑  收藏  举报