Android使用的build系統與普通Linux軟件使用的build工具有很大不同,因而,可能使熟悉傳統Linux開發工具的程序員稍感陌生。普通的軟件項目一般使用autotools工具,包括autoconf,
automake, libtool等,利用這些工具來自動生成Makefile。而Android創建了一套自己的系統來生成Makefile。下面對Android的build系統作一初步探討。Android源碼中的build/core/build-system.html是我們研究Android
build系統的基本文檔。本文基於這一文檔並進一步展開。 Android build系統定義了一套自己的變量,宏等,如LOCAL_MODULE_TAGS, LOCAL_PACKAGE_NAME等。如何代入這些變量,如何展開這些宏,都在build/core目錄下的文件中定義。 開發人員可以使用這些變量編寫Android build系統的Makefile -- Android.mk。每個模塊,如一個應用,一個共享庫等,都有一個自己的Android.mk。在編譯的時候,Android.mk中的宏就會被展開成相應的Make規則,變量也會代入相關的規則。 下面以packages/apps/AlarmClock/Android.mk舉例介紹: ~~~~~~~~ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := eng development LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := AlarmClock include $(BUILD_PACKAGE) ~~~~~~~~~~ 關於這些變量的含義,在build/core/build-system.html中都有具體介紹。值得注意的是,如果是生成一個可執行程序,則引用BUILD_PACKAGE,如果生成一個library,則引用BUILD_SHARED_LIBRARY。我們可以模仿現有的Android.mk去創建自己的Android.mk。 build/envsetup.sh中引入了幾個方便的命令可用來幫助執行build命令。 m: 執行對整個Android源碼的build mm: 執行對當前目錄下模塊的build. printconfig: 當前build的配置情況。 在整個Android源碼編譯完成後,生成的二進制文件以及image等都安裝在out/目錄下。通過如下命令序列可以啓動emulator (假設Android源碼安裝在~/mydroid目錄下): export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic/ cd ~/mydroid/out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates ./emulator |