关于开发语言的历史可以参看:计算机和编程语言的发展历史

关于Android和IOS的发展历史可以参看:Android和IOS的发展历史

开发语言不同

1、IOS使用的是ObjectC和Swift

2、Android使用的是Java和KotLin

框架结构

  • Android系统的底层建立在Linux系统之上

Android系统的底层建立在Linux系统之上,由上到下依次是
应用程序、应用程序框架、核心类库,Linux内核,其中第三层还包括Android运行时的环境。如下图:

Android系统层级

1、应用程序层
Android 连同一个核心应用程序包一起发布,该应用程序包包括E-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。所有的应用程序都是用Java编写的。

2、应用程序层

提供了一大堆的服务和管理器

3、Android函数库

常用的比如媒体库,数据库,OpenGl3D,WebKit等,dalvik虚拟机也在这里,3D视图加速等等

4、Linux内核

Android的核心系统服务依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的硬件抽象层

  • iOS是基于UNIX系统的

iOS基于UNIX系统,iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer)、媒体层(Media layer)、核心服务层(Core Services layer)、核心操作系统层(Core OS layer),如下图:

IOS系统层级

1、触摸层:为应用程序开发提供了各种常用的框架并且大部分框架与界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。如NotificationCenter的本地通知和远程推送服务,iAd广告框架,GameKit游戏工具框架,消息UI框架,图片UI框架,地图框架,连接手表框架,自动适配等等

2、媒体层:提供应用中视听方面的技术,如图形图像相关的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。声音技术相关的CoreAudio,OpenAL,AVFoundation,视频相关的CoreMedia,Media Player框架,音视频传输的AirPlay框架等等。

3、核心服务层:提供给应用所需要的基础的系统服务。如Accounts账户框架,广告框架,数据存储框架,网络连接框架,地理位置框架,运动框架等等。这些服务中的最核心的是CoreFoundation和Foundation框架,定义了所有应用使用的数据类型。CoreFoundation是基于C的一组接口,Foundation是对CoreFoundation的OC封装。

4、核心操作系统层包括:包含大多数低级别接近硬件的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含数字信号,线性代数,图像处理的接口。针对所有的iOS设备硬件之间的差异做优化,保证写一次代码在所有iOS设备上高效运行。CoreBluetooth框架利用蓝牙和外设交互,包括扫描连接蓝牙设备,保存连接状态,断开连接,获取外设的数据或者给外设传输数据等等。Security框架提供管理证书,公钥和私钥信任策略,keychain,hash认证数字签名等等与安全相关的解决方案。

两者运行机制不同:

  • IOS采用的是沙盒运行机制

1、沙盒机制

出于安全考虑,iPhone对于安装在上面的应用程序有所限制,这个限制就是应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称之为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。总体来说沙盒就是一种独立、安全、封闭的空间。

2、沙盒机制的特点

每个应用程序都有自己的存储空间。每个应用程序都不可以翻过自己的围墙去访问别的存储空间的内容(已经越狱的除外)。在访问别人沙盒内的数据时需要访问权限。沙盒(sandbox)的核心内容是:sandbox对应用程序执行各种操作的权限限制

3、应用程序的沙盒目录

应用程序沙盒目录下有三个文件夹Documents、Library(下面有Caches和Preferences目录)、tmp。

Documents:保存应用运行时生成的需要持久化的数据iTunes会自动备份该目录。苹果建议将在应用程序中浏览到的文件数据保存在该目录下。

Library/Caches:一般存储的是缓存文件,例如图片视频等,此目录下的文件不会再应用程序退出时删除,在手机备份的时候,iTunes不会备份该目录。

Library/Preferences:保存应用程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这里创建文件,而是需要通过NSUserDefault这个类来访问应用程序的偏好设置。iTunes会自动备份该文件目录下的内容。

tmp:临时文件目录,在程序重新运行的时候,和开机的时候,会清空tmp文件夹。

  • 安卓采用的是虚拟机运行机制

1、什么是Dalvik虚拟机

Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。

2、Dalvik虚拟机的功能

Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。Dalvik充分利用Linux进程管理的特定,对其进行了面向对象的设计,使得可以同时运行多个进程,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因。Dalvik为了达到优化的目的,底层的操作大多和系统内核相关,或者直接调用内核接口。

3、Dalvik虚拟机具有以下特点

· 使用dex格式的字节码,不兼容Java字节码格式

· 代码密度小,运行效率高,节省资源

· 有内存限制,Google原版的系统,默认支持的最大只为16MB

绘制页面的方式不同

  • 布局文件不同:

1、IOS早期开发的时候根本没有类似StoryBoard,Xlib这些的可以直接拖拽控件的布局文件,所有的页面,以及页面的所有控件都需要开发者在代码中动态的创建,而且早期的IOS机型和屏幕类型非常少,根本不需要考虑适配的问题,后面随着机型的增加才开始出现了适配的问题

2、Android参考了Java语言写PC电脑界面程序的思想,提供了基础的布局文件,可以建立对应的后缀为.xml的布局文件,然后在布局文件中设置调整空间

  • 控件位置的设置和调整

1、IOS AutoLayout

Java写PC端程序就考虑了页面的兼容性,有五大布局来设置调整控件的相对位置。Android里面也有一些基本的局部文件来设置和调整控件的位置

2、控件长度的设置,pd和pt

IOS开发中使用的长度和宽度基本是以pt为后缀的数字

Android开发中的长度和宽度基本是dp为后缀的数字,也可以以px(像素密度单位)作为后缀,

像素密度,不同的手机,像素密度是不一样的,如果以px为后缀,不同的手机,显示出来的长度是不一致的,而Android和IOS手机会根据自身不同的像素密度来对dp和pt进行一定的换算,来转换成比较合适的px。

  • 两者打开新页面的方式不同

1、IOS采用先new对象,然后通过导航控制器,采用压栈的方式把下个页面对象压入栈中,下一个页面就会显现出现在页面上;或者通过把new出来的对象赋值给当前Window的RootView对象来打开新的页面。

2、Android则是把新页面对应的Activity的完整类名告诉系统的Activity管理者,通过调用Android的Activity管理者把对象new出来,需要传递参数的话,就需要传递类似键值对的方式,把数据存储到Intent里面,然后在新的页面显示到界面之前,再获取到Intent,然后根据相应的Key来获取key对应的键值对

两者后台策略不同

  • iOS采用“伪后台”的形式

1、当一个iOS应用被送到后台,应用程序只有很短暂的时间(秒级别的)来处理东西,然后所有线程都被挂起了。这个时候APP依然驻留在内存中,这种状态下,不调用苹果已开放的几种后台方法,程序便不会运行;如果在这个时候,使程序继续运行,则为后台状态;如果当前内存将要不够用时,系统会自动把之前挂起状态下的APP请出内存。所以我们看到,有些时候打开APP时,还是上次退出时的那个页面那些数据,有时则是重新从闪屏进入。

2、iOS系统后台机制大概可以分为5种状态

· Not Running:APP没有启动,也没有后台运行;

· Active:用户正在使用APP,比如说我们聊微信看网页的时候,APP就处于Active状态;

· Inactive:这是一个过渡的状态,APP虽然打开了,但是用户没有跟APP有任何互动操作;

· Background:APP在后台运行,微信会在没有打开的时候接收消息;

· Suspended:APP虽然在后台运行,但是处于休眠状态,只占用一点内存。

  • 安卓采用的是虚拟机运行机制,安卓中任何程序都能在后台运行,直到没有内存才会关闭

1、android后台运行机制

android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机,每个app都有自己的进程,每个进程都有自己的内存空间,这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃。

2、安卓的进程从高到底分为5种

· 前台进程:正在与用户交互的进程,通俗来讲就是你当前使用app的进程;

· 可见进程:可以被用户看到,但是没有和用户交互,例如一个activity以对话框的形式覆盖在当前activity上面,当前activity可以被用户看到,但是不和用户交互;

· 服务进程:这个相信大家都熟悉,也就是我们常说的service,能够运行在后台,常见的有音乐类的app;

· 后台进程:注意,这个后台进程不要和服务进程搞混了,它的意思是说当前app在后台运行,例如我启动了app,然后点击home返回到桌面,那么这个app就会被切回到后台进程;

· 空进程:空进程指的是在这些进程内部,没有任何东西在运行。保留这种进程的的唯一目的是用作缓存,以缩短该应用下次在其中运行组件所需的启动时间。

推送机制

  • iOS在软件关闭的情况下,依然可以接收推送信息

手机消息当然都是通过服务器推送到我们手机上的,对于iOS的用户来说,苹果有APNs服务器来负责消息的推送。当你第一次使用APP时,会询问是否接收通知,如果你选择了是,那么服务器就会记录你的ID,当有消息通知的时候,这些数据是先推送到苹果的服务器中,然后通过苹果的APN服务器推送到用户手机上的。 这样的设计让软件彻底关闭的时候还可以接收到消息通知,一方面释放内存,一方面也不会耽误接收消息。

  • Android在软件关闭的情况下,无法接收推送信息

在Android手机来说,谷歌也有类似的GCM服务器来推送消息,不过因为国内的手机都没有谷歌服务无法收到谷歌GCM服务器推送的消息。安卓的推送都是通服务来实现的,就算应用没有启动但是服务还在一样可以收到推送。所以只能是安卓自己启动Services来实现推送,当应用杀死后Services如果被杀死就无法收到推送。

开源性

  • IOS和Mac都是闭源码的,苹果公司的从一开始的宗旨就是为了让软件和硬件完美的结合到一块,自己打造一套只属于自己的完整产业链,自己可以控制整个生态链

  • Android是开源的,谷歌公司目的是打造一款廉洁以及通用型非常好的系统,,这个理念和微软的Window系统(Windows系统是闭源的)基本一致,但是Android因为是开源的,所以各大厂商都能够进行特殊定制,此拥有广泛的用户基数群体,但是也因为这个原因导致Android碎片化非常严重。

性能

1、硬件本身

IOS:目的就是让软件和硬件完美的结合到一块,该操作系统只能在极少数机器上面才能运行

Android:和Window一样,目的是打造一款通用性非常好的系统,在任何机器上面都可以运行,

2、系统本身

IOS:直接执行程序的二进制代码

Android:生成class文件,需要虚拟机来进行解释

3、语言本身

OC:基于对象,完全兼容C语言的语法,可以直接操作内存

Java:面向对象,性能比C语言和OC低

4、页面控件的计算方式

IOS:提前计算好,然后根据计算的结果来布局文件

Android:需要不断的测量,重复计算

5、系统本身对应用程序的控制:后台策略,推送策略,懒加载策略,沙盒策略

IOS对程序一直都是非常严格的态度,严格管控着程序的各个方面的权限,早期的Android对程序的管控相对宽松,但是随着Android系统版本的升级,管控也逐渐严格,总的来说,性能方面IOS完胜Adroid,价格方面Android完胜IOS

安全性

目前针对移动应用市场上安卓APP被破解、反编译、盗版丛生的现象,很多APP开发人员已经意识到保护APP的重要性。而对于移动应用APP加密保护的问题,如何对DEX文件加密尤为重要。那么接下来,我们就先介绍一下什么是App加壳和加壳的原理,利与弊等。

1、什么是加壳?

加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。是应用加固的一种手法对原始二进制原文进行加密/隐藏/混淆。

加壳和脱壳

2、加壳作用

加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解,但是加壳可能会影响软件的兼容性,而且由于在程序外面又添加了其他初始化程序,软件打开的速度也会降低。

五、两者相互学习

1、Toast

2、启动页(Android是不需要启动页面的,会出现白屏或者黑屏),页面的返回键

3、切换开关

4、对话框,进度条,

5、布局文件和自适应布局控件,兼容性

6、应用商店

7、刷新控件

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐