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

2,524 阅读4分钟

Android系统的五层架构

Android系统架构

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

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

从下往上看

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等)

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 甚至默认键盘(有一些例外,例如系统的“设置”应用)。

系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。

总结

这就是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'干了些坏事,比如优化了等等)

如果有知道的大佬可以留言告知一下,不胜感激。