配套系列教学视频链接:
Android 10.0 AOSP源码编译:https://edu.csdn.net/course/detail/35479
Android 10.0 根文件系统和编译系统:https://edu.csdn.net/course/detail/35480?
说明
系统:AOSP Android10.0
设备:Android模拟器
前言
Android.mk中可以使用很多标志位和控制逻辑, 语法遵从Makefile,本章节介绍常见的一些用法。
一, gcc中用到的各种标志
LOCAL_C_INCLUDES := -DMYDBG=1
LOCAL_C_INCLUDES?+= -DHAVE_CONFIG_H
LOCAL_C_INCLUDES += -DLOG_TAG=\"my_tag\"
LOCAL_C_INCLUDES += -g -O2 -Wall ?\
?-Wno-unused-parameter \
-Wno-implicit-function-declaration \
-Wno-unused-function \
-Wno-unused-variable ?\
????????-Wno-incompatible-pointer-types-discards-qualifiers \
????????-Wno-format \
????????-Wno-error \
????????-Wno-date-time \
-W-no-xxx在编译的时候用会比较多, 在Android系统中,编译器要求比较严格, 比如变量定义但没使用, 类型从大转换成小, 都会报错,根据出错信息添加-W-no-xx基本可以解决这种问题。
二, Android.mk中完成shell 命令?
在mk文件中经常要会用到shell脚本, 如下例子:
LOCAL_POST_INSTALL_CMD := \
cp -ravf ?lib/*.so ?$(TARGET_OUT_VENDOR_SHARED_LIBRARIES);
?通过make或者mmm命令编译时,?LOCAL_POST_INSTALL_CMD这个变量赋值的内容, 将会自动按照shell命令执行
或者用如下用法:
current_tag := $(shell git -C $(LOCAL_PATH) describe --tags)
三,条件判断
NEED_APP := y
ifeq ($(NEED_APP), y)
????????xxx
else
????????yyy
endif
如判断当前Android版本:
ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \>= 27)))
? ? ? ? xxx
else
? ? ? ? yyy
endif
上面的意思是, 如果当前Android源码版本大于等于Android 8 (Android O,对应的API 级别是27)。 expr命令是用于数学计算的。?
四,?Android.mk中进行调试
$(warning ?"++PLATFORM_SDK_VERSION = $(PLATFORM_SDK_VERSION)")
$(info ?"++branch = $(current_branch)")
调试比较重要,类似我们在c代码中使用printf一样。
总结
以上只是我在开发中常用的, 后期如果有更多发现, 再补充进来
|