android程序设计感悟,Android Android.mk 文件一点感悟

//Rocky@20110312

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

    特此感谢小强同学的代码控制.doc。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值