配套系列教学视频链接:
Android 10.0 AOSP源码编译:
Android系统 10.0 AOSP源码编译--CSDN程序员研修院
Android 10.0 根文件系统和编译系统:
Android根文件系统和编译系统教学视频-百问100ask
Android 10.0 根文件系统和编译系统-CSDN程序员研修院
说明
系统: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一样。
总结
以上只是我在开发中常用的, 后期如果有更多发现, 再补充进来