Android自动化测试实战:Python+Appium +unittest
上QQ阅读APP看书,第一时间看更新

2.1.1 Android

Android(安卓)是一种基于Linux内核(不包含GNU组件)的自由及开放源码的操作系统。该系统最初由安迪·鲁宾(Andy Rubin)开发,主要支持手机,2005年8月由Google收购并注资。2007年11月,Google与84家硬件制造商、软件开发商及电信运营商组建开放手持设备联盟共同研发Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源码。第一部Android智能手机发布于2008年10月。后来,Android逐渐扩展到平板电脑及其他领域,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android系统在全球的市场份额首次超过Symbian系统,跃居全球第一。2013年第四季度,Android手机的全球市场份额已经达到78.1%。2013年9月24日,Android迎来了5岁生日,全世界采用这款系统的设备已经达到10亿台。2022年5月12日,Google正式发布Android 13。

图2-1 Android Logo

Android的标志(Logo)是由Ascender公司的布洛克设计的,诞生于2010年,其设计灵感源于男女公共卫生间门上的图形,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐,头上有两根天线,Android机器人便诞生了。自Android 10开始,Android启用了全新的logo,采用Android机器人和黑色的“android”文本,如图2-1所示。

(1)Android发行版本

Android在正式发行之前拥有两个内部测试版本,这两个版本以两个著名的机器人命名,它们分别是铁臂阿童木(Astroboy)和发条机器人(Bender)。后来由于涉及版权问题,从2009年5月开始,Android操作系统改用甜食(个别除外)来为版本命名,这些版本按照大写首字母的顺序排列分别是纸杯蛋糕(Cupcake)、甜甜圈(Donut)、闪电泡芙(Eclair)、冻酸奶(Froyo)、姜饼(Gingerbread)、蜂巢(Honeycomb)(不是以甜食命名)﹑冰激凌三明治(Ice Cream Sandwich)、果冻豆(Jelly Bean)、奇巧(KitKat)、棒棒糖(Lollipop)、棉花糖(Marshmallow)、牛轧糖(Nougat)、奥利奥(Oreo)、果馅派(Pie),Android 10(Q)首次不用甜食来命名。

(2)Android定制系统

随着Android系统的流行,许多手机厂商在其引入国内后,开始对Android系统进行“深度定制”。发展至今,国内Android手机搭载的基本上都是手机厂商在原生Android系统基础上,根据使用习惯设计、改进的定制款操作系统,常见的有:

小米手机的MIUI;

OPPO手机的ColorOS;

vivo手机的OriginOS。

(3)Android体系架构

Android的体系架构和其操作系统一样,采用了分层的架构。从图2-2所示架构来看,Android分为4层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

图2-2 Android体系架构

应用程序层。

Android会同一系列核心应用程序包一起发布,该应用程序包包括桌面、SMS短消息、日历、地图、通话、浏览器、联系人管理程序等应用程序,都是使用Java语言编写的。

应用程序框架层。

开发人员可以完全调用核心应用程序所使用的应用程序框架。该应用程序的架构设计简化了组件的重用,任何一个应用程序都可以发布它的功能块并且任何其他的应用程序都可以使用其发布的功能块(不过得遵循框架的安全性)。同样,该应用程序重用机制也使用户可以方便地替换程序组件。

系统运行库层。

Android包含一些C和C++库,这些库能被Android系统中不同的组件使用,并通过 Android 应用程序框架为开发者提供服务。

Linux内核层。

Android运行于Linux内核(kernel)之上,但并不是GNU/Linux。因为一般GNU/Linux支持的功能,Android大多都不支持,甚至Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android以Bionic 取代Glibc、以Skia 取代Cairo、又以OpenCore取代FFmpeg等。Android为了实现商业应用,必须移除被GNU通用公共许可证(GNU General Public License,GNU GPL)约束的部分,例如Android将驱动程序移到 Userspace,使得Linux驱动程序(driver)与 Linux kernel彻底分开。

Android的Linux kernel控制包括安全(Security)、内存管理(Memory Management)、过程管理(Process Management)、网络堆栈(Network Stack)、驱动程序模型(Driver Model)等。

(4)Android开发四大组件

Android开发四大组件分别是活动(Activity),用于表现功能;服务(Service),在后台运行,不提供界面呈现;广播接收器(Broadcast Receiver),用于接收广播;内容提供商(Content Provider),支持在多个应用程序中存储和读取数据,相当于数据库。

Activity。

在Android 中,Activity是所有应用程序的根本,所有应用程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android中最基本的模块之一。在Android的应用程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在Activity 当中可以添加一些Button、CheckBox等控件。Activity的概念和网页的概念相当类似。

一般一个Android应用程序是由多个Activity组成的。这些Activity之间可以相互跳转,例如,按一个Button按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不同的是,Activity之间的跳转有可能有返回值,例如,从Activity A跳转到Activity B,那么当Activity B运行结束的时候,有可能会给Activity A一个返回值。这样做在很多时候是相当方便的。

当打开一个新的Activity时,之前一个Activity会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的Activity。当然,我们也可以选择性地移除一些没有必要保留的Activity,因为Android会把每个应用程序从开始到当前的每个Activity保存在堆栈中。

Activity页面布局包括以下几种。FrameLayout是最简单的布局之一。所有放在该布局里的控件,都按照层次堆叠在屏幕的左上角,后加进来的控件会覆盖前面的控件。LinearLayout会按照垂直或者水平的方向依次排列元素,每一个元素都位于前一个元素之后。如果是垂直排列,那么布局将是多行单列的结构,每一行只会有一个元素,而不论这个元素的宽度为多少;如果是水平排列,那么布局将是单行多列的结构。如果搭建的布局是两行两列的结构,通常的方式是先垂直排列两个元素,每一个元素里再包含一个LinearLayout进行水平排列。RelativeLayout是相对布局,允许元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。AbsoluteLayout是绝对布局,在此布局中的元素的android:layout_x和android:layout_y属性将生效,用于描述该元素的坐标位置。屏幕左上角为坐标原点(0,0)。第一个0代表横坐标,元素向右移动会使此值增大;第二个0代表纵坐标,元素向下移动会使此值增大。在此布局中的元素可以相互重叠。在实际开发中,通常不采用此布局。TableLayout 为表格布局,适用于多行多列的结构。一个TableLayout由许多TableRow组成,一个TableRow就代表TableLayout中的一行。TextView通常用于显示文字。ImageView通常用于显示图片。

Service。

Service是Android 系统中的一种组件,它跟Activity 的级别差不多,但是它不能自己运行,只能在后台运行,并且可以和其他组件进行交互。Service是没有界面的长生命周期组件。这么说有点枯燥,来看个例子: 打开一个音乐播放器程序并播放音乐,若想上网,那么打开Android浏览器,这个时候虽然已经进入了浏览器这个程序,但是音乐播放并没有停止,而是在后台继续一首接着一首地播放。其实这里的播放就是由播放音乐的Service控制的。当然负责播放音乐的Service也可以停止,例如,当播放列表里的音乐都播放完毕,或者用户按了停止音乐播放的快捷按钮等。Service可以在多场合的应用中使用,比如播放多媒体的时候用户启动Activity,这个时候多媒体要在后台继续播放,或者检测SD卡(Secure Digital MeMory Card,安全数码存储卡)上文件的变化,再或者在后台记录地理信息位置的改变等,总之,服务总是藏在后台。

Broadcast Receiver。

在Android 中,Broadcast是一种广泛应用的、用于在应用程序之间传输信息的机制,而Broadcast Receiver是对发送出来的Broadcast进行过滤、接收并响应的一类组件。可以使用Broadcast Receiver来让应用程序对外部事件做出响应,这是非常有意思的。例如:当电话呼入这个外部事件到来的时候,可以利用Broadcast Receiver进行处理;当下载一个程序成功的时候,仍然可以利用Broadcast Receiver进行处理。Broadcast Receiver不能生成UI,也就是说,它对于用户来说是看不到的。Broadcast Receiver通过Notification Manager来通知用户这些事情发生了。Broadcast Receiver既可以在AndroidManifest.xml 中注册,也可以在运行代码中使用Context.registerReceiver进行注册。只要注册了,当事件来临的时候,即使程序没有启动,系统也会在需要的时候启动程序。各种应用程序还可以通过Context.sendBroadcast将它们自己的Intent Broadcast广播给其他应用程序。

Content Provider。

Content Provider是Android提供的第三方应用数据的访问方案。Android对数据的保护是很严密的,除了放在SD卡中的数据,一个应用程序所持有的数据库、文件等,都是不允许其他应用程序直接访问的。Android当然不会真的把每个应用程序都设计成一座孤岛,它为所有应用程序都准备了一扇窗,这就是Content Provider。应用程序想对外提供的数据,可以通过派生Content Provider类,封装成一个Content Provider,每个Content Provider都用一个统一资源标识符(Uniform Resource Identifier,URI)作为独立的标识,形如content://com.×××××。Content Provider看着像描述性状态迁移(Representational State Transfer,REST)的样子,但实际上,Content Provider比REST更为灵活。

(5)Android平台优势

开放性。

首先,Android平台是具有开放性的,所谓开放性是指允许任何移动终端厂商加入Android联盟。开放性使其拥有更多的开发者,随着用户和应用程序的日益丰富,一个崭新的平台将很快走向成熟。开放性对于Android而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益之一正是丰富的软件资源。具有开放性的平台会带来更大的竞争,如此一来,消费者将可以用更低的价格购得心仪的手机,同时也可以通过刷机安装一些第三方优化过的系统来实现更好的用户体验。

丰富的硬件。

丰富的硬件是与Android平台的开放性相关的,由于Android的开放性,众多的厂商会推出千奇百怪、功能特色各异的产品。这些产品功能上的差异和特色,不会影响到数据同步,甚至软件的兼容。

自由的开发环境。

Android平台提供给第三方开发商一个十分宽泛、自由的环境,使他们不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件诞生。但这种环境也有其两面性,血腥、暴力、色情等方面的应用程序和游戏如何控制是留给Android的难题之一。