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 := AlarmClock
include $(BUILD_PACKAGE)

简单的解释下:
第一行,赋予LOCAL_PATH一个新的值,表示当前的路径。
第二行,清楚所有的系统自带的标准变量值。我们通过查找CLEAR_VARS变量定义,可以发现它实际上代表的是
source\build\core\config.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_MODULE:=
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)/package.mk,更多更加具体的,自己去看看吧。

这里其实有很多的,
# ###############################################################
# Build system internal files
# ###############################################################

BUILD_COMBOS:= $(BUILD_SYSTEM)/combo

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk

基本上你有用到的就已经提前给你设计好了。你要做的很简单了。

这里的思想其实和makefile的是一样的。

目标:信赖文件
执行命令

只是Android在这里进行了高度的封装和简化。
前面四行相当于设置目标文件。
最后一行相当于执行命令。

所以,如果我们要添加自己的apk,就按照这种思想添加就可以了。

2:变量的使用
makefile文件有一个基础的东西就是变量。大家可以自己了解下。这里我们说说Android.mk这个变量的不同的地方。主要是用它来做代码管理。这个部分是我同事小强总结出来的,我就cp过来。
替它总结下。

首先在执行make文件的时候这些变量是全局有效的,一些公共的变量会通过include $(CLEAR_VARS)给清除掉。我们这里主要是添加自己的变量。
我们在使用自己定义变量的时候有两种情况,一种是在mk中使用,一种是在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 configuration
BOARD_OPENCORE_FLAGS := -DTELECHIPS_ALSA

ifeq ($(BOARD_KERNEL_BASE),0x40000000)
BOARD_MEM_FLAGS := -DTCC_MEM_256MB
else
BOARD_MEM_FLAGS := -DTCC_MEM_512MB
endif

这里总共有两个我们经常用的东西。

第一:
如果是mk总使用,定义如前四行就可以了。
变量 := 字符串

在mk中的使用方法就像后面例子一样。
ifeq($(变量),对比值)

else

endif

第二:如果你想在cpp中使用,请定义方式如下

变量 := -D+变量名
如后面几行示例一样的。
如果想在cpp中应用,首先必须在cpp对于的mk文件中,声明如下
LOCAL_CFLAGS += $(BOARD_MEM_FLAGS)

格式:
LOCAL_CFLAGS += $(变量)

然后它的cpp中就可以引用如下:
此时去掉了-D前缀。

ifdef TCC_MEM_512MB
......
endif

更多相关文章

  1. android中build.gradle文件简单说明
  2. Android 代码实现logcat输出到文件
  3. android 文件上传

随机推荐

  1. Android TextView中链接(link)点击事件的
  2. Android 动画旋转效果
  3. Android(安卓)UI开发第三十九篇——Tab界
  4. android 拖动条改变屏幕亮度
  5. Android复制手机号码到剪切板并调起打电
  6. 在Android中自定义IOS风格的按钮
  7. Android AAC框架从入门到精通
  8. android之蓝牙设备的使用01
  9. android 4.0.3 设置时间无法更新到RTC
  10. android:maxLines="1"截取显示不全,用andr