Android.mk 语法
1.Build Layers
Build Layers描述的是产品的硬件配置情况,据此make时选择不同的配置和模块。按照从上到下的顺序,Build Layer分成4层。
Layer sample Note
Arch arm, x86 处理器的种类
Board - 板子类型的代号
Device - device配置的类型代号
Product - 具体产品的代号
2.重要的Makefile脚本
Android.mk:编译源码mk文件,每个module和package目录下有这么一个文件
main.mk:定义了编译全部代码的依赖关系
config.mk:用于配置编译系统,决定如何编译
envsetup.mk:定义了编译环境配置
product_config.mk:读取AndrodProducts.mk生成TARGET_DEVICE变量
AndroidProducts.mk:定义某厂商所有产品文件列表
BoardConfig.mk:定义开发板软件相关配置项,将来影响系统条件 编译。
3.Android.mk 文件解析:
https://www.cnblogs.com/gamesky/p/11369156.html\
3.1.变量分析:
A.LOCAL_PATH,调用my-dir(在defination.mk中定义),得到当前路径
B.LOCAL_MODULE_TAGS,取值范围
C.LOCAL_SRC_FILES,app的所有源码,可以调用all-java-files-under得到,如果是java源码的话。
D.LOCAL_PACKAGE_NAME,package的名字,这个名字在脚本中将标识这个app或package。
E.$(CLEAR_VARS)指的是clear_vars.mk,脚本会清空所有LOCAL_xxx的变量,不影响后面这些变量的使用。
F.$(BUILD_PACKAGE) 指的是package.mk生成规则
G.all-makefiles-under 包含当前目录下所有的mk脚本文件。
3.2.源码示例:
- 编译多文件并生成可执行文件
LOCAL_PATH:=$(call my-dir) //获取程序当前路径
#include $(CLEAR_VARS) //清除环境变量
#LOCAL_MODULE:=test //生成模块名字
#LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin //指定生成的可执行文件路径
//两种方法定义搜索源文件路径
//指定源文件当前路径后边所有的子路径
#LOCAL_SRC_FILES:=./src/test.c ./src/add.c
#LOCAL_SRC_FILES:=$(call all-c-files-under,src)
#include $(BUILD_EXECUTABLE)
- 制作动态库
include $(CLEAR_VARS)
LOCAL_MODULE:=libadd
LOCAL_SRC_FILES:=./src/add.c
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/lib //生成指定生成的库文件路径
include $(BUILD_SHARED_LIBRARY)
- 生成静态库 静态库路径不用指定,默认存放于out目录下。
include $(CLEAR_VARS)
LOCAL_MODULE:=libadd
LOCAL_SRC_FILES:=./src/add.c
#LOCAL_MODULE_PATH:=$(LOCAL_PATH)/lib
include $(BUILD_STATIC_LIBRARY)
//指定第三方库文件的宏LOCAL_LDFLAGS
include $(CLEAR_VARS)
LOCAL_MODULE:=test
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin //将生成的可执行文件存放位置
LOCAL_SRC_FILES:=./src/test.c
//两种调用库文件方法
#LOCAL_LDFLAGS:=-L $(LOCAL_PATH)/lib -ladd //调用动态库文件法1
LOCAL_LDFLAGS:=$(LOCAL_PATH)/lib/libadd.so //调用动态库文件法2
//生成可执行程序文件
include $(BUILD_EXECUTABLE)
//库文件找不到的时候
export LD_LIBRARY_PATH-. 导入环境变量
- 调用系统库文件
include $(CLEAR_VARS)
LOCAL_MODULE:=mylog
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
LOCAL_SRC_FILES:=./src/mylog.c
LOCAL_SHARED_LIBRARIES:=liblog //无需路径,只需库名字即可
#LOCAL_STATIC_LIBRARIES //静态库
include $(BUILD_EXECUTABLE)