Android系統零碎知識整理

Android Runtime

Android includes a set of core libraries that provides most of the functionality available in the core libraries of the Java programming language.

Every Android application runs in its own process, with its own instance of the Dalvik virtual machine. Dalvik has been written so that a device can run multiple VMs efficiently. The Dalvik VM executes files in the Dalvik Executable (.dex) format which is optimized for minimal memory footprint. The VM is register-based, and runs classes compiled by a Java language compiler that have been transformed into the .dex format by the included "dx" tool.

The Dalvik VM relies on the Linux kernel for underlying functionality such as threading and low-level memory management.


Eclipse工具集

Eclipse中window - show window - android 下有許多很好用的工具窗口:

Emulator control 可以向Emulator發起電話,發短信等。
LogCat可以查看設備輸出的log,類似於串口的log。
Devices顯示正在運行的進程,可以設置查看某個進程的線程,堆信息,停止進程,捕獲圖片、進行debug等。
File Explorer顯示手機存儲器上的文件列表,並提供從PC導入文件,導出文件到PC,刪除手機上文件等功能。
Threads查看線程信息,需要在Devices窗口中設置查看哪個進程。
Heap 查看內存分配信息,需要在Devices窗口中設置查看哪個進程。


Android專有驅動

Android添加了許多驅動,他們一般不操作實際的硬件,只是輔助系統的運行。

主要的Android專有驅動如下:

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過程將遞歸找到各個目錄中的Android.mk文件進行編譯。

Android的kernel需要單獨配置和編譯,編譯過程和通常的linux內核相同。

編譯結果都在根目錄下的out目錄中。結果包含以下內容:(1)主機工具(2)目標機程序(3)目標機映像文件(4)目標機Linux內核(需要單獨編譯)

其中out/target/product目錄是目標產品的目錄,在默認情況下使用generic作爲目標產品的名稱。

單模塊編譯

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


文件系統

編譯android源碼之後,在out/target/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打包壓縮得到的。
系統啓動時先掛載ramdisk.img,接着分別把system.img和userdata.img掛載到 ramdisk下的system和data目錄。

根文件系統:系統啓動時第一個mount的文件系統,其下可能會繼續掛載其他的文件系統。
/out/target/product/generic/root包括以下目錄: data、dev、proc、sbin、sys、system、init/init.rc等。

主文件系統
/out/target/product/generic/system包括以下目錄:app、bin、etc、fonts、framework、lib、usr、xbin

=> 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.

=> 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分別是動態庫和靜態庫的目錄。

編譯出來的應用程序就是放在system/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,因此這個進程將一直存在,一旦這個進程被殺死,init進程會將其重新啓動。


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)對應的應用。



發佈了11 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章