UI自动化技术在高德的实践
一、背景
汽车导航作为ToB业务,需要满足不同汽车厂商在功能和风格上体现各自特色的需求。针对这种情况,传统的UI开发方式,基本上是一对一的特别定制。但是这种方式动辄就要500~600人日的工作量投入,成为业务发展的重要瓶颈。因此,能够对导航UI进行快速定制开发,成为汽车导航业务UI开发的必解课题。
高德地图技术团队希望打造一套快速精准的UI解决方案,通过自动化的方式生产UI代码,解放研发生产力的同时满足客户需求。
二、方案调研
为了避免重复造轮子,我们调研了行业上现有的UI自动化生成方案。主要分为两种:
Sketch插件方案:

该方案是基于Sketch开发插件,利用SketchAPI读取出图层信息转换DSL,主要代表作有imgcook、Dapollo等。
优势:从SketchAPI可以读取到非常详细的信息,足以生成高质量的界面代码。
劣势:要求效果图必须使用Sketch制作,并且对效果图会有一定的制图要求。
图片转代码方案:

该方案是通过经训练的深度神经网络,从截图或手稿直接生成UI代码,主要代表作有pix2code、Sketch2Code等。
优势:简单粗暴,通过截图或手绘就可以生成界面资源代码。
劣势:图层细节丢失,识别准确率欠佳、自适应不好。
调研总结:
- Sketch插件方案更加适合工程化使用,图片转代码方案更加适合用于快速生产原型。
- 目前行业上并没有能完全满足车载导航业务使用的UI自动化解决方案。
基于以上调研结果,我们决定基于Sketch插件方案,自研适合高德汽车业务需求的UI自动化方案。
三、技术方案与实践
结合Sketch插件方案的工作流以及高德内部的人员体制,我们将UI自动化解决方案在高德内部的使用过程拆分成4大环节,如下图所示:

制作环节
提供效果图编辑的能力:
- 制作带有主题信息的控件库供设计师拖拽使用。
- 对生成环节需要的信息进行输入(比如布局、控件、动画等)。
生成环节
提供资源的生成能力:
- 生成xml、drawable、png、asvg等资源,同时打包成可执行程序,用于验证环节。
- 对生成资源进行性能优化(如控件智能合并、png图片无损压缩,asvg生成)。
验证环节
提供多设备、多分辨率的还原度精准验证能力:
- 效果图质量检测能力,提前发现效果图像素偏差,不符合设计规范等问题,降低后期成本。
- 布局意图标注能力,通过简单的布局意图标注后,能实现把效果图拉伸成任意分辨率,解决设计师和开发人员沟通不流畅问题,降低沟通成本。
- 对比验证能力,通过坐标对比、截图和效果图差分对比等方式,实现还原度的像素级验证,保障资源质量。
应用环节
客户端工程资源管理能力:
- 通过一系列工具链,简化资源对接成本(如资源导入工具、重复资源清理工具等)。
- 开发DHMI主题定制平台,提供给设计师或客户,实现可视化的快速修改客户端主题,自主验证的能力。满足客户不断增长的主题定制需求,实现千人千面。
四、技术难点
1、控件体系
Sketch的图层只有text、shape两种类型,分别可以对应上Android的TextView和ImageView,但是只有这两种控件无法满足业务需求。参考Android控件体系中基础控件+自定义控件的方式,我们对这两种类型图层进行组合+继承,得到两种新的控件类型。

基础控件:Android原生控件集合,如TextView、EditText、ProgressBar等,能满足界面搭建的基本需求。
扩展控件: Android自定义控件,又分为以下两类:
业务控件:用于解决Sketch静态设计无法满足的部分,如需要canvas paint的控件。设计师只需画出静态部分,让开发人员自由发挥,能满足界面设计上动态元素、复杂元素的需求;同时也能形成控件库积累。
主题控件:大多数情况作为底色色块,实现App换肤的能力,支持在DHMI主题平台上做主题样式编辑。控件之间也支持互相组合,如多个主题控件和基础控件可以组合成一个新的业务控件。
通过基础控件和扩展控件的搭配使用,在实际生产中证实,这套控件体系可以无限扩展,做到全覆盖,满足任意界面的搭建需求。
示例
基础控件:

业务控件:


2、布局体系
布局的选择
布局采用的是约束布局ConstraintLayout。
优势:
- 扁平化,理论上一个层级可以完成复杂界面的设计,相比传统布局,性能会有很大的提升。
- 简单易懂,贴近UED界面设计思路。
- 通过正向推导与反向逆推,证明该布局可以替代Android平台目前所有的布局,支持搭建任意界面。
布局识别算法
布局识别算法是在设计稿上基于位置关系推算布局约束关系的一种算法。
布局识别的难点:
- 主观性太强,容易出现误识别,没有绝对的规律。
- 交互动态性如何识别。
- 识别出的布局需要能支持多分辨率适配(横屏、竖屏、宽屏、方屏)。

3、主题定制
由于车载导航面向的对象是车厂客户,不同的客户对于应用的UI或者主题是有不同需求的,也就是说针对不同客户,不同渠道的版本,需要有不同的应用主题。随着项目的增多,如果没有一个灵活,易管理,低成本的主题定制方案,那么这将是一个噩梦的开始。
传统的实现方案

DHMI主题定制方案


具体实现如下
- 设计师在界面设计时,通过主题控件库拖拽的方式搭建界面。
- UI自动化生成环节生成主题相关资源集成到客户端。
- DHMI平台部署主要界面的关键场景。
- 设计师通过点哪改哪,实时预览的方式定制界面主题。
- 设计师自主出包还原度验收,全程无需研发参与。
五、小结
能力建设完成后,设计师和开发人员效率都得到极大提升。对于设计师,整体成本降低50%以上,有助于设计规范更好的落地,省去标注和切图环节,精准的还原度验收,快速的主题定制。对于开发人员,UI开发成本降低80%以上,不用再操心如何开发UI,只需关注资源如何对接,完善的资源管理工具链,低成本的版本迭代,主题定制0成本。

UI自动化技术在高德的实践的更多相关文章
- 高德SD地图数据生产自动化技术的路线与实践(道路篇)
一.背景及现状 近些年,国内道路交通及相关设施的基础建设日新月异.广大用户日常出行需求旺盛,对所使用到的电子地图产品的数据质量和现势性提出了更高的要求.传统的地图数据采集和生产过程,即通过采集设备实地 ...
- Android手机QQ的UI自动化实践
本文首发于果的博客园,原文链接:https://www.cnblogs.com/yuxiuyan/p/14992682.html, 转载请注明出处. UI自动化 我们为什么要搞UI自动化 可能很多同学 ...
- 微信小程序UI自动化:实践之后的记录01-选择工具/框架
目录 1. 前言 2. 工具/框架/库选择 2.1 miniprogram-automator官方介绍(摘自官方哈) 小程序自动化 特性 2.2 minium官方介绍 特性 3. 如何选择 4. 对应 ...
- 【Android测试】UI自动化代码优化之路(临时发布, 随时删除)
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...
- 【Android测试】UI自动化代码优化之路
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...
- 阿里CI/CD、DevOps、分层自动化技术
原文地址:http://www.infoq.com/cn/news/2017/01/alibaba-yunxiao-cicd-devops 在互联网时代,产品快速迭代的重要性不言而喻.不管是传统企业还 ...
- UI自动化,你值得拥有
去年春节联欢晚会,为了那张“敬业福”,全家都卯足了劲儿“咻一咻”,连节目都顾不上看了.当时我就想,要是能自动化该多好,不停点击屏幕,屏幕不疼手还疼呢,何况还不好分心,生怕错过了“敬业福”.玩“咻一咻” ...
- Appium UI自动化的那些梗
@作者 彭海波 转载请注明出处 前言 由于需求的快速迭代和敏捷测试的要求,在测试过程中引入自动化成为必不可少的手段.作为一个互联网测试团队,我们自然也引入了自动化测试这个环节.在众多的测试框架中,我们 ...
- 洗清UI自动化鸡肋说的不白之冤
人类文明发展的一个重要标识是工具的诞生,当人类开始制作工具来提高生产力时,就逐渐拉开了与其他生物的距离.曾在2013年,<Google如何测试软件>中提到的分层自动化金字塔,轰动业界.而在 ...
随机推荐
- CSS-09-背景属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- GPU与CPU
GPU与CPU CPU CPU,也就是中央处理器,结构主要包括控制器(指挥各部分工作).运算器(实现数据加工).寄存器.高缓以及数据/控制/状态总线.计算机的性能很大程度上依赖于CPU,CPU的功能包 ...
- Git详解之特殊配置与钩子应用
前言 到目前为止,我阐述了 Git 基本的运作机制和使用方式,介绍了 Git 提供的许多工具来帮助你简单且有效地使用它. 在本章,我将会介绍 Git 的一些重要的配置方法和钩子机制以满足自定义的要求. ...
- Prometheus学习笔记之教程推荐
最近学习K8S和基于容器的监控,发现了如下的教程质量不错,记录下来以备参考 K8S最佳实战(包括了K8S的Prometheus监控和EFK日志搜集) https://jimmysong.io/kube ...
- requestAnimationFrame 与 seeTimeout 的区别
requestAnimationFrame 随着浏览器的刷新而执行. let a = () =>{ doSomething() ; window.reques ...
- 11、ACL
IP访问控制列表 标准ACL 1)检查源地址 2)不能对协议簇作限定 扩展ACL 1)检查源和目标地址 2)能容许或拒绝特定的协议和应用(端口号) 区别列表类型: 1)ACL号 : 1-99,1300 ...
- 构建一个学生Student,根据类Student的定义,创建五个该类的对象,输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。
定义一个表示学生信息的类Student,要求如下: (1)类Student的成员变量: sNO 表示学号: sName表示姓名: sSex表示性别: sAge表示年龄: sJava:表示Java课程成 ...
- 时序数据库 Apache-IoTDB 源码解析之文件索引块(五)
上一章聊到 TsFile 的文件组成,以及数据块的详细介绍.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件数据块(四) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star. ...
- LeetCode227:基本计算器II
感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客. 题目: 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式仅包含非负整数 ...
- eclipse运行python 安装pydev 版本匹配问题
Eclipse 4.5, Java 8: PyDev 5.2.0 PyDev 5.2.0 版本路径:https://dl.bintray.com/fabioz/pydev/5.2.0 1.安装时注意: ...