初识Android 系统体系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/y1962475006/article/details/81700803

初识Android 系统体系

一、Android系统架构

如图示:
android 系统架构
* 应用层部分包含系统应用(桌面应用等)和用户应用(QQ、达达等)
* framework层是开发主要面向的一层,包括组件、服务等一系列框架(四大组件也在里面)
* 使用SQLite 是因为它更轻量

二、Android系统的启动流程

图示是android手机启动后的流程

android 启动过程

  • boot loader 是物理电源按下之后第一个加载的,和PC一样,boot loader是引导操作系统启动的过程,之后会加载kernel内核,初始化android系统设备必须的服务,比如Memory、IO、CPU调度等,接着挂载文件系统,这些都是和Linux系统服务一致。
  • 之后,内核会启动第一个用户级的进程,之所以说是第一个用户级的进程,是因为第一个进程时kernel进程,PID是0,init进程是1 。但是kernel进程是内核空间的进程。
  • init进程是android系统极为重要的进程,会启动一系列deamons进程包括和adb(android device bridge)调试相关的adbd等,启动servicemanager进程和受精卵(Zygote)进程。
  • Zygote 是复制自身fork出应用进程的“受精卵”,它是android 虚拟机(Dalvik 和 Art)的构造器,每个应用进程都是一个虚拟机,都是相互隔离的沙箱,用UID(android 中叫AID),除root外,只能访问自己进程中的文件。
  • 每个应用进程都会生成自己的ActivityManager、PackageManager、WindowManager等,作为应用页面、包、窗口等的管理器,相关信息会注册在ServiceManager中,以提供应用之间的IPC服务。

1、 为什么要采用Zygote:
Zygote进程在系统启动之后init就启动的子进程,可以提前完成虚拟机需要的操作,通过fork(复制)自身,可以迅速生成一个虚拟机实例。对于一些只读的系统库,Zygote进程和应用进程共享这些内存,可以减少内存开销。

三、APK生成

APK 的生成包括:编译、打包、签名优化三个阶段:

APK生成过程

  • AAPT是打包资源文件的工具,会把图片资源、文字资源等生成在R.java中对应的映射关系(静态常量)
  • AIDL tool是处理IPC 接口的工具,也会打包成java文件
  • 在编译成.class文件之后,会通过DX工具转成dex文件
  • Asset文件夹下面资源不会生成R文件的映射
  • 所有文件会被压缩打包在APK文件中,之后通过JarSigner签名

1、 为什么不把.class直接用,而是转成.dex?

  • 一个dex文件可以包含若干个类,而一个class文件只包括一个类。由于一个dex文件可以包含若干个类,因此它就可以将各个类中重复的字符串和其它常数只保存一次,从而节省了空间,这样就适合在内存和处理器速度有限的手机系统中使用。一般来说,包含有相同类的未压缩dex文件稍小于一个已经压缩的jar文件。
  • jvm 是基于堆栈的,android虚拟机Dalvik/ART 都是基于寄存器的,.class文件结构是适应堆栈的,dex更适合终端设备
  • 文件IO操作多,类查找慢
  • 两者本质都是二进制的文件,只是格式不同

四、浅谈JVM 和 Dalvik/ART

  • jvm的指令集是基于堆栈的(javap 可以查看),Dalvik/ART是基于寄存器的,后者更符合android嵌入式终端设备的特点。
  • 基于堆栈和基于寄存器的指令集各有优劣,一般而言,执行同样的功能,前者需要更多的指令(主要是load和store指令),而后者需要更多的指令空间。需要更多指令意味着要多占用CPU时间,而需要更多指令空间意味着数据缓冲(d-cache)更易失效。
  • Dalvik 垃圾收集是CMS收集器,会有两次stop the world,ART在此基础上只有一次
  • Dalvik是依靠Just-In-Time(JIT)编译器去解释字节码,是运行时解释;ART是预编译了机器码,这一机制叫Ahead-Of-Time(AOT)编译

猜你喜欢

转载自blog.csdn.net/y1962475006/article/details/81700803
今日推荐