1.1安卓的发展与简介
安卓并不是Google创造的,而是由Android公司所创造,公司于2003年在美国加州成立,该公司的创始人是Andy Rubin,该公司2005年由Google收购注资,并组建开放手机联盟。
2007年11月5日,Android 1.0操作系统发布,当时并没有赢得广泛的市场支持。2009年5月,Google发布了Android1.5,这个版本功能强大,吸引了大量开发者的目光。目前,安卓已经成为一个重要的手机操作系统,市场占有率远超其他系统。
1.2 Android系统架构
1.2.1 Linux
Linux层,是安卓最底层、最核心的部分。当我们打开手机Setting,选择About Phone选项,这一选项所显示的内核版本,就是我们所使用的Linux内核的版本。Linux层包含了Android系统的核心服务,包括硬件驱动、进程管理、安全系统,等等。
1.2.2 Dalvik与ART
Dalvik包含了一整套的安卓运行环境虚拟机,每个app都会分配Dalvik虚拟机来保证互相之间不受干扰,并保持独立。它的特点是运行时编译。打个比方,就像是买了一辆折叠自行车,平时是折叠的,只有骑的时候才需要组装起来用。在Android5.X版本开始,ART模式已经取代了Dalvik,ART采用的是安装时就进行编译,以后运行时就不需要进行编译了。这就好比买了一辆组装好的自行车,直接就可以骑车。当然,对在其虚拟机环境中运行的大部分app来说,它们都是运行着同样的代码。
1.2.3 Framework
Framework其实可以简单的理解为一些API的库房,android开发人员将一些基本功能实现,通过接口提供给上层调用,可以重复的调用。
我们可以称Framework层才真正是Java语言实现的层,在这层里定义的API都是用Java语言编写。但是又因为它包含了JNI的方法,JNI用C/C++编写接口,根据函数表查询调用核心库层里的底层方法,最终访问到Linux内核。那么Framework层的作用就有2个。
(1)用Java语言编写一些规范化的模块封装成框架,供APP层开发者调用开发出具有特殊业务的手机应用。
(2)用Java Native Interface调用core lib层的本地方法,JNI的库是在Dalvik虚拟机启动时加载进去的,Dalvik会直接去寻址这个JNI方法,然后去调用。
这 2种方式的结合达到了Java方法和操作系统的相互通信。
1.2.4 Standard libraries
Standard Libraries的详细版,这里包含的是Android中的一些标准库,所谓标准,就是开发者在开源环境中可以使用的开发库
1.2.5 Application
如下两图分别表示了使用NDK开发和Java开发的App的主要构成。可以看出,不管那种App,它们都有Android Manifest 文件,Dalvik Classes,Resource Bundle这几个东西,相信解压过Apk的朋友应该注意到了,这些就是我们解压Apk后的文件。
对于开发者来说,与Android系统最直接的接触就是SDK,应用开发者应当关注每个版本的SDK修改,从而提高应用的兼容性,如果站在Android设计者的角度上来看整个Android的架构,设计者希望Android的架构层能够起到承上启下的功能,让应用的各个组件之间解耦,并通过框架来进行统一的调度,管理。
1.3 Android App组件架构
在应用层,Android的App组件架构,痛就是我们所说的四大组件,指的是Activity,BroadCastReciver,ContentProvider和Service,它们是构成一个AndroidApp的最基本元素。
1.3.1 Android四大组件如何协同工作
Activity作为人机交互的第一界面,负责向用户展示信息和处理结果,而这些信息的来源,可以是通过资源获取,也可以是通过Conten Provider 来获取其他应用的信息,或是Service从后台计算,下载,处理的结果,当然也可以是通过BroadCast Reciver获取到的广播信息。同时,Android系统还提供了要给信使——Intent,作为信息传递的载体。组件与组件之间通过Intent来通信,传递信息,交换数据,正式通过这样要给方式,四大组件形成了各自独立而又紧密联系的关系,让整个Android系统“活”了起来。
1.3.2 应用运行上下文对象
Android系统中的上下文对象,即在Context中,为我们封装了这样一个“语境”。Activity,Service,Application都是继承自Context。
Android应用程序会在如下所示的几个时间点创建上下文Context。
(1) 创建Application
(2)创建Activity
(3) 创建Service
不难发现,创建Context的时机就是创建Context的实现类的时候。当应用程序第一次启动时,Android系统都会创建一个Application对象,同时创建Application Conetext,所有的组件都共同拥有这个Context对象,这个应用上下文对象贯穿了整个应用进程的生命周期,为应用全局提供了功能和环境支持。
而创建Activity和Service组件时,系统也会给他们提供运行时的上下文环境,即创建Activity实例,Service实例的Context对象。所以在Activity中获取Context对象时,可以直接使用this,而在匿名内部类中,就必须指定XXXActivity.this 才可以获得该Activity的Context对象。
当然也可以通过getApplicationContext()方法来获取整个App的Context,但是通过getApplicationContext()方法获得的是整个应用的上下文引用,这与某个组件的上下文应用,在某些时候还有有区别的。
1.4 Android系统目录和Android Studio文件目录
在Android手机里,系统的目录结构与源代码目录结构还是有所不同的,我们通过ADB连接Android设备,通过Linux的ls命令查看Android系统的根目录,其中/system和/data是开发者非常关心的两个目录:
Android Studio环境下的文件目录结构: