1. Android.mk示例 LOCAL_PATH := $(call my-dir) #指定當(dāng)前目錄 include $(CLEAR_VARS) #清除一些變量的值,,但是LOCAL_PATH除外 LOCAL_MODULE_TAGS := optional #編譯選項(xiàng)便是在何種情況下編譯 LOCAL_SRC_FILES := hello.c #源文件(可以指定多個(gè)) LOCAL_MODULE := hello #編譯出來的模塊名 LOCAL_MODULE_CLASS := EXECUTABLES #指定編譯之后放置的位置(此處指示放在system/bin下) include $(BUILD_XXX) #引入編譯規(guī)則 BUILD_EXECUTABLE 編譯成可執(zhí)行的模塊 build/core/host_executable.mk BUILD_STATIC_LIBRARY 編譯成靜態(tài)庫(kù),前綴為lib,,后綴為.a,,build/core/host_static_library.mk BUILD_SHARED_LIBRARY 編譯成動(dòng)態(tài)庫(kù),前綴為lib,,后綴為.so,,build/core/host_shared_library.mk 靜態(tài)庫(kù)不會(huì)復(fù)制到的APK包中,但是能夠用于編譯共享庫(kù),,生成一個(gè)名為 lib$(LOCAL_MODULE).a 的文件 2. 常用模塊描述變量: LOCAL_PATH: 給出當(dāng)前文件路徑,,必須在Android.mk開頭定義,可以這樣使用: LOCAL_PATH := $(call my-dir) 這個(gè)變量不會(huì)被$(CLEAR_VARS)清除,, 因此每個(gè) Android.mk 只需要定義一次(即使在一個(gè)文件中定義了幾個(gè)模塊的情況下)。 LOCAL_SRC_FILES:要編譯的源碼文件列表,,編譯系統(tǒng)自動(dòng)計(jì)算依賴,, 注意:文件名稱相對(duì)LOCAL_PATH計(jì)算;文件之間使用空格或者tab鍵分隔開,,換行使用 / ,,另外可以使用: LOCAL_SRC_FILES := $(call all-subdir-java-files)包含所有java文件 LOCAL_MODULE:模塊名字,必須唯一,,不能包含空格,,必須在$(BUILD_XXX)之前定義,模塊名決定了生成文件的名字,。 LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態(tài)庫(kù),,以便在編譯時(shí)進(jìn)行鏈接。 LOCAL_SHARED_LIBRARIES: 表示模塊在運(yùn)行時(shí)要依賴的共享庫(kù)(動(dòng)態(tài)庫(kù)),,在鏈接時(shí)就需要,,以便在生成文件時(shí)嵌入其相應(yīng)的信息,不需要添加.so后綴,。 LOCAL_JAVA_LIBRARIES:編譯java應(yīng)用程序和庫(kù)的時(shí)候指定包含的java類庫(kù),,目前有core和framework兩種情況下定義成,LOCAL_JAVA_LIBRARIES := core framework,非必須 LOCAL_MODULE_TAGS: 模塊標(biāo)記,,一般的取值范圍為debug,、eng、test,、optional,,如果不定義則默認(rèn)為optional。對(duì)這幾個(gè)模式的解釋為: user:指 該模塊只在user版本下才編譯,; eng:指該模塊只在eng版本下才編譯,; tests:指該模塊只在tests版本下才編譯; optional:指該模 塊在所有版本下都編譯,。 LOCAL_CFLAGS:編譯C代碼有用,,附件包含路徑,宏定義或者編譯選項(xiàng),,為C,,C++編譯器定義額外的標(biāo)志,如: LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 LOCAL_MODULE_PATH:(prebuilt)指定最后的目標(biāo)安裝路徑,,默認(rèn)等于: TARGET_OUT_$(LOCAL_MODULE_CLASS),, 當(dāng)然也可以手動(dòng)指定,如$(TARGET_OUT_ETC)/permissions,,等于要安裝在system/etc/permissions目錄,。 TARGET_ROOT_OUT:表示根文件系統(tǒng)。 TARGET_OUT:表示 system文件系統(tǒng),。 TARGET_OUT_DATA:表示 data文件系統(tǒng),。 用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) LOCAL_MODULE_CLASS:(prebuilt)標(biāo)識(shí)了所編譯模塊最后放置的位置,如果不指定,,不會(huì)放到系統(tǒng)中,。 LOCAL_MODULE_CLASS := ETC 放于system/etc目錄 LOCAL_MODULE_CLASS := EXECUTABLES 放于/system/bin目錄 LOCAL_MODULE_CLASS := SHARED_LIBRARIES 放在/system/lib目錄 LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE_CLASS := APPS 放在/system/app目錄 可選項(xiàng) LOCAL_C_INCLUDES:可選變量,表示頭文件的檢索路徑,,默認(rèn)是LOCAL_PATH,。 注意:該選項(xiàng)要在LOCAL_CFLAGS/LOCAL_CPPFLAGS標(biāo)志之前進(jìn)行設(shè)置。 LOCAL_CPP_EXTENSION:可選變量,,指定C++代碼文件的擴(kuò)展名,。 LOCAL_CXXFLAGS:類似以上,針對(duì)C++源文件 LOCAL_CPPFLAGS:類似以上,,對(duì)C和C++都適用 LOCAL_PACKAGE_NAME:app的名字,,例如Contacts LOCAL_PREBUILT_EXECUTABLES:(prebuilt)預(yù)編譯including $(BUILD_PREBUILT)或 $(BUILD_HOST_PREBUILT)時(shí)所用,指定需要復(fù)制的可執(zhí)行文件,。 LOCAL_PREBUILT_LIBS:(prebuilt)是在預(yù)編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時(shí)所用, 指定需要復(fù)制的庫(kù),。 LOCAL_OVERRIDES_PACKAGES:此變量可以使其他的模塊不加入編譯,,如源碼中DeskClock的android.mk有 LOCAL_OVERRIDES_PACKAGES := AlarmClock,可以使AlarmClock不會(huì)加入到編譯系統(tǒng)中,,不會(huì)生成 AlarmClock.apk,。 LOCAL_MODULE_STEM:編譯中間文件和target的名字,如果不指定,,則使用LOCAL_MODULE,。 LOCAL_MODULE_SUFFIX:編譯目標(biāo)文件的后綴,默認(rèn)Android自動(dòng)添加,。 COMMON_PACKAGE_SUFFIX .zip COMMON_JAVA_PACKAGE_SUFFIX .jar COMMON_ANDROID_PACKAGE_SUFFIX .apk 3. 編譯宏命令:使用$(call command)方式來調(diào)用 my-dir:返回當(dāng)前Android.mk文件所在的目錄路徑,,一般在Android.mk的開頭定義LOCAL_PATH all-subdir-makefiles:返回一個(gè)當(dāng)前my-dir路徑子目錄中所有Android.mk列表 this-makefile:返回當(dāng)前makefile的路徑,即這個(gè)函數(shù)調(diào)用的地方 parent-makefile:返回調(diào)用樹中父makefile的路徑,,即包含當(dāng)前makefile的makefile的路徑 inherit-product:加載其他的prebuilt.mk Android.mk可以用于生成APK應(yīng)用程序,,JAVA庫(kù),C,,C++可執(zhí)行程序,,以及對(duì)應(yīng)的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù) 4. 一些有用的編譯模板 編譯apk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_STATIC_JAVA_LIBRARIES := gson2.2 aquery v3dcore asupport socketio LOCAL_SRC_FILES := $(call all-java-files-under, src) /src/com/letv/t2/launcher/aidl/service/LiveLayerStatusBinderInterface.aidl /src/com/letv/t2/launcher/aidl/service/BarrageObserver.aidl /# Add overlay folder. LOCAL_PACKAGE_OVERLAYS := overlay LOCAL_PACKAGE_NAME := T2Launcher LOCAL_CERTIFICATE := platform ifeq ($(findstring full_mstarnapoli,$(TARGET_PRODUCT)),full_mstarnapoli) LOCAL_JAVA_LIBRARIES := com.mstar.android endif include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson2.2:libs/gson-2.2.2.jar LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += aquery:libs/android-query.0.24.3.jar LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += v3dcore:libs/V3DCore.jar LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += asupport:libs/android-support-v4.jar LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += socketio:libs/android-websockets.jar include $(BUILD_MULTI_PREBUILT) 編譯JAVA庫(kù)模板 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY) 編譯C,C++應(yīng)用程序 LOCAL_PATH := $(call my-dir) # include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE) 編譯C,,C++靜態(tài)庫(kù) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY) 編譯C,,C++動(dòng)態(tài)庫(kù) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := helloworld.c LOCAL_MODULE := libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY) 生成結(jié)果的目錄: 1)out/target/product/generic/obj/APPS 2)out/target/product/generic/obj/JAVA_LIBRARIES 3)out/target/product/generic/obj/EXECUTABLE 4)out/target/product/generic/obj/STATIC_LIBRARY 5)out/target/product/generic/obj/SHARED_LIBRARY 每個(gè)模塊的目標(biāo)文件夾為: 1)APK 程序:XXX_intermediates 2)JAVA庫(kù)程序:XXX_intermediates 這里的XXX 3)CC++可執(zhí)行程 序:XXX_intermediates 4)CC++靜態(tài)庫(kù): XXX_static_intermediates 5)CC++動(dòng)態(tài)庫(kù): XXX_shared_intermediates 參考鏈接:http://www./news/201307/10450.shtml 5. 加載第三方應(yīng)用和類庫(kù) 集成靜態(tài)庫(kù) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PREBUILT_LIBS := libA.a libB.a LOCAL_STATIC_LIBRARIES := libA libB include $(BUILD_MULTI_PREBUILT) 集成動(dòng)態(tài)庫(kù) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := liblinkshell LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_CERTIFICATE := platform LOCAL_MODULE_SUFFIX := .so LOCAL_SRC_FILES := xxx.so include $(BUILD_PREBUILT) 集成可執(zhí)行文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := hellovprc.elf LOCAL_MODULE := hellovprc.elf LOCAL_MODULE_CLASS := EXECUTABLES //LOCAL_MODULE_PATH := $(TARGET_OUT)/bin LOCAL_MODULE_TAGS := debug include $(BUILD_PREBUILT) 集成prebuild應(yīng)用程序apk 方法一:建立目錄結(jié)構(gòu),如: vendor/BM/APPs/MobileQQ2011/MobileQQ2011.apk vendor/BM/APPs/MobileQQ2011/Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed. LOCAL_MODULE := MobileQQ2011 LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX:= $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_SRC_FILES:= $(LOCAL_MODULE).apk LOCAL_CERTIFICATE := platform include $(BUILD_PREBUILT) 方法二:純粹拷貝apk文件 vendor/BM/APPs/MobileQQ2011.apk vendor/BM/APPs/Renren_Android_3.0.2.apk 通過android提供的PRODUCT_COPY_FILES這個(gè)變量來自動(dòng)拷貝,,只需要給此變量賦值,。 在任何一個(gè)確定加入編譯的mk文件中加入 PRODUCT_COPY_FILES+= /vendor/bm/APPS/MobileQQ2011.apk:system/app/MobileQQ2011.apk /vendor/bm/APPS/Renren_Android_3.0.2.apk:system/app/Renren_Android_3.0.2.apk 6. 參考文檔: http://blog.csdn.net/poolwater/article/details/10491061 |
|