源碼編譯運行android emulator


source buile/envsetup.sh

lunch sdk-eng

make sdk -j2

編譯完之后,sdk安裝在了下面的目錄里

ANDROIID_DIR/out/host/linux-x86/sdk

在這個目錄下有一個壓縮包,里面就是我們從eclipse里下載的sdk的包。

如果你做過app開發都會知道,我們只有下載了不同版本的sdk之后才能創建不同版本的模擬器,我們編譯完sdk之后就可以創建模擬器了

$ cd ANDROIID_DIR/out/host/linux-x86/sdk/android-sdk_eng.linux_linux-x86/tools

首先,查看當前sdk的Id號,用於創建一個模擬器

$ ./android list targets

Available Android targets:
----------
id: 1 or "android-14"
     Name: Android 4.0
     Type: Platform
     API level: 14
     Revision: 2
     Skins: WXGA800, WQVGA400, WXGA720, HVGA, WVGA854, WQVGA432, WVGA800 (default), QVGA, WSVGA
     ABIs : no ABIs.

 

創建一個模擬器

$ ./android create avd -n mydroid -t 1

-n 表示指定模擬器的名字, -t表示指定創建模擬的版本id

啟動模擬器

$ ./emulator &

由於模擬器要啟動android系統,他要使用幾個映像文件,分別是:kernel-qemu , system.img, userdata.img, ramdisk.img

kernel-qemu:內核映像文件,它是linux操作系統針對qemu模擬器編譯的內核文件,里面安裝有qemu的仿真硬件驅動,如果將來在開發板或手機上移植android,那么,第一步就是要先make出一個支持開發板或手機的kernel來

system.img:是android系統的文件系統,里面包含了android系統的應用程序(apk),系統用到的各種庫(jar, so, a)和資源, 配置文件(etc目錄下),系統命令(bin, usr/bin, xbin) ,該映像文件是由out/target/product/PRODUCT/system目錄打包生成的,我們可以對這個目錄里的東西進行定制 化,比如,你要想讓android系統默認為安裝一個應用程序,那么可以將要安裝的apk文件拷貝到out/target/product /PRODUCT/system/app目錄下

userdata.img:用戶數據映像,里面包含有程序安裝信息,好比如是windows的C:/Program Files/目錄

ramdisk.img:內存磁盤映像,這個文件對於沒有做過Linux移植的人來說,不好理解,linux內核啟動起來,要掛載一個文件系統作為 自己的根文件系統,通常文件系統是存放在塊設備上的,也就是硬盤或flash上的。一個linux的根文件系統里面通常包含有以下內容:

usr:最大的目錄,存放應用程序和文件

bin:常用的命令目錄

etc:系統相關配置文件目錄

dev:系統設備目錄

opt:主機額外安裝的軟件目錄

boot:存放系統啟動時必須讀取的配置文件,包括核心 (kernel) 在內

home:普通用戶家目錄

lib:系統使用庫目錄

var:日志文件目錄

lost+found:系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下

mnt:外設的掛載點目錄

proc:虛擬文件目錄,是系統信息的映射

root:root用戶家目錄

sbin:超級命令所在目錄

tmp:一般使用者或者是正在執行的程序暫時放置文件的地方

而ramdisk.img這個映像,其實里面就是上述目錄和一些基本配置文件的打包映像,ramdisk是將映像加載到內存里,然后將內存當做一個塊設備(硬盤)來使用,所以說通常ramdisk.img通常比較小。當然,除了上面的FHS標准的Linux文件系統目錄以外,android系統里,還增加了data,system目錄。

前面所述的userdata.img和system.img映像,其實就是掛載到data,system目錄下的。

我們可以通過下面的命令,來指定模擬器,啟動哪個內核,使用哪些文件系統:

./emulator -avd mydroid -system ANDROIID_DIR/out/target/product/generic/system.img  -data ANDROIID_DIR/out/target/product/generic/userdata.img -ramdisk ANDROIID_DIR/out/target/product/generic/ramdisk.img  -kernel ANDROIID_DIR/prebuilt/android-arm/kernel/kernel-qemu-armv7
-system指定system.img

-data指定userdata.img

-ramdisk指定ramdisk.img

-kernel指定內核映像

實驗:對androd系統進行瘦身

android系統抽屜里顯示的應用存放在out/target/product/PRODUCT/system/app目錄里,我們可以將一些不 常用的,不想用的apk文件刪除,一來減小Android的體積,二來可以加快系統啟動速度,因為在系統啟動時,會掃描system/app目錄下的 apk文件,對比有沒有安裝更新。

刪除一些apk,去掉計算器,日歷,電話,短信

$ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Calculator.*

$ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Calendar.*

$ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Email.*

$ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Message.*

$ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Telephone.*

刪除了之后,執行下面的命令,只編譯system.img,而不去檢查依賴關系,這樣很快就能編譯完

$ make snod

注:上述命令必須要保證執行了source buile/envsetup.sh和lunch full-eng之后,以后只要是說make,都指已經執行了前述兩步驟

snod的意思是編譯system imge no dependency

然后,再重新啟動模擬器,指定自己編譯的system.img,查看抽屜里有沒有我們刪除的應用

./emulator -avd mydroid -system ANDROIID_DIR/out/target/product/generic/system.img  -data ANDROIID_DIR/out/target/product/generic/userdata.img -ramdisk ANDROIID_DIR/out/target/product/generic/ramdisk.img  -kernel ANDROIID_DIR/prebuilt/android-arm/kernel/kernel-qemu-armv7

思考:我們能不能將全部的system/app下的apk刪除掉,如果不能,哪些必須要保留,為什么?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM