Android.mk

(1)LOCAL_PATH:=$(call my-dir)

Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下Android.mk和需要编译的源文件在同一目录下,意思是将LOCAL_PATH变量定义成本文件所在目录路径,宏函数’my-dir’,由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

(2)include $(CLEAR_VARS)

Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。
CLEAR_VARS指的是clear_vars.mk,由编译系统提供,它会让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
include $(BUILD_STATIC_LIBRARY)-----------表示编译成静态库
include $(BUILD_SHARED_LIBRARY)---------表示编译成动态库。
include $(BUILD_EXECUTABLE)----------------表示编译成可执行程序
include $(BUILD_PACKAGE)---------------------表示编译成APK

(3)LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS := user eng tests optional;
user:指该模块只在user版本下才编译;
eng:指该模块只在eng版本下才编译;
tests:指该模块只在tests版本下才编译;
optional:指该模块在所有版本下都编译;
取值范围debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要预装,则应定义core.mk。

(4) LOCAL_SRC_FILES := $(call all-java-files-under, src)

1.$(call my-dir):获取当前文件夹路径;
  $(call all-java-files-under, ):获取指定目录下的所有Java文件;
  $(call all-c-files-under, ):获取指定目录下的所有C文件;
  $(call all-Iaidl-files-under, ) :获取指定目录下的所有AIDL文件;
  $(call all-makefiles-under, ):获取指定目录下的所有Make文件;
2.$(call all-subdir-java-files):这种形式来包含local_path目录下的所有java文件;
3.当涉及到C/C++时,LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件。注意,在这里你可以不用列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。all-java-files-under宏的定义是在build/core/definitions.mk中。

(5) LOCAL_PACKAGE_NAME := Settings

package的名字,这个名字在脚本中将标识这个app或package。

(6)ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_PACKAGE_NAME)

ALL_DEFAULT_INSTALLED_MODULES描述的就是要安装要目标设备上的模块文件,这些模块文件是在build/core/main.mk文件中设置好并且传递给build/core/Makefile文件使用的。

(7) LOCAL_CERTIFICATE := platform

LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platformkey签名的APK。

(8) LOCAL_DEX_PREOPT := false

用mm编译apk时,会在out目录下生成.apk和.odex两个文件,是为了加快运行速度,把dex分出来做的预处理。但是一般开发时需要mm编译出一个完整的apk,直接用adb进行安装就可以进行调试。在./build/core下有个package.mk文件,里面有一个选项,LOCAL_DEX_PREOPT为true则生成apk和odex两个文件,为false则只生成一个apk文件。

(9) include $(call all-makefiles-under,$(LOCAL_PATH))

加载当前目录下的所有makefile文件,all-makefiles-under会返回一个位于当前'my-dir'路径的子目录中的所有Android.mk的列表。all-makefiles-under宏的定义是在build/core/definitions.mk中。

(10) ifeq和ifdef

ifeq($(VALUE), x) 
  do_yes
else
  do_no
endif
ifeq/ifneq:根据判断条件执行相关编译
我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。 

ifdef <variable-name> 
    do_yes
else 
    do_no 
endif
ifdef/ifndef:根据判断条件执行相关编译
如果变量<variable-name>的值非空,那到表达式为真。否则,表达式为假。当然,<variable-name>同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。
上面用伪代码举例了ifeq和ifdef,还有ifneq和ifndef分别对应相反的情况。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值