1.1安卓的发展与简介

       安卓并不是Google创造的,而是由Android公司所创造,公司于2003年在美国加州成立,该公司的创始人是Andy Rubin,该公司2005年由Google收购注资,并组建开放手机联盟。

       2007年11月5日,Android 1.0操作系统发布,当时并没有赢得广泛的市场支持。2009年5月,Google发布了Android1.5,这个版本功能强大,吸引了大量开发者的目光。目前,安卓已经成为一个重要的手机操作系统,市场占有率远超其他系统。

1.2 Android系统架构

Linux系统与android应用 android 与linux_Linux系统与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方法和操作系统的相互通信。

Linux系统与android应用 android 与linux_Linux系统与android应用_02

1.2.4 Standard libraries

       Standard Libraries的详细版,这里包含的是Android中的一些标准库,所谓标准,就是开发者在开源环境中可以使用的开发库

Linux系统与android应用 android 与linux_android_03

1.2.5 Application

       如下两图分别表示了使用NDK开发和Java开发的App的主要构成。可以看出,不管那种App,它们都有Android Manifest 文件,Dalvik Classes,Resource Bundle这几个东西,相信解压过Apk的朋友应该注意到了,这些就是我们解压Apk后的文件。

Linux系统与android应用 android 与linux_安迪鲁宾_04

Linux系统与android应用 android 与linux_Linux系统与android应用_05


       对于开发者来说,与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是开发者非常关心的两个目录:

Linux系统与android应用 android 与linux_Linux系统与android应用_06

Android Studio环境下的文件目录结构:

Linux系统与android应用 android 与linux_Android_07