我们也说说Android.mk(2) - 函数进阶教程 - 分支、循环、子程序

简介: 按照面向过程程序设计的标准流程,我们讲完了顺序结构,就要讲分支、循环和子程序。下面我们就开始讲用于分支、循环和子程序调用功能的函数。

我们也说说Android.mk(2)

函数进阶教程 - 分支、循环、子程序

按照面向过程程序设计的标准流程,我们讲完了顺序结构,就要讲分支、循环和子程序。下面我们就开始讲用于分支、循环和子程序调用功能的函数。

分支函数

要走分支,一定是要有条件要判断。
在Makefile里,最主要的判断就是看字符串能不能找到了。
通过findstring函数来进行这个判断,然后用if函数使用findstring函数的结果。

例:

.PHONY : all5
bootoatfile := out/target/product/ali6753_65t_m0/dex_bootjars/system/framework/arm64/boot.oat
result_findString := $(findstring boot.oat,$(bootoatfile))
result_findString2 := $(findstring boot.oat,$(oatfile))
all5 :
    $(if $(result_findString), @echo found boot.oat, @echo cannot find boot.oat)
    $(if $(result_findString2), @echo found boot.oat, @echo cannot find boot.oat)

输出:
found boot.oat
cannot find boot.oat

循环函数

Makefile中对于循环结构的支持是foreach函数
语法格式为:$(foreach 变量,列表,对变量对操作)

这样的循环在Android.mk中遍地都是,比如对模块进行遍历,对产品进行遍历等。

我们看一个例子,这个例子写在build/core/main.mk中:

# A helper goal printing out install paths
.PHONY: GET-INSTALL-PATH
GET-INSTALL-PATH:
    @$(foreach m, $(ALL_MODULES), $(if $(ALL_MODULES.$(m).INSTALLED), \
        echo 'INSTALL-PATH: $(m) $(ALL_MODULES.$(m).INSTALLED)';))

再看一个更复杂一点的,加深一下印象:

# A static Java library needs to explicily set LOCAL_RESOURCE_DIR.
ifdef LOCAL_RESOURCE_DIR
need_compile_res := true
all_resources := $(strip \
    $(foreach dir, $(LOCAL_RESOURCE_DIR), \
      $(addprefix $(dir)/, \
        $(patsubst res/%,%, \
          $(call find-subdir-assets,$(dir)) \
        ) \
      ) \
    ))

子程序调用

makefile的子程序结构当然就是函数了。

定义函数很简单,就是定义一个变量就是了。参数可以用$(1),$(2)等等来表示
例:

isBootOat = $(findstring boot.oat,$(1))

调用的时候要注意,用call函数来调用,call和函数名之间是空格,之后的参数要用逗号分隔。

我们看个简单的例子,将前边讲过的findstring的功能封装成一个函数。
例:

.PHONY : all6
isBootOat = $(findstring boot.oat,$(1))
all6 :
    $(if $(call isBootOat,$(bootoatfile)), @echo found boot.oat, @echo cannot find boot.oat)
    $(if $(call isBootOat,$(oatfile)), @echo found boot.oat, @echo cannot find boot.oat)

输出:
$ make all6
found boot.oat
cannot find boot.oat

目录
相关文章
|
3月前
Android4.1.0实战教程---自动阅读小说
Android4.1.0实战教程---自动阅读小说
35 0
|
4月前
|
开发工具 Android开发 开发者
Android Studio详细下载,安装使用教程
Android Studio详细下载,安装使用教程
297 0
|
7月前
|
存储 网络协议 物联网
Android集成MQTT教程:实现高效通信和实时消息传输
Android集成MQTT教程:实现高效通信和实时消息传输
593 0
|
1月前
|
Shell 开发工具 Android开发
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
458 2
|
2月前
|
存储 SQL 数据库
安卓移动应用开发(安卓系统开发教程)
安卓移动应用开发(安卓系统开发教程)
48 1
|
8月前
|
Java Android开发
Android JNI开发从0到1,java调C,C调Java,保姆级教程详解
Android JNI开发从0到1,java调C,C调Java,保姆级教程详解
64 1