Android系统的五层架构、Dalvik与ART、最后有个奇怪的问题请教orz

Android系统的五层架构

Android系统架构

最开始的Android系统框架分为5层(内核层、硬件抽象层、系统运行库层、应用程序框架层、应用程序层)java

后来维基百科上搜索到的Android系统框架图为上图,少了一个硬件抽象层HAL(GPS、Wi-Fi、Camera….)android

从下往上看c++

1.Linux内核层

Android的底层是基于Linux操做系统的,Linux系统的驱动开发的可扩展能力较强,这让android的嵌入式系统更为普遍,这也是产生了这么多手机厂商的缘由,每一个厂商的硬件上都会有一些细微的差别,这让Android有了较高的移植性。 Linux内核给Android提供了系统安全性、内存管理、进程管理等等。浏览器

2.硬件抽象层(HAL)

定义硬件“驱动”的接口去下降Android系统与硬件的耦合度。硬件的抽象化,能够保护了硬件厂商的知识产权,由于Linux遵循的是GLP协议(反版权协议,全部驱动都应该是开源的)安全

3.系统运行库层(c库层,Android运行时库)

a) 由于里面包含了系统运行的基本库,由于这些库大部分都是c/c++实现的,因此都叫他c库层。(咱们熟知的SQLite、OpenGL、libc++、安全套接层SSL等)bash

b) Android运行时库:核心库和ART(Android 5.0 API:21 前是图上的Dalvik)。网络

  • Dalvik使用的是JIT编译器(Just-In-Time)解释字节码转化为机器码,在应用安装时将dex文件优化为odex文件,每次启动应用都会从新的编译运行,因此性能较低。
  • ART使用的是AOT预编译(Ahead-Of-Time)在应用安装的时候就将字节码文件预编译为机器码,应用启动快,运行快,但会耗费较多的存储空间,安装时间较长。

4.应用程序框架层(Java库)

通常都由Java编写,为上层应用提供了API接口,包含了一些系统级服务进程的实现。这些API造成建立Android应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用。架构

5.应用程序层

Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户能够选择安装的应用同样,没有特殊状态。所以第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。app

系统应用可用做用户的应用,以及提供开发者可从其本身的应用访问的主要功能。例如,若是您的应用要发短信,您无需本身构建该功能,能够改成调用已安装的短信应用向您指定的接收者发送消息。框架

总结

这就是Android的五层架构

android架构

后来我在官网找到一个如今的五层架构的软件堆栈图

android平台架构

ps:能够看出最大的不一样就是Android Runtime中的ART与Dalvik。

扩展

根据官方文档Android Runtime (ART) 和 Dalvik的介绍。 咱们能够大概的知道ART不只在编译机制与Dalvik不一样,还在GC方面进行了优化。

gc

ps:在 Dalvik 中,应用时常发现显式调用 System.gc() 有助于促进垃圾回收 (GC)。而在 ART 中,这种作法显得没那么必要,尤为是当您需经过垃圾回收来预防出现 GC_FOR_ALLOC 类型或减小碎片时。您能够经过调用 System.getProperty("java.vm.version") 来验证正在使用哪一种运行时。若是使用的是 ART,则该属性值应为 "2.0.0" 或更高。

ps2:Android开源项目(AOSP)中正在开发一种紧凑型垃圾回收器,旨在改善内存管理。(什么是紧凑型垃圾回收器?我想到的是操做系统中咱们实现动态分区分配的时候就能够采用的是紧凑技术,其实就是挪位置,应该就和这个原理差很少吧!)

扩展2(一个实践的问题)

这个问题是我不久前遇到的。由于他报的是AndroidRuntime的错误,而后里面又有 dalvik.system.PathClassLoader 的错误。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.readoceanlive, PID: 20650
    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.readoceanlive-haRcNqfDg7KbAYrcIuKKQg==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.readoceanlive-haRcNqfDg7KbAYrcIuKKQg==/lib/arm64, /system/lib64, /product/lib64]]] couldn't find "libliveplayer.so" at java.lang.Runtime.loadLibrary0(Runtime.java:1012) at java.lang.System.loadLibrary(System.java:1672) 复制代码

如何还原该错误呢? 使用AS ——> 点击 Run 'app' ——> 真机运行 ——> 安装后打开 ——> crashes

我使用了AS ——> Build ——> analyze apk... 查看了个人apk

old

当我点击 Run 'app' 后,它变成了下图

changed

个人lib不见了,但当我把apk下载到手机上安装的时候应用能正常运行。(而不是点击 Run 'app'),目前我还不知道这是为何?(猜想必定是Run 'app'干了些坏事,好比优化了等等)

若是有知道的大佬能够留言告知一下,不胜感激。

相关文章
相关标签/搜索