1. apk文件结构

在这里插入图片描述

1.1 asserts 目录:静态文件

存放需要打包到 APK 中的静态文件,不同于 res 目录,asserts 支持任意深度的子目录,用户可以任意部署文件夹的架构。注意,asserts 目录中的文件不会在 .R 文件中自动生成资源id,需要通过 AssertManager 类进行访问。

1.2 lib 目录:应用依赖的 native 库

存放应用依赖的 native 库文件,一般用 C/C++ 编写。lib 目录根据 CPU 型号的不同,可能包含四种文件夹:ARM,ARM-v7a,MIPS,X86,分别对应 ARM 架构,ARM-v7a 架构,MIPS 架构和 X86 架构等。目前市面上的移动终端大多是基于 ARM 或 ARM-v7a 架构的,因此一般的 APK 文件只包含 ARM 和 ARM-v7a 架构的 so 库文件。

1.3 res 目录:资源文件

存放资源文件,res 目录中的文件会在 .R 文件中自动生成资源 id,访问时直接使用 R.id.filename 即可访问。

1.4 META-INF 目录:签名文件

META-INF 目录存放签名文件,用于检查 APK 文件的完整性。META-INF 目录包含 CERT.RSA,CERT.DSA,CERT.SF 和 MANIFEST.MF,其中 CERT.RSA 是开发者利用私钥对 APK 进行签名的文件,CERT.SF,MANIFEST.MF 记录了文件的 SHA-1 哈希值。

1. 5 AndroidManifest.xml:配置文件

AndroidManifest.xml是每个应用程序都必须定义和包含的全局配置文件,它描述了应用程序的名称、版本、权限、引用的库文件等信息。但是不同于系统开发时在项目文件夹中所看到的AndroidManifest.xml文件,在APK文件中,AndroidManifest.xml是经过压缩的,如果直接打开将看到乱码。可以通过相关工具将其解压。

1.6 classes.dex:Dalvik 字节码

Dalvik虚拟机运行dex文件,而不是传统的class文件,DX工具将编译后的class文件转换成一个dex文件。在程序运行时,Dalvik虚拟机从dex中装载读取指令和数据。
classes.dex是Java源代码编译后生成的Dalvik虚拟机字节码文件,类似于Java虚拟机使用的.class类文件。由于Android使用的Dalvik虚拟机与标准的Java虚拟机是不兼容的,因此dex文件与class文件相比,不论是文件结构还是操作码都不一样。如果编写的源程序有多个Java类,都会将其编译到同一个classes.dex文件中,也就是说不论程序是简单还是复杂,每个APK文件只有一个classes.dex文件,而传统的Java应用程序,往往包含多个class文件,这样就不可避免地增加了冗余信息。将class文件整合到一起,可以减小类文件的尺寸、IO操作,提高类的查找速度。Android模拟器中提供了一个dex文件的反编译工具— dexdump,可以对其进行反编译。

1.7 Resources.arsc:资源配置文件

resources.arsc是编译后的二进制资源文件,内容包含了开发程序时项目文件夹中res子文件夹下main.xml、strings.xml等文件的信息。

2. apk打包流程

在这里插入图片描述

3. apk安装流程

在这里插入图片描述

4. 三种虚拟机

在这里插入图片描述

在这里插入图片描述

5. 安卓系统架构

安卓系统架构图
在这里插入图片描述
也找了一个中文版的:

在这里插入图片描述

5.1 APPLICATIONS(应用程序)

Android平台默认包含了主要的应用程序,包括电子邮件、短信、日历、地图、浏览器、联系人等,这些程序都是用Java语言来编写的,当然也可以用自己编写的软件来替代Android提供的程序。

5.2 APPLICATION FRAMEWORK(应用程序框架)

Android应用程序框架是开发人员进行开发的基础。它包括9大部分:视图系统、内容提供器、窗口管理器、活动管理器、通知管理器、位置管理器、资源管理器、电话管理器和包管理器。

  1. 视图系统(View System):用来构建应用程序的基本组件,包括文本框、按钮、列表等,甚至内嵌的网页浏览器。
  2. 内容提供器(Content Provider):提供了程序之间数据的共享机制。
  3. 窗口管理器(Window Manager):管理所有的窗口程序。通过窗口管理器提供的接口我们可以向窗口中添加、删除View。
  4. 活动管理器(Activity Manager):管理应用程序生命周期,并提供导航回退功能。
  5. 通知管理器(Notification Manager):使所有的程序能够在状态栏显示自定义的警告。需要注意的是,在手机上状态栏位于屏幕的顶部。
  6. 位置管理器(Location Manager):用来提供位置服务。其中包括两种技术:GPS定位技术和网络定位技术。
  7. 资源管理器(Resource Manager):提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
  8. 电话管理器(Telephone Manager):管理所有的移动设备。
  9. 包管理器 (Package Manager): Android系统内的程序管理

5.3 LIBRARIES(系统库)

包括核心库和Android运行时两部分。

5.3.1 核心库

安卓包含一个C/C++库的集合,供安卓系统的各个组件使用。其通过安卓的应用程序框架提供给开发者。包括系统C库、媒体库、界面管理库,图形库,数据库引擎、字体库等。

系统库的各个部分的功能:

Surface Manager:在同时执行多个应用程序时,Surface Manager会负责管理显示与存取操作之间的互动,并且为应用程序提供2D和3D图层的无缝融合。

媒体函数库:基于 PacketVideo OpenCORE;该库支持录放,并且可以录制许多流行的音频、视频格式,还有静态影像文件,包括MPEG4, MP3, AAC, AMR, JPG, PNG。

SQLite:它是一个对于所有应用程序可用,轻量级的关系型数据库引擎。

Free Type:提供点阵字和向量字的描绘显示。

Web Kit:一个最新的web浏览器引擎用来支持Android浏览器和一个可嵌入的web视图。WebKit是一个开源的项目,许多浏览器也都是用WebKit引擎所开发成的。如诺基亚S60手机内的浏览器。

SGL:提供Android在2D绘图方面的绘图引擎。

SSL:媒体框架,提供了对各种音频,视频的的支持。Android支持多种音频,视频,静态图像格式等。如MPEG-4,AMR,JPG,PNG,GIF等。

Lib C:一个从 BSD 继承来的标准 C 系统函数库( libc ),专门为基于嵌入式Linux的设备定制。

5.3.2 ANDROID RUNTIME(Android运行时)

Android虽然采用Java语言来编写应用程序,但是它并不使用J2ME来执行Java程序,而是采用Android自用的Android运行时。Android运行时包括核心库和Dalvik虚拟机两部分。

  1. 这里的核心库已经包含两部分内容,一部分为绝大多数Java程序语言所需要调用的功能函数,如java.io等;另外一部分是Android的核心库,如android.os,android.net等。
  2. Dalvik虚拟机是Google公司自己设计的用于Android平台的Java虚拟机。它是专门为移动设备而设计的,在开发的时候就考虑到了用最少的内存资源来执行。在设计的时候Dalvik虚拟机很多地方参考了Java虚拟机的设计,但是它并不支持Java虚拟机所执行的Java字节码,也不直接执行java的类文件,通过”dx”工具转换成.dex格式。在Dalvik可执行(.dex)格式中Dalvik虚拟机可执行文件对内存的需求被优化到最小。

注意:Dalvik虚拟机与Java虚拟机的最大不同在于Java虚拟机是基于栈(stack-based),而Dalvik基于寄存器(register-based)。基于寄存器的虚拟机的其中一个优点是所需要的资源相对较少,在硬件上也会比较容易实现。

5.4 LINUX KERNEL(Linux内核)

Android平台中的操作系统采用了Linux2.6版本的内核,它包括了显示驱动、摄像头驱动、Flash内存驱动、Binder(IPC)驱动、键盘驱动、WIFI驱动、Audio驱动以及电源管理部分。

它作为硬件和软件应用之间的硬件抽象层,使得应用程序开发人员不需关心硬件细节。但是对于硬件开发商而言,如果想要Android平台运行到自己的硬件平台上就必须对Linux内核进行修改,为自己的硬件编写驱动程序。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐