1. Android的底層任務管理及驅動都是基於Linux系統的;
2. Linux系統使用的檔案系統與Windows(儲存類檔案系統)差別很大,採用的是根檔案系統(rootfs),特點如下:
- Linux系統中所有的資源都是檔案,比如磁碟、隨身碟、記憶體、網路等硬體裝置,當然還有磁碟上的資料檔案;
- sys/proc/dev這三個目錄他們對應的不是儲存空間,而是裝置檔案,由核心及相應驅動程式維護;
- 儲存類檔案系統不能和rootfs並列存在,只能掛載到子目錄上,相應的命令為mount/umount;
- 與Windows對應的儲存類檔案系統包括ext2/ext3/ext4/yaffs;
3. Linux啟動過程
- 開機並執行bootloader程式:
- 給系統供電,硬體電路產生確定的複位時序,確保CPU最後被複位,不然當CPU工作時其他硬體(比如記憶體、硬碟等)的寄存器還沒準備好;
- 複位之後CPU執行第一條指令,該指令對應的記憶體位址應該是固定的,一般由CPU的製造者指定,這段固定地址儲存的程式就是所謂的“引導程式”Bootloader;
- 作業系統核心初始化,包括初始化各種硬體,包括記憶體、網路介面、輸入裝置等,然後建立各種內部資料結構用於多線程調度和記憶體管理等;
- 執行第一個應用程式,傳統的Linux就是一個Terminal;其實就是提供一個入口可以啟動其他應用程式;
4. Android啟動過程
- Android系統大多都運行於ARM處理器中,當複位完畢之後,CPU執行的第一條指令一般是位於ROM(一般是Nand Flash)中的uboot/fastboot,就是對應Linux系統下的bootloader;作用就是初始化某些硬體介面(比如Nand Flash介面、USB口),並提供一些調試功能,比如像Nand Flash中寫入新資料,可用於開發過程中的核心燒寫、升級等;
- uboot被裝載之後一般會檢測使用者是否按下了某些特別按鍵(uboot在編譯時間就預先約定好的)進入偵錯模式;若沒有特別按鍵,則uboot直接從Nand Flash中裝載Linux核心並進行初始化;
- 執行第一個Android應用程式Home,或者叫Laucher;
5. 瞭解Make命令、MakeFile檔案,對於C/C++程式而言自動化編譯打包必備工具,和java中的ant功能類似;其基本文法為:
目標(Target) : 條件(prerequest)
(Tab鍵)命令
- 目標Target可以是任意的字串、或者某個檔案名稱;
- 條件prerequest可以是具體的檔案名稱,也可以是某個目標Target;
- 執行make指令碼時,Make解譯器會檢查目標與條件中包含的檔案時間戳記是否相同,若不同,則執行Tab鍵後面的命令,命令可以是任意的可執行程式;
- 一些常用到的make文法說明如下:
- $符號為函數調用符,函數可以分為三類(多個參數用,分割):
- $(fname param…) 此時調用的函數為Make解譯器內部定義好的函數,在指令碼中的任何地方都可直接調用
- $(call frame,param…) 此時調用的是使用者用define關鍵字生命的自訂、帶參數函數
- $(fname) 此時調用的是宏,即使用者自訂的無參數函數
- .PHONY關鍵字用於聲明一個目標,被聲明的目標將總是執行Tab鍵後的命令,而不管條件和目標中檔案的時間戳記是否相同;
- 命令前可以加@符號,表示在控制台不顯示該條命令;預設情況下是會自動列印的;
- 在使用define聲明自訂函數中可以用$(N)來擷取輸入參數,$(0)代表函數名稱,$(1)就代表第一個輸入參數,以此類推;
- Make解譯器內有很多內建符號,均以$打頭,比如$@就代表target目標名稱;
- --directory(-c) 可以指定要執行的MakeFile/MakeFile.mk的路徑;
- --file(-f) 可以指定要執行的MakeFile名稱,指定的名稱可以自訂,只要滿足make文法規則即可;
- --just-print(-n) 僅僅列印出要執行的命令,而不是真正執行目標對應的命令;該選項在後面的分析Android編譯系統時非常有用;