Android 技術專題系列之三 -- 編譯(build) 流程

 原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=2711&highlight=Android%2B%E6%8A%80%E6%9C%AF%E4%B8%93%E9%A2%98

 

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章