1、Android Android.mk 文件一点感悟Android.mk文件时android 中的一个非常重要的概念。我们有以下几个方便的时候需要使用它。1:添加新的 apk源码文件编译。这里我们先参考下AlarmClock的Android.mk文件LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := AlarmClockinclude $(BUILD_PACKAGE)简单的解释下:第一行,赋予LOCAL_PATH一
2、个新的值,表示当前的路径。第二行,清楚所有的系统自带的标准变量值。我 们通过查找CLEAR_VARS变量定义,可以发现它实际上代表的是sourcebuildcoreconfig.mk中有定义如下:CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk所以查看clear_vars.mk文件可以得到知道:# Clear out values of all variables used by rule templates.#LOCAL_MODULE:=LOCAL_MODULE_PATH:=LOCAL_MODULE_STEM:=LOCAL_DONT_CHECK_MODUL
3、E:=LOCAL_CHECKED_MODULE:=LOCAL_BUILT_MODULE:=LOCAL_BUILT_MODULE_STEM:=OVERRIDE_BUILT_MODULE_PATH:=它把这些变量都清空了。注意它这里没有去清空LOCAL_PATH变量。所以这个步骤放在第二行,是没有关系的。它的这个写法有点误导人哈。第三、四行,给变量赋予新值。这里赋予的是LOCAL_SRC_FILES,LOCAL_PACKAGE_NAME第五行,执行BUILD_PACKAGE。它的定 义也是在 config.mk中定义如下:BUILD_PACKAGE:= $(BUILD_SYSTEM)/packag
4、e.mk,更多更加具体的,自己去看看吧。这里其实有很多的,# # Build system internal files# #BUILD_COMBOS:= $(BUILD_SYSTEM)/comboCLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:= $(BU
5、ILD_SYSTEM)/static_library.mkBUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mkBUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mkBUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mkBUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_e
6、xecutable.mkBUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mkBUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYST
7、EM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mkBUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mkBUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mkBUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk基本上你有用到的就已经提前给你设计好了。你要做的很简单了。这里的思想其实和makefile的是一样的。目标:信赖文件执行命令
8、只是Android在这里进行了高度的封装和简化。前面四行相当于设置目标文件。最后一行相当于执行命令。所以,如果我们要添加自己的apk, 就按照这种思想添加就可以了。2:变量的使用makefile文件有一个基础的东西就是变量。大家可以自己了解下。这里我们说说Android.mk这个变量的不同的地方。主要是用它来做代 码管理。这个部分是我同事小强总结出来的,我就cp过来。替它总结下。首先在执行make文件的时候这些变量是全局有效的,一些公共的变量会通过include $(CLEAR_VARS)给清除掉。我们这里主要是添加自己的 变量。我们在使用自己定义变量的时候有两种情况,一种是在mk中使用,一种
9、是在 cpp中使用。注意java不支持的。这两种情况有点不同,请注意。首先我们得定义这个变量,一般来讲都是在产品的BoardConfig.mk中定义,例如:TARGET_MEMORY_STYLE := TARGET_MEM_256MB#TARGET_MEMORY_STYLE := TARGET_MEM_256MB_ST#TARGET_MEMORY_STYLE := TARGET_MEM_512MB#TARGET_MEMORY_STYLE := TARGET_MEM_512MB_ST# board-specific configurationBOARD_OPENCORE_FLAGS := -DT
10、ELECHIPS_ALSAifeq ($(BOARD_KERNEL_BASE),0x40000000)BOARD_MEM_FLAGS := -DTCC_MEM_256MBelseBOARD_MEM_FLAGS := -DTCC_MEM_512MBendif这里总共有两个我们经常用的东西。第一:如果是mk总使用,定义如前四行就可以了。变量 := 字符串在mk中的使用方法就像后面例子一样。ifeq($(变量),对比值)elseendif第二:如果你想在cpp中使用, 请定义方式如下变量 := -D+变量名如后面几行示例一样的。如果想在cpp中应用,首先必 须在cpp对于的mk文件中,声明如下LOCAL_CFLAGS += $(BOARD_MEM_FLAGS)格式: LOCAL_CFLAGS += $(变量)然后它的cpp中就可以引用如下:此时去掉了-D前缀。ifdef TCC_MEM_512MBendif