总篇37篇 2019年第11篇
1、项目背景
移动互联网技术正以强劲的势头高速发展着,越来越多的用户倾向于从移动端获取信息,移动端也正成为广告主更喜欢的广告形式,移动广告支出的占比也在逐渐增大。然而由于移动网络的不稳定性、DNS劫持、设备兼容性等客观因素导致广告位无法正常显示,因此广告主也更加关注移动端广告是否可以精准显示。目前厂商和经销商投放广告后,要求公司广告服务团队每天都要将App端投放广告进行截图,作为广告核销的凭证。据抽样调查,每个广告每天截图(含查找、截取广告截图、生成凭证文档等工作)大约要花费10分钟。笔者所在部门设计研发了App端广告自动截图系统来减少了人工截图归档的时间和精力。
2、业务需求
App端广告截图系统需要稳定、准确、及时的捕捉实时投放的广告素材,具体包括如下几点。
每天全自动、实时、高准确率的截取广告位图片
广告位投放所有定位城市都需要截图
广告位截图保证真实性,截图中需要包含百度北京时间
自动将广告位截图按经销商维度分发给广告服务团队
3、系统设计与实现
针对业务需求,我们在设计App广告截图系统时主要遵循了如下原则。
定时自动获取正在投放的广告位及素材信息,自动创建和执行截图任务;基于macaca引擎实现自动化执行来保证素材投放一小时内截图成功;通过文字匹配和图片匹配相结合的方式保证截图准确率。
通过模拟接口中的GPS城市参数和页面城市参数来实现广告投放城市的模拟。
通过 WindowManager 来实现悬浮窗,将百度时间悬浮在手机右下角,与手机系统时间对比一目了然,保证截图的真实性。
广告截图名称规则采用广告位id+合同号,在分发给广告服务团队时根据合同号很方便的映射为经销商维度。
3.1、系统架构
App广告截图系统依据稳定、及时、准确运行的原则,垂直分层,提高各模块的复用性,具体设计如下。
设备层
基于我们前期研发的PhoneBus云测平台,全自动化管理手机来保证运行环境的稳定性,广告截图系统使用的设备随时可以以接口调用的方式来占用或释放设备。广告设备分为主设备和备用设备,一旦主设备异常,及时报警,可以自动切换到备份设备上,保证截图任务正常运行。
引擎层
引擎层主要包括 Macaca 引擎、脚本录制引擎、App适配引擎。
Macaca引擎,将来自服务器端的操作指令转换为Uiautomator可以识别的指令,驱动Uiautomator完成对应的操作。Uiautomator是随 Android SDK 一起发布的一个测试框架,该测试框架提供了一系列 API,利用这些 API 我们可以编程和安卓 App 进行交互。
脚本录制引擎,是在配置广告位脚本时使用,自动将手机上的操作转化为脚本。其原理是在操作App时,录制控件从手机上加载当前界面的HierarchyViewer,生成界面树,并根据当前点击的坐标,在界面树中映射为元素。如果该元素有唯一的resource-id,则生成脚本时优先使用。当没有resource-id,只有text属性时,则根据text属性生成脚本。如果前述两者都没有时,则根据当前节点的xpath来生成脚本。
App适配引擎,在运行广告位对应的脚本时无需考虑广告位属于哪个App,如汽车之家App和汽车报价App在自动化截图过程中的处理是一样的,由App适配引擎来根据广告位属性适配。
应用层
App截图系统应用层包括任务调度中心、车智投广告同步模块、广告维护模块、任务初始化模块、定位城市模拟模块、脚本转换模块、图片匹配模块、失败重试模块、广告分发模块。
任务调度中心负责定时执行车智投广告同步任务、重试策略,并管理待运行任务和设备资源,根据设备空闲情况调配资源,保证任务及时、顺利地执行。
车智投广告同步模块负责定时获取最新的广告位及素材信息,同步周期为10分钟,保证素材替换、新上素材可以及时地完成截图。
广告维护模块是指维护广告位在App中的到达路径。采用功能树的形式维护广告位可以一目了然的了解广告位所在页面。为了尽可能缩短广告位到达耗费时间,我们采用了脚本为主,DeepLink辅助的方式,如果广告位所在页面存在DeepLink,则优先使用DeepLink。
我们基于脚本录制引擎提供了简单易用的脚本录制功能,非研发同学也可以录制脚本。
任务初始化模块主要负责解析广告投放策略,按车系级别、燃料形式投放的广告,我们自动匹配出符合条件的车系和车型作为截图时使用的样例数据。并为文字链广告、图片广告、图文广告分别设定不同的运行策略。对于并非每次出现的广告位,制定重试策略。
定位城市模拟模块主要负责在截图时将手机定位信息修改为广告投放城市。我们选取android系统的设备作为截图设备使用,有两种方式实现模拟城市:一种是采用hook技术,将App中负责定位的方法覆写;另一种是采用接口mock技术,将App接口请求中的城市参数mock为目标城市信息,从而在App端渲染目标城市的数据。从稳定性和可扩展性角度考虑,我们采用了接口mock技术来模拟定位城市。
脚本转换模块,针对预先配置的广告脚本,在脚本中动态注入城市、车系、车型等信息,并在脚本中指定当前可用手机信息,将匹配策略插入脚本中,输出完整可执行的自动化脚本。
图片匹配模块,负责在包含图片素材的广告位截图中,匹配符合期望的截图。基于OpenCV实现图像模板匹配算法,将期望素材与备选截图进行对比,由于patch尺寸不同,需要进行滑动匹配窗口,扫面整幅备选截图获得最好的匹配patch。并在最符合的截图中以红框形式标识出广告位置,一目了然。
失败重试模块,主要为了保证广告截图稳定、可靠的运行,实现了多种重试策略。为了减少网络不稳定、应用卡死等现象对截图的影响,我们设定单一广告素材最多连续重试运行六次,如果仍失败,则标识为失败,继续运行其他广告素材,从而保证整体广告截图进度不受影响。当所有广告素材均运行至少一次后,再将失败状态的数据进行重试,如此循环,直到总次数操作12次停止,并及时报警。通常来说报警的广告位要么是广告显示有问题,要么是未正常漏出。这样我们就可以及时的发现问题,找广告组同事及时解决,避免给用户带来损失。
广告分发模块,将匹配成功的广告截图,支持按照经销商店铺维度和合同维度,自动生成监播证明,通过邮件或web的方式分发给广告服务团队。把广告服务团队从重复繁琐的截图工作中解放出来。
3.2、核心流程
App广告截图系统的核心流程如下图所示。
App广告截图系统主要包括三条流程:
拉取广告合同数据
App广告截图系统定时从媒介系统同步广告合同数据,获取广告位对应的销售顾问信息,在分发广告时只分发给负责的顾问。
同步广告素材数据
广告位每天都会有上线、下线、素材更换等操作,为了保证广告截图的准确性,App广告截图系统定时从车智投中同步正在投放的广告、投放策略及素材信息。解析投放策略后,根据类型不同自动创建截图任务。
自动截图流程
App广告截图系统提供了简便易用的脚本录制工具,新增广告位时,运营同学可以自行录制脚本。App广告截图系统将已录制的脚本转换为可执行脚本,在手机资源空闲时执行任务,自动查找脚本,截取图片。
目前App端广告主要有文字链、图片、图文三种形式。结合投放形式的不同特点,我们采用了不同的处理流程。
a) 文字链广告
对于文字链广告,在生成可执行脚本时,我们将广告文案作为检测目标,每执行一步脚本操作,在当前手机界面中查找广告文案,如果匹配则截图完成,如果不匹配则继续执行脚本。一旦匹配成功,文字链广告就进入分发流程。
在匹配文字链广告时我们发现广告素材经常出现一些特殊字符会造成匹配失败,所以我们将文字匹配算法优化为模糊匹配,提升匹配的稳定性。对于信息流中的广告,其特性是位置不固定,我们通过公用纵向滑动脚本+私有脚本的方式解决,公共纵向滑动脚本主要快速负责到达目标广告位附近,之后运行私有脚本,每次滑动屏幕的三分之一,保证目标广告位一旦出现,至少可以截取两屏图像。
b) 图片广告
由于图片广告的匹配依赖于图片比对算法,然而图片匹配耗费时间相对较长,如果在截图过程中实时比对,会大大减缓截图进度。所以我们将图片广告匹配设计为异步匹配。在运行脚本时,我们仅仅根据广告标识来截取备选图片,截图完成后推入匹配队列,图片匹配工具异步地从队列中消费,匹配完成后将结果回写。这样在保证截图准确性的前提下,将大大的提升图片广告的截图速度。
c) 图文广告
图文广告顾名思义,在截图过程中采用文字链的策略,截图完成后,再根据图片广告的策略进行匹配验证。从而保证图片真实地在手机上加载出来。
截图完成并匹配成功后,App广告截图系统会自动按照经销商和合同维度汇总,分发给广告服务团队,大大节约了在广告截图上耗费的时间。
4、应用效果
App广告截图系统已将经销商事业部负责的广告位纳入其中,目前已经稳定运行一个多月,成功率99.5%以上。在截图过程中也发现若干投放异常的问题,及时反馈给广告组同时解决,减少用户的损失。
图 经销商每日截图数量
App广告截图系统以机器自动匹配的方式替代繁琐重复的人工操作,可以将广告服务团队从广告截图工作中解放出来。
5、未来规划
后续我们将继续扩展和优化广告截图系统的,将截图系统和业务分离,通过业务适配层来兼容不同的广告业务,力争提升App广告截图系统的通用性和可扩展性