從事Android源碼開發,對於Android Build系統下的常用編譯命令必須熟悉,現列出常用的一些命令。而關於Android Build系統的詳細介紹請參看https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
引用上述鏈接中的兩段話,介紹一下Android Build系統:
整個 Build 系統中的 Make 文件可以分為三類: [1] Build 系統核心文件,此類文件定義了整個 Build 系統的框架,而其他所有 Make 文件都是在這個框架的基礎上編寫出來的。 Build 系統核心文件全部位於 /build/core目錄下 [2] 針對某個產品(一個產品可能是某個型號的手機或者平板電腦)的 Make 文件,這些文件通常位於 device 目錄下,該目錄下又以公司名以及產品名分為兩級目錄 [3] 針對某個模塊(關於模塊后文會詳細討論)的 Make 文件。整個系統中,包含了大量的模塊,每個模塊都有一個專門的 Make 文件,這類文件的名稱統一為“Android.mk”,
該文件中定義了如何編譯當前模塊。Build 系統會在整個源碼樹中掃描名稱為“Android.mk”的文件並根據其中的內容執行模塊的編譯。
整個 Build 系統的入口文件是源碼樹根目錄下名稱為“Makefile”的文件,當在源代碼根目錄上調用 make 命令時,make 命令首先將讀取該文件。
Makefile 文件的內容只有一行:“include build/core/main.mk”。該行代碼的作用很明顯:包含 build/core/main.mk 文件。在 main.mk 文件中又會包含其他的文件,
其他文件中又會包含更多的文件,這樣就引入了整個 Build 系統。
1、編譯整個Android系統:
source build/envsetup.sh //初始化編譯環境,並引入一些輔助的shell函數 lunch XXX //編譯選項,不同的項目不同 make -j8 //開啟8個線程編譯,可任選,具體根據編譯服務器的核數而定
//上述編譯后,還需要編譯modem,一般需要先切換至modem目錄,然后執行相關腳本,不同項目也不同。
//需要說明的是,不編譯modem或者modem編譯失敗,並不影響單獨模塊的編譯;但可能會影響到刷機.
以下列出envsetup.sh中定義的常用函數,即命令如下:
名稱 說明 croot 切換到源碼樹的根目錄 m 在源碼樹的根目錄執行 make mm Build 當前目錄下的模塊 mmm Build 指定目錄下的模塊 mma 編譯當前目錄下的模塊及其依賴項 mmma 編譯指定目錄下的模塊及其依賴項 cgrep 在所有 C/C++ 文件上執行 grep jgrep 在所有 Java 文件上執行 grep resgrep 在所有 res/*.xml 文件上執行 grep godir 轉到包含某個文件的目錄路徑 printconfig 顯示當前 Build 的配置信息 add_lunch_combo 在 lunch 函數的菜單中添加一個條目
2、常用的make 目標:
make help 顯示主要的make目標 make clean 清理,等同於 rm -rf out/ make sdk 編譯出 Android 的 SDK。 make clean-sdk 清理 SDK 的編譯產物 make update-api 更新API, 在 framework API 改動之后,需要首先執行該命令來更新 API,公開的 API 記錄在frameworks/base/api 目錄下 make bootimage 生成boot.img make recoveryimage 生成recovery.img make userdataimage 生成userdata.img make cacheimage 生成cache.img make systemimage 生成system.img
3、產品的編譯類型:
eng:工程機
user:最終用戶機
userdebug:調試測試機
tests:測試機
4、單獨編譯某個模塊:
(1)cd到模塊目錄(含有Android.mk),然后執行命令:mm
(2)有些模塊調用了系統的一些hide函數,因此需要在根目錄下編譯:make XXX ; 否則編譯不過,例如SystemUI.
將編譯好的模塊(也就是apk),push到設備上的步驟如下:以圖庫模塊為例。
//若設備還未root,可執行下述兩個命令 adb root adb remount //執行push adb push ... /system/app/Gallery2/
5、刷機:三種方式。
(1)使用平台提供的刷機軟件exe,(可視化的用戶界面)進行刷機。
(2)使用命令:
adb reboot edl //進入刷機模式, 非高通平台可能無效 在命令行切換目錄至modem/fastboot; 點擊update_all.bat運行即可
(3)使用命令,根據需要燒錄指定鏡像img或者所有img.(這些img在out/target/product/...目錄下),燒錄一個文件的命令如下,其他同理:
adb reboot bootloader //進入fastboot模式 fastboot flash system system文件【system.img文件全路徑】 fastboot reboot //重啟設備
使用命令行刷機,可能出現的問題:
例如:以system.img為例.
fastboot flash system ... sending 'system' (1048262 KB)... FAILED (remote: data too large) finished. total time: 0.016s 刷機出現上述問題,原因: fastboot.exe版本太低,在sdk/platform-tools/下更新fastboot.exe
6、其他刷機命令:
(1)http://bbs.zol.com.cn/sjbbs/d1763_170025.html