转自(只讲干货的老张

面试中经常提问到一个点,就是做手机测试绕不去的点,那就是Android和ios的区别。这篇文章只做一些比较重要的点讲一下,太深入部分就不讲了,毕竟我做的是测试,而Android开发和ios开发又是一个很深入的专业,我就不班门弄斧了。

首先从开发语言上讲,Android因为是采用分层思想,最上面是应用层,往下一级是java API框架层,再往底层就是原生的c/c++层,再往下就是硬件驱动以及linux内核层。一般情况下,Android开发都是在最上面2层开发应用。我们一般介绍时会说Android语言跟java语言同源就是这么由来的。而且Android本身开源,所以全世界的各种手机都可以使用Android系统。而ios本身是一个类Unix操作系统,不开源。使用的开发语言是Objective-C,一般也叫OC.只在apple公司的手机、平板等设备上使用。

    如下为Android架构图:

 

再说点物理上的区别,而且在测试时很容易被忽略的点,Android手机的3个虚拟按钮,返回、回到首页、菜单键。最早的时候,Android手机都是物理按键,随着大家对于屏幕占比的重视,导致虚拟键的功能越来越流行,物理按钮被干掉。而虚拟按钮的出现,也给开发工作加了很多戏,问题就是很多Android应用里面如果不处理这些虚拟按钮,就很容易导致屏幕出现黑边,误碰到虚拟按钮,导致app退出,或者会跟app的一些按钮位置重合,导致不能点击到对应的功能按钮,以及想调出虚拟按钮时,又不出来,特别让用户烦恼。而ios开发的同学目前来说就没有这样的烦恼,早期的iPhone手机只有一个物理的小圆点按钮,可以双击,也可以单击,而返回效果在很早的时候,就通过左滑就解决了。

而Android手机跟ios手机还有些不一样的地方,那就是各种不同分辨率的适配,早期的ios手机屏幕就是固定的几个尺寸,适配很容易,现在也是有了多个版本的手机,导致机型也变得适配略微麻烦了。而Android手机在全面屏概念出来以后,就彻底放开了,各种手机屏幕的分辨率,也导致了测试在测试时,只能优先一部分用户的机型体验,而剩下的用户机型只能忽略。当然我们可以通过接入一些第三方的平台,比如友盟,来获得我们线上用户的真实使用手机的占比,然后找到top10或者top5,然后买来对应的机型后再做兼容性测试。

而分辨率相比较而已,还不是最恶心的,我感觉比较恶心的就是各种异形屏,比如刘海,或者水滴等,这样的手机app进行适配时,我感觉没有意义的,然而苹果开头了,大家都开始学上了。因为异形的那个地方,你不知道放啥,在整个app的所有页面,你都需要考虑到这个地方怎么特殊处理。要不就是黑边给你看。

还有就是手机的操作系统版本,这个问题,之前我觉得影响不是很大,但是测的越久,你就发现,不同的手机操作系统版本,效果还不一样,比如最常见的就是华为手机经常会出现一些莫名其妙的bug。当然其实我们知道为啥,因为华为本身会对手机的操作系统做一些比较深入的优化,而其他手机厂商,可能只是给换个马甲的事,就像是王者荣耀的英雄跟皮肤一样的关系。所以我们做兼容性测试时,可以重点关注一下华为手机机型。而ios之前遇到过让所有的app从http转为https,而我们当时的手机app的免费https证书到期,在ios的一些没有升级到必须使用https的操作系统版本手机上,使用没有任何问题,而使用ios的高版本,就直接app会闪退。

所以我们一般考虑手机的操作版本兼容性,Android这边是从4.4到9,而ios是从10-13.主要还是看你们公司的产品受众主要用哪些机型。

另外一点就是安全性,众所周知的情况是,Android的个人信息泄露比较严重,很多app在安装时会要求很多权限,或者即使不给,他也有各自手段偷偷的获取这些手段。而ios一般情况下权限管理的很严格,没有意义的权限,一般情况下不会给。而且苹果官方的审核机制也是比较严格,经常会出现审核不通过的情况。所以ios的权限一般情况下,感觉会要的很少。

Android采用的虚拟机机制,而ios采用的是沙盒机制。沙盒机制的特点是:每个应用只能访问自己应用的数据和文件,不能随意去访问其他的沙盒内容。而虚拟机机制的特点是:每个应用程序都在独立的虚拟机中,这些独立的虚拟机实例都是一个独立的进程空间。而Android这样做的好处就是跟linux内存管理很相似,是真正的多进程管理,虽然可用内存最后看着少,但是实际上很多程序已经分配了一定的内存了,如果需要,在唤起时,不会再次分配一次,而且已经有了缓存,启动和响应会比较快。

Android的内存管理方式和ios不一样。Android在手机app切换到后台时,内存空间会保留给这个app,当下次再切换到前台时,app会快速的响应。而ios是app被切换到后台后,很短的时间内就会被清理内存,杀死进程。这样做的好处也是为了给当前切换到前台的应用腾出空间来。这样做的好处就是省电,因为只有前台一个应用在跑。当然还有一些特殊的应用可以一直在后台运行,比如:音乐、gps等。Android的出发点是为了让app切换时应用响应速度快,但是造成的后果就是内存可能会被历史应用占用的内存过多,而继续创建新的应用时不够用,才会回收内存。导致想用的app打开时变慢。

另外一点就是响应优先级不同,ios是对于屏幕反应的优先级最高,也就是UI指令最高。而Android是数据优先级最高。这2者的对比,可以用一个简单的例子来对比,ios在打开一个app时,它对屏幕的响应优先级是最高的,之后才运行app代码。Android系统打开app的顺序是先运行app的代码,之后再显示在用户的手机屏幕上。直观来看,对用户来说,就是我在ios上点了一下,接着就有反应了,而Android慢了半拍。

再一点,两者的安装应用方式不一样,Android通过各种应用商店,比如豌豆荚,91助手等等,ios只能通过应用商店,而测试版本的软件,Android可以通过把apk包导入到手机sdcard中,直接安装或者通过adb install命令安装包,ios可以通过iTunes方式安装或者爱思助手之类的软件进行安装ipa。当然现在比较流行的是通过第三方来管理测试包,比如说:蒲公英,这个平台可以把你的测试包上传后,然后开发者可以把需要下载测试包的同学手机UUID加到白名单后,就可以使用ios的测试包了。当然这个平台也可以上传Android软件测试包。

另外一点,就是Android因为自身代码的开源性,很多的app开发者如果不注意保护自己的代码,很容易被破解后,被其他人打包为别人的,所以Android的app一般都需要做代码的混淆。也就是把正常的代码,混淆完之后,就不容易理解了,比如很常见的方式就是代码的类名改为:a、b、c等等没有意义的名字。而ios因为本身不开源的特点,就不需要做代码混淆。

最后再讲一点,消息推送机制不一样。Android的消息推送底层一般就是2种实现方式,一种是push,一种就是pull。push的意思就是服务器需要给app推送消息了,就直接发送给app,app是被动的。另外一种就是pull,pull的意思就是app定期去服务器那边轮询是否有消息推送。这样来说的话,pull的方式比较费app的性能,所以一般情况下都是通过push。push的方式国内目前一般情况下都是通过第三方平台。比如:友盟、极光推送等。因为自己做推送的话,会因为开发成本、服务器成本等不合适。而ios的消息推送则是使用苹果官方的一个APNS的服务器来转发我们的消息推送。也就是服务器端把推送给app的消息给APNS,由APNS再转发给我们的app端。Android消息推送时,国内使用的第三方平台也是扮演的这个中间服务商的一个角色。