1. 序言
在学习Android源码编译过程时,需要检查一些定义的变量值。 在读取makefile的代码时,需要通过判断条件去到那个分支。 关键是mk文件没有具体的IDE工具可以一步步调试,最简单原始最好的办法就是添加复制日志,然后在原来的工程下make,整理一下代码流程和根据复制信息进行逻辑。
2.调试方法2.1使用info
格式:$(这里的info写的是需要复制的日志信息)android 源码编译 makefile,下面是Android源码中的代码示例:
1.
$(info [1/1] initializing build system ...)
2.
ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)
$(info ***************************************************************)
$(info ***************************************************************)
$(info Do not pass '$(filter user userdebug eng,$(MAKECMDGOALS))' on
the make command line.)
$(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or)
$(info choosecombo.)
$(info ***************************************************************)
$(info ***************************************************************)
$(error stopping)
endif
其实你也可以在括号里添加你想要复制的变量,例如:
$(info Invalid variant: $(TARGET_BUILD_VARIANT))
$(info Valid values are: $(INTERNAL_VALID_VARIANTS))
2.2 使用警告
格式:$(警告这里写入需要复制的日志信息),下面是源码中的示例:
ifneq ($(dangling_modules),)
$(warning: Modules '$(dangling_modules)' in PRODUCT_PACKAGES have nothing to install!)
endif
warning:这里会在终端上输出你要复制的变量,但只会输出警告信息,编译仍然可以继续
如下,这是我在源码中自己添加的复制的一句:
2.3 使用错误
格式:$(error这里写需要复制的日志信息),下面是源码中的例子:
ifeq ($(TARGET_CPU_ABI),)
$(error No TARGET_CPU_ABI defined by board config: $(board_config_mk))
endif
这段代码表达的意思:如果TARGET_CPU_ABI为空,那么转到下面的代码,会提示:
NoTARGET_CPU_ABI由boardconfig定义:build/make/core/board_config.mk
也就是说TARGET_CPU_ABI必须在board_config.mk文件中定义
如果你使用错误调试,你的日志信息会被复制到终端上,然后编译会在这里停止
2.4 使用echo减少调试信息
如果要使用echo来复制android 源码编译 makefile,必须遵守makefile的语句规则,即必须在target之后,如下: