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(安卓)代码实现logcat输出到文件
  2. android中build.gradle文件简单说明
  3. Android(安卓)pm命令详解
  4. android 使用系统照相程序照相并存储、显示在界面上
  5. Android(安卓)开发基础
  6. android 自定义时间控件
  7. 自定义ListView中的分割线
  8. Android中向服务器上传图片
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android(安卓)API开发之蓝牙开发之Androi
  2. 如何利用android ADK访问外围设备
  3. android:layout_gravity 和 android:grav
  4. 如何在Android和iOS设备上录制游戏?
  5. Android(安卓)内核剖析
  6. 想看看Android(安卓)L的效果,结果导致Ecli
  7. Android控件EditText之点击软键盘中的回
  8. android对html支持接口总结
  9. [置顶] Android中对Log日志文件的分析
  10. ANDROID音频系统散记之一:A2dpAudioInterf