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系统源码定制和编译方法(Android7.0至...4.Android.mk或Android.bp编译生成Apk、静态库、动态库、可执行文件等的使用方法 5.Android系统定制有源码App或无源码App时关于Android.mk或Android.bp的使用方法
android 拷贝文件的mk脚本,bin,lib
自动生成android.mk文件,方便,快捷
全面介绍Android.mk文件语法规范
android.mk文件语法详述及简单实例
将android.mk转换为android.bp
opus NDK 编译 Android.mk文件 仅供参考
自己整理的一个android.mk文件的介绍,看了之后你就基本能自己写android.mk了 可能比较乱 但是很详细
一个Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统...你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。
Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 make 来组织各模块的编译,对应的编译 配置文件就是 Android.mk。在 Android...
一句一句翻译的NDK Android.mk帮助文档,帮助英语比我还差的哥们熟悉NDK的makefile的编写方法。个人觉得翻译的还算比较准确,因为基本上也都是测试过的,是根据实践参考文档翻译得来。可能是目前为止翻译的最通顺...
android studio 配置gradle 使用android.mk进行编译jni,简单的jni调用,使用android.mk进行编译,注意事项:app下的gradle,以及编译生成的 .h文件,复制修改为 .cpp时,里面的文件的宏逻辑,最好去掉这个宏(#...
关于Android平台Android.mk的说明及使用,MTK官方文档,解锁密码是6962843490
Android_makefile编译系统_Android.mk_文件语法规范 对Android.mk的讲解,共9页,值得一看。
从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解。了解了标准的Makefile后,发现Android.mk其实是把真正的Makefile包装起来,做成了一个对使用者来说很简单的东西。使用它来编译...
FFMPEG编译Android.mk文件
Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式: LOCAL_PATH:=$(call my-dir) 上面的语句的意思是将LOCAL_PATH变量...
Android ffmpeg的Android.mk和build.sh Android ffmpeg的Android.mk和build.sh
androidmk 转换Android.bp工具方法