Android makefile文件调试方法

来源:互联网 发布:淘宝店铺装修大学教程 编辑:程序博客网 时间:2024/06/09 19:56

最近有一个Bug问题,本以为解起来分分钟就可以搞定,却耽误了大半天。借这个机会,记录一下自己的学习心得。这里先来描述一下应用场景。

1.应用场景

ISP同事在调试af时需要将af一些配置文件(xml文件)读取到out目录下,但是有的工程在开发时是没有af功能的,所以就不许要添加这些配置文件。为了统一性,以及避免每个工程都要在拷贝环境变量中添加af的配置文件,所以在每个工程配置文件里面都统一添加了如下判断语句,这样我们只需要在BoardConfig.mk中配置对应宏就可以了,而不需要在每个工程下面,手动添加对应的文件了。目前使用代码如下:

CAMERA_AF_DEV_NOT_SUPPORT2 := $(shell grep AF_DEV_NOT_SUPPORT $(BOARDDIR)/BoardConfig.mk)ifeq ($(strip $(word 3,$(CAMERA_AF_DEV_NOT_SUPPORT2)),false)PRODUCT_COPY_FILES = \       frameworks/native/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \       frameworks/native/data/etc/android.hardware.camera.flash.xml:system/etc/permissions/android.hardware.camera.flash.xmlendif

2.调试过程

上面的AF_DEV_NOT_SUPPORT是在BoardConfig.mk中定义的,一开始我直接引用这个宏,但是编译整个android代码后发现根本就没有将上面添加的android.hardware.camera.xml等2文件拷贝到对应的system/etc/permissions目录下,所以就有了下面的调试过程。下面可以看到Boardconfig.mk中我定义的一个宏。

//BoardConfig.mk................AF_DEV_NOT_SUPPORT := false............
但是在project.mk中当中直接引用AF_DEV_NOT_SUPPORT时,我们得到的其实就是空值其实调试时这里是可以添加调试代码的,我们不可以直接引用这个变量(具体原因应该是Boardconfig.mk的添加生效时间应该在project.mk之后,导致读取到的是空值),我们可以直接在对应的文件中搜索这个环境变量,如下

$(warning $(AF_DEV_NOT_SUPPORT))CAMERA_AF_DEV_NOT_SUPPORT2 := $(shell grep AF_DEV_NOT_SUPPORT $(BOARDDIR)/BoardConfig.mk)$(error $(CAMERA_AF_DEV_NOT_SUPPORT2))

注意这里有两个makefile打印函数

 (1) warning:这里会在终端输出我们要打印的变量,只是输出一个警告信息,但是编译仍然可以继续

 (2) error :这里同样会在终端中打印对应变量,但是编译走到这里就会终止

上面添加之后就有输出结果:

device/google/project/project1/project1.mk:111: device/google/project/project1/project1.mk:113: : *** AF_DEV_NOT_SUPPORT := false.  Stop.
上面就可以看到我们已经获取到我们在BoardConfig.mk中定义的配置宏了,剩下的就是提取最后那个false关键字了。
其实makefile中已经在为我们准备一个函数word,word(n,str):其中的n就是我们要提取单次的序号(1开始),str就是我们要筛选的字符串组合
例如:$(word 3,$(CAMERA_AF_DEV_NOT_SUPPORT2))就可以得到最后的false。
最终调试代码:

test_name := armwind$(warning $(AF_DEV_NOT_SUPPORT))CAMERA_AF_DEV_NOT_SUPPORT2 := $(shell grep AF_DEV_NOT_SUPPORT $(BOARDDIR)/BoardConfig.mk)$(warning $(word 3,$(CAMERA_AF_DEV_NOT_SUPPORT2)))ifeq ($(strip $(word 3,$(CAMERA_AF_DEV_NOT_SUPPORT2)),false)PRODUCT_COPY_FILES = \       frameworks/native/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \       frameworks/native/data/etc/android.hardware.camera.flash.xml:system/etc/permissions/android.hardware.camera.flash.xml$(warning $(test_name))$(error $(PRODUCT_COPY_FILES))endif
(注意的地方:PRODUCT_COPY_FILES 后面的反斜杠千万不要忘记了,要不然会报*** commands commence before first target.  Stop.一定要注意啊)
结果:

    上面的打印结果可以看到,都是按着我们想的那样进行的大家在调试makefile时,记得会用warning和error 标准函数就行了。至于其它makefile怎么写,其实android系统里有很多代码可以参考的。

0 0
原创粉丝点击