最開始的Android系統框架分爲5層(內核層、硬件抽象層、系統運行庫層、應用程序框架層、應用程序層)java
後來維基百科上搜索到的Android系統框架圖爲上圖,少了一個硬件抽象層HAL(GPS、Wi-Fi、Camera….)android
從下往上看c++
Android的底層是基於Linux操做系統的,Linux系統的驅動開發的可擴展能力較強,這讓android的嵌入式系統更爲普遍,這也是產生了這麼多手機廠商的緣由,每一個廠商的硬件上都會有一些細微的差別,這讓Android有了較高的移植性。 Linux內核給Android提供了系統安全性、內存管理、進程管理等等。瀏覽器
定義硬件「驅動」的接口去下降Android系統與硬件的耦合度。硬件的抽象化,能夠保護了硬件廠商的知識產權,由於Linux遵循的是GLP協議(反版權協議,全部驅動都應該是開源的)安全
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)在應用安裝的時候就將字節碼文件預編譯爲機器碼,應用啓動快,運行快,但會耗費較多的存儲空間,安裝時間較長。
通常都由Java編寫,爲上層應用提供了API接口,包含了一些系統級服務進程的實現。這些API造成建立Android應用所需的構建塊,它們可簡化核心模塊化系統組件和服務的重複使用。架構
Android 隨附一套用於電子郵件、短信、日曆、互聯網瀏覽和聯繫人等的核心應用。平臺隨附的應用與用戶能夠選擇安裝的應用同樣,沒有特殊狀態。所以第三方應用可成爲用戶的默認網絡瀏覽器、短信 Messenger 甚至默認鍵盤(有一些例外,例如系統的「設置」應用)。app
系統應用可用做用戶的應用,以及提供開發者可從其本身的應用訪問的主要功能。例如,若是您的應用要發短信,您無需本身構建該功能,能夠改成調用已安裝的短信應用向您指定的接收者發送消息。框架
這就是Android的五層架構
後來我在官網找到一個如今的五層架構的軟件堆棧圖
ps:能夠看出最大的不一樣就是Android Runtime中的ART與Dalvik。
根據官方文檔Android Runtime (ART) 和 Dalvik的介紹。 咱們能夠大概的知道ART不只在編譯機制與Dalvik不一樣,還在GC方面進行了優化。
ps:在 Dalvik 中,應用時常發現顯式調用 System.gc() 有助於促進垃圾回收 (GC)。而在 ART 中,這種作法顯得沒那麼必要,尤爲是當您需經過垃圾回收來預防出現 GC_FOR_ALLOC 類型或減小碎片時。您能夠經過調用 System.getProperty("java.vm.version") 來驗證正在使用哪一種運行時。若是使用的是 ART,則該屬性值應爲 "2.0.0" 或更高。
ps2:Android開源項目(AOSP)中正在開發一種緊湊型垃圾回收器,旨在改善內存管理。(什麼是緊湊型垃圾回收器?我想到的是操做系統中咱們實現動態分區分配的時候就能夠採用的是緊湊技術,其實就是挪位置,應該就和這個原理差很少吧!)
這個問題是我不久前遇到的。由於他報的是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
當我點擊 Run 'app' 後,它變成了下圖
個人lib不見了,但當我把apk下載到手機上安裝的時候應用能正常運行。(而不是點擊 Run 'app'),目前我還不知道這是爲何?(猜想必定是Run 'app'幹了些壞事,好比優化了等等)
若是有知道的大佬能夠留言告知一下,不勝感激。