Android筆記 (源代碼結構/編譯/開機過程…等)

Android專有驅動
Android添加了許多驅動,他們一般不操作實際的硬件,只是輔助系統的運行。
主要的Andr​​oid專有驅動如下:

  • Ashmem(Anonymous Shared Memory):匿名共享內存驅動,為Android系統提供了內存分配功能,實現類似malloc的功能。
  • Logger:輕量級的log驅動。 logcat程序調用此驅動。 logger有三個設備節點:/dev/log/main, /dev/log/events, /dev/log/radio
  • Binder:基於OpenBinder系統的驅動,為Android平台提供IPC支持。
  • Android Power Management(PM):電源管理模塊。
  • Low Memory Killer:在缺少內存時,殺死進程。
  • Android PMEM:物理內存驅動。

android源代碼結構
源代碼的工程分為3部分:

  • (1)核心工程:建立Android系統的基礎。包含以下目錄:
    bionic、bootable、build、dalvik、development、frameworks、hardware、kernel、prebuilt、system
  • (2)擴展工程:使用其他開源項目擴展的功能,在external文件夾中。
  • (3)包(package):提供Android的應用程序和服務,在package文件夾中。包括應用程序(Applications)、內容提供器(ContentProviders)和輸入法(inputmethods)三部分。 Launcher是Andorid的主屏幕。

Android的源碼目錄如下:
–repo –主要是同步管理所用到的一系列文件
–bionic –Android編譯過程所需要的一些庫
–bootable –負責啟動和備份的一些文件
–build –最主要的一些makefile和編譯配置文件
–dalvik –經過Google優化了的java虛擬機
–development –​​開發用的一些文件夾,包括模擬器和工具等
–external –Android工程中引入的外部功能庫
–frameworks –中間件部分
–hardware –和硬件有關的一些支持文件,包括wifi,電信模塊等
–kernel –經過了優化和修改的linux內核
–packages –所有的上層應用包
–prebuild –Android編譯工具所在目錄
–system –一些系統級文件


編譯方法:
android系統根目錄下有一個Makefile,直接執行make即可。
make過程將遞歸找到各個目錄中的Andr​​oid.mk文件進行編譯。
Android的kernel需要單獨配置和編譯,編譯過程和通常的linux內核相同。
編譯結果都在根目錄下的out目錄中。
結果包含以下內容:(1)主機工具(2)目標機程序(3)目標機映像文件(4)目標機Linux內核(需要單獨編譯)
其中out/ta​​rget/product目錄是目標產品的目錄,在默認情況下使用generic作為目標產品的名稱。

單模塊編譯
mm命令用來在Android源碼中編譯單個模塊
mm命令運行前在Android根目錄下執行一下. build/envsetup.sh 然後進入待編譯的模塊目錄,執行mm即可。
mm -B (強制重編)


文件系統
編譯android源碼之後,在out/ta​​rget/product/generic一些文件:ramdisk.img、system.img、userdata.img、 system、 data、root

其中root、system、data三個目錄分別是目標根文件系統、主文件系統和數據文件系統的目錄。
– ramdisk.img 根文件系統映像
– system.img 主文件系統映像
– userdata.img 數據映像

  • 其中,system.img是由system打包壓縮得到的,userdata.img是由data打包壓縮得到的,而 root目錄先被打包生成了ramdisk.img,然後才合並進boot.img的。系統啟動時先掛載ramdisk.img,接著分別把system.img和userdata.img掛載到ramdisk下的system和data目錄。
  • 根文件系統:系統啟動時第一個mount的文件系統,其下可能會繼續掛載其他的文件系統。
    • /out/ta​​rget/product/generic/root 包括以下目錄:data、dev、proc、sbin、sys、system、init/init.rc等
    • ramdisk.img is gziped archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.
  • 主文件系統:
    • /out/ta​​rget/product/generic/system包括以下目錄:app、bin、etc、fonts、framework、lib、usr、xbin
    • system.img is a partition image that will be mounted as /system and thus contains all system binaries.
  • userdata.img is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data
  • obj 是中間目標文件目錄,其下面的APPS是java應用程序包的目錄,EXECUTABLES 是可執行程序的目錄,SHARED_LIBRARIES 與 STATIC_LIBRARIEs分別是動態庫和靜態庫的目錄。
  • 編譯出來的應用程序就是放在sy​​stem/app下的;用戶安裝的程序則是放在data/app下。

Android系統進程 開機過程
Android幾個重要的系統進程為/init、/system/bin/servicemanager、/system/bin/mediaserver、zygote及system_server。
init通過解析init.rc,啟動對應的服務程序。 servicemanager、zygote、mediaserver就是通過這種方式啟動;
出來system_server則通過zygote孵化。這幾個進程是Android系統運行的基礎。

  • (1)servicemanager是Binder的服務管理守護進程,也是Binder機制的核心,所有Binder服務都會通過它進行註冊,客戶端再通過它獲取服務接口。
  • (2)zygote是Android java部分的孵化器,也就是Android java框架的基礎。 zygote首先孵化出system_server,這是Android絕大多數係統服務的守護進程。之後system_server與zygote一起完成其他所有Android的應用程序進程的啟動。
  • (3)mediaserver是多媒體服務的守護進程,負責多媒體、照相機、音頻三項服務。

多媒體服務進程 MediaServer
多媒體服務的守護進程路徑是frameworks/base/media/mediaserver,只有一個源文件main_mediaserver.cpp將被編譯成一個可執行程序mediaserver,負責多媒體、照相機、音頻三項服務。

在Android的init.rc中具有如下定義:
service media /system/bin/mediaserver
user media
group system aduio camera graphics inet net_bt net_bt_admin

由於沒有定義oneshot,因此這個進程將一直存在,一旦這個進程​​被殺死,ini​​t進程會將其重新啟動。


Modem與RIL
實現電話功能的主要硬件是通信模塊(modem),modem通過與通信網絡進行溝通,傳輸語音及數據,完成呼叫、短信等相關電話功能。

  • modem硬件上一般提供兩個通道:一個用於AT命令,另一個用於數據傳輸。也有的並不區分,只提供了一個通道,這就需要實現MUX(多路復用)協議,在軟件層將其分離開,以供AT和數據連接分別使用。
  • 複雜的AT相關處理一般不放在Modem驅動層,而是通過其上的RIL層完成。 RIL負責AT命令的發送及響應解析,這是電話服務的實現基礎,另外,RIL還負責數據的可靠傳輸。

權限相關
apk應用是有權限上限的,也就是說有一些權限apk應用無論如何也獲取不到,即使該apk屬於root賬號。
另外,android中權限是可傳遞的,也就是說子進程的權限不會超過父進程的權限。
也就是說,雖然某個單獨的linux程序有權限對某個文件進行操作,但如果這個程序的調用者權限不足,
也還是不行的。

另外,system/app下的應用程序的權限高於adb install安裝的應用程序。
有些權限,只有系統程序才能獲取,並不是說只要聲明了就可以獲取的。
比如:WRITE_SECURE_SETTINGS,Only system software can modify these settings.

adb install安裝的apk程序是安裝到了/data/app目錄下,adb並沒有一個有效的卸載的命令(adb uninstall貌似無效),如果要卸載的話可手動到/data/app目錄下刪掉(rm)對應的應用。

分類: 未分類

發表迴響