Android 6.0源碼結構

1.目錄abi

定義:應用程序和操作系統之間、一個應用和它的庫之間、應用的組成部分之間的底接口
查看文件夾abi/cpp下目錄:

include:cxxabi.h、new、typeinfo
src:
Android.mk
use_rtti.mk

abi文件的作用: abi規定了二進制文件的格式、內容,裝載/卸載程序的要求,函數調用時的參數傳遞規則,寄存器、堆棧的使用

ABI與API的區別:

API定義了源代碼和庫之間的接口
 1、同樣的代碼可以在支持API的任何系統中編譯
 2、ABI允許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行

2.目錄art==>Android Runtime

ART——>基於Android4.4以後的版本,意味着最低的版本要求爲Android4.4,之前Android版本採用的是Dalvik虛擬機:

Dalvik虛擬機通過以下方式提高性能
 1、Dex代碼安裝時或第一次動態加載時,odex化處理
 2、Android2.2版本提供了JIT機制提升性能
 3、提高硬件配置,如更多核CPU、更高頻率CPU、更多的RAM

ART
  優點:
    1、系統性能的顯著提升
    2、應用啓動更快、運行更快、體驗更流暢、觸感反饋更及時
    3、更長的電池續航能力
    4、支持更低的硬件
  缺點:
    1、更大的存儲空間佔用可能會增加10%~20%
    2、更長的應用安裝時間
  總結:ART的功效就是“空間換時間”

art目錄下:
compiler:主要負責Dalvik字節碼到本地碼的轉換,編譯爲libart_compiler.so
dex2oat:完成dex文件到oat文件的轉換,編譯爲dex2oat
runtime:Android ART運行時源代碼,編譯爲libart.so
oatdump:對oat文件進行分析並格式化顯示出文件的組成結構
jdwpspy:是java的調試支持部分,即JPWP服務端的實現

分析關鍵1:ART虛擬機的啓動過程
Android系統在啓動的時候創建Zygote進程充當應用程序孵化器,Zygote進程在啓動的過程中又會創建一個Dalvik虛擬機
Zygote進程是通過複製自己(也就是fork)來創建新的應用程序進程,這意味着Zygote進程會將自己的Dalvik虛擬機也複製給應用程序進程
==>Android系統通過將ART運行時抽象成一個Java虛擬機,以及通過系統屬性persist.sys.dalvik.vm.lib和一個適配層JniInvocation就可以無縫地將Dalvik虛擬機替換爲ART運行

3.目錄bionic==>系統底層庫

針對Android系統定製的仿生C庫、鏈接器等所在目錄。Android並沒有使用linux的glibc庫,bionic C庫針對嵌入式系統優化,添加了一些Android特定的函數API,同時大大減少庫的體積,也避免了LGPL版權的問題

libc庫 --> C庫,如stdio、stdlib、string
libdl --> 動態鏈接庫訪問接口
libm --> 數學函數庫,提供常見的數序運算和浮點運算
libstd --> 標準C++
libthreaddb --> 線程調試庫,可利用此庫對多線程程序進行調試
linker --> 鏈接器

4.目錄bootable==>啓動引導相關

bootable目錄下:

bootloader --> 引導
diskinstaller --> Android鏡像打包器
recovery --> 系統恢複相關
recovery目錄下:
  1、恢復出廠設置
  2、OTA升級

5.目錄build==>編譯Android系統、Android SDK、及相關文檔

make、shell、Python;

build目錄下:
core–>Build系統核心文件
定義了整個Build系統的框架

6.目錄cts==>兼容性測試用例

手機製造商、運營商在Android打造、定製自己特有的手機操作系統==>添加/更改Android系統源碼==>規範更改==>方便上層應用的移植

CTS:對手機的硬件、軟件、接口、性能進行測試

通過CTS測試的Android手機系統,Google纔會頒發許可,以保證不同廠商之間的Android系統的兼容

一系列Junit Test Suit==>配置xml文件+命令==>自動化測試

測試內容:
    1、數據——>必須實現一種無線連接、速率達到200Kbit/s
    2、Camera——>至少2M pixels
    3、重力加速——>必須有,三維>50Hz
    4、指南針——>必須有,三維>10Hz
    5、GPS——>必須有
    6、內存,Nand、MMS/SMS、AlarmClock
    7、第二次啓動一個應用的時間不能超過第一次啓動時間
    8、CTS測試——>必須通過最新的CTS
    9、升級——>必須有一種方法升級系統(OTA、USB、SD卡)

CtsTestCaseList.mk——>cts模塊組件的編譯選項配置,對於自己添加的測試用例,需要添加進這裏面的cts_test_package變量中

cts/tools/tradefed_host/README——>介紹如何配置cts環境以及使用的常用命令

7.目錄dalvik==>一個應用對應一個單獨的Dalvik虛擬機實例

Java虛擬機和Dalvik虛擬機的區別:
1.Dalvik虛擬機使用dex格式類文件,一個dex文件包含若干個類==>可以將各個類中重複的字符串,和其他常數只保存一次——>節省空間,適合在內存和處理器速度有限的手機系統中使用。
2. Java虛擬機使用class格式類文件,一個class文件包含一個類
3. Dalvik虛擬機使用的指令是基於寄存器的==>更多指令空間
4.Java虛擬機使用的指令是基於堆棧的==>更多指令
特性:

 內存管理、垃圾收集、JIT、JNI、以及進程和線程管理

Dalvik目錄下:
dexdump——>生成dex文件反編譯查看工具
dexlist——>查看dex文件裏所有類的方法的工具
dexopt——>生成dex優化工具
dx——>生成從Java字節碼轉換成dalvik機器碼的工具
libdex——>生成主機和設備處理dex文件的庫
tools——>保存編譯/運行相關的工具
(*)vm——>保存虛擬機絕大部分代碼,包括讀取指令、執行指令等
hit——>生成顯示堆棧/對象信息的工具

目錄developers==>開發者目錄

具體作用未知

目錄development==>提供開發所需的工具、例程

工具:cmds/monkey、ide、sdk——>build/sdk.atree、ndk、pdk

例程:apps——>核心應用
     samples——>API演示程序、NotePad等 

external目錄 (android使用的一些開源的模組)

目錄簡單功能參考:Android之external部分目錄功能說明整理 當然不是很完整~

frameworks (核心框架——java及C++語言)

推薦一篇文章詳細查看也方便以後的查看:android framework源碼目錄介紹

android包、API位置:
frameworks/base/core/java
frameworks/base/location/java
frameworks/base/graphics/java
frameworks/base/media/java
frameworks/baseopengl/java
frameworks/base/wifi/java
android資源包 資源文件:圖片、多國語言字符串、佈局文件、
位於frameworks/base/core/res

目錄hardware==>硬件抽象層

描述對linux kernel中的相關驅動模塊的具體操作,而在kernel中的驅動模塊只擁有通用錯左接口,比如設置寄存器值、IO拉高拉低、但是具體設置什麼值,拉高拉低的時序都是在hardware層相應的module中,這是Google對硬件驅動的商業保護

./libhardware/hardware.c——>hardware機制核心所在,定義了相關規則,比如load打開modules編譯生成的.so,抽象成一個module,向上層提供hw_get_module接口以及module配置宏

./libhardware/modules——>與kernel相對應module存放的地方,頭文件存放在同級目錄的include中,在其中定義了module結構、接口方法、以及唯一的moduleID

目錄sdk、ndk、pdk

目錄packages==>應用程序包

packages目錄下:
    app——>藍牙、瀏覽器、計算器、日曆、相機、聯繫人通訊錄、桌面鬧鐘、撥號器、Email、相冊、登錄啓動項(顯示圖片框架等圖形界面、負責應用的調度)、音樂播放器、安裝/卸載應用、設置、錄音機等系統默認應用(出廠時安裝應用) 

inputmethods——>輸入法
providers——>提供應用界面所需的數據、如日曆、聯繫人等
services——>彩信、來電
wallpapers——>牆紙==>基礎壁紙、動態壁紙等

目錄platform_testing

目錄prebuild==>預編譯

目錄system==>Android系統底層的文件系統、應用組件、包含一些系統庫、以及啓動的配置文件
Init.cpp、propery_service.cpp==>系統啓動
Android啓動過程
system目錄下:
Vold——>磁盤掛載機器
linux下采用udev機制

參考文章:http://blog.csdn.net/wo_sxn/article/details/50532071
http://blog.csdn.net/fengliang191/article/details/40678731
參考:老羅Blog
Dalvik虛擬機的啓動過程
Dalvik虛擬機的運行過程
JNI函數的註冊過程
Java進程和線程的創建過程分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章