android學習總結四:如何編寫自己的Android.mk

這一期呢主要講的是如何編寫自己的Android.mk
首先呢,我們來看一下Android.mk的作用,如果我們想要在Android的環境下編譯生成自己想要的文件,我們可以生成二進制的可執行文件,可以生成動態庫、靜態庫,這是對於CC++層來說,那麼對於我們得java層來說,Android.mk編譯生成jar包或者Android.apk
這些Android.mk的編寫都是我們基於Android.mk的基本語法來實現的,如果我們想在Android目錄下來編寫自己的項目,那我們就必須學會Android.mk的編寫。
下面我們來分析一個最基礎的Android.mk,一個最簡單的Android.mk有下面幾行就足夠了
下面我們來介紹一下每一行都是幹什麼的:
LOCAL PATH:=$(call my-dir)定義了當前模塊的相對路徑
include $(CLEAR_VARS) 清空當前環境變量
LOCAL_MODULE:=test編譯生成的目標名稱
LOCAL_SRC_FILES:=test.c 編譯該模塊需要的源文件
include $(BUILD_EXECUTABLE)編譯所生成的目標文件格式
下面我們看一下編譯的過程
首先進入安卓源碼目錄,然後看一下external/test/目錄,可以看到這個目錄下有兩個文件,一個是Android.mk,一個是test.c,接下來我們先來配置一下環境變量.build/envsetup.sh
然後選擇我們的lunch,我們在這裏依然選擇的是19. fiber_a31st-eng
然後我們來看一下我們的源代碼cat external/test/test.c
這個呢就是一個很普通的c文件,打印了一條“Hello Android
然後我們再來看一下Android.mk,可以看到他和我們上邊所說的是一樣的
我們再來編譯一下這個項目
我們可以看到,其實就是把test.c編譯生成了一個可執行文件test,最後把這個文件放在了out/target/product/fiber-a31st/system/bin/test/這裏
我們可以用file命令來看一下它的格式,他是一個32位的在ARM上運行的二進制文件
接下來我們使用命令vi external/text/Android.mk來看一下它的Android.mk
首先是一個環境變量,配置了我們的LOCAL_PATH,我們來找一下我們的LOCAL_PATH是在哪裏定義的
我們可以看到,我們的my_dir它是在build/core/definitions.mk裏邊定義的http://tiyubisai.com/video_news/news_135501.html
下面我們來分析一下,第一行是拿到了一個環境變量,它所取的是我們的MAKEFILE_LIST裏邊的最後一行,我們這個MAKEFILE_LIST是在我們做編譯的時候,當前目錄下的Android.mk會被加載到這個裏邊,而lastWord是取最後一個makefile
第二行,會首先判斷這個環境變量中是否包含這個文件,如果有,我們會認爲這個Android.mk是有問題的,然後打印出一行代碼,如果沒錯誤,我們就會把Android.mk所在的目錄給返回去,所以我們能得到我們的LOCAL_PATH,也就是android.mk所在的目錄
我們再來看一下里邊的CLEAR_VARS是在哪裏定義的,我們看一下這個build/core/config.mk,然後查找一下他是在哪裏定義的
我們可以看到,我們的CLEAR_VARS就是BUILD_SYSTEM下面的clear_vars.mk,那我們再來看一下這個BUILD_SYSTEM,他是在哪裏定義的,我們再使用sp命令打開一個終端
可以看到在build/core/main.mk中它的定義是在build/core目錄下定義的,那我們切換到build/core下的clear_vars.mk
可以看到他所做的事情就是把我們這些變量全部清空,其實這個LOCAL_PATH是不清除的,
所以我們的clear.vars所做的事就是清除除LOCAL_PATH以外的所有環境變量
然後我們切換到Android.mk中,我們把LOCAL_PATH放到CLEAR_VARS下邊進行編譯
mmm external/test
然後就會看到會報一個錯誤
第三行就是我們編譯生成模塊的名稱
第四行就是我們的源文件,最後一行就是我們要生成文件的格式
如果我們想改一下我們生成的位置,我們可以加一下LOCAL_MODULE_PATH:=$(LOCAL_PATH)這樣我們就能在當前目錄下生成我們的test
首先touch一下我們的external/test/test.c然後進行編譯
我們可以看到他的目錄進行了改變所以說這個LOCAL_MODULE_PATH指定我們的目標文件所生成的目錄
如果說我們的源碼文件不只是有一個,而是有多個那我們應該如何來添加源文件
首先我們進入到test目錄下,新建一個test1.c,我們不做任何事情,就寫一個空的
我們需要把它也編譯進去,我們需要改一下Android.mk,在LOCAL_SRC_FILES中使用連接符來連接文件,這樣我們就能把兩個文件都編譯上
接下來我們使用mm進行編譯,這樣就把test1.c也就編譯進來了
所以我們再來簡單總結一下我們剛纔學到的語法
LOCAL PATH:=$(call my-dir)定義了當前模塊的相對路徑
include $(CLEAR_VARS) 清空當前環境變量,除了LOCAL_PATH
LOCAL_MODULE:=test編譯生成的目標名稱
LOCAL_SRC_FILES:=test.c 編譯該模塊需要的源文件
include $(BUILD_EXECUTABLE)編譯所生成的目標文件格式
這些就是對Android.mk的基本認識了
http://blog.csdn.net/chengfeng135/article/details/49618227
http://blog.csdn.net/chengfeng135/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章