前言

最近在看AndroidVold层代码,也就是C++C语言,如果添加新的功能或方法,为了不影响原有的代码,会考虑通过宏定义进行添加,这样可以快速回退到原有的代码中。

今天简单记录一下使用宏定义。

正文

我们以vold的代码举例。

system/vold

使用宏定义

下面是PublicVolume.cpp一个方法

status_t PublicVolume::readMetadata() {
    status_t res = ReadMetadataUntrusted(mDevPath, &mFsType, &mFsUuid, &mFsLabel);
    auto listener = getListener();
    if (listener) listener->onVolumeMetadataChanged(getId(), mFsType, mFsUuid, mFsLabel);
    return res;
}

加入我要新增ReadMetadataUntrusted传入的参数,一般情况下直接修改方法的参数个数,但是为了不影响原有的代码,比较好的做法是重新定义一个方法,然后通过宏定义条件判断调用新增的。

使用宏定义判断,可以通过配置快速还原代码。

#ifdef VOLD_BIUMALL
    status_t res = ReadMetadataUntrusted(mDevPath, &mFsType, &mFsUuid, &mFsLabel,&biumall);
#else
    status_t res = ReadMetadataUntrusted(mDevPath, &mFsType, &mFsUuid, &mFsLabel);
#endif

上面方法表示,如果定义了VOLD_BIUMALL,就走其ifdef包含的语句,否则走默认的else语句。

定义宏定义

现在的疑问,我们一般去哪里定义VOLD_BIUMALL呢?

方式1

第一个方式以vold中的Android.bp为例

cc_defaults {
    name: "vold_default_flags",
    cflags: [
        "-Wall",
        "-Werror",
        "-Wextra",
        "-Wno-unused-parameter",
        "-DVOLD_BIUMALL",  //新增
    ],
    tidy: true,
    tidy_checks: [
        "-*",
        "cert-*",
        "clang-analyzer-security*",
        "android-*",
    ],
    tidy_flags: [
        "-warnings-as-errors=clang-analyzer-security*,cert-*",
    ],
}

也就是在cc_defaults的cflags中新增了

-DVOLD_BIUMALL

方式2

当然上面是在Android.bp中,这里也记录一下其他的方式。

  1. 命令行中

    gcc -DVOLD_BIUMALL myfile.c

  2. Makefile中定义

    CFLAGS = -DVOLD_BIUMALL

  3. CMake中定义

    add_definitions(-DVOLD_BIUMALL)
    # 或者针对特定目标
    target_compile_definitions(your_target PRIVATE DVOLD_BIUMALL=1)

参考文章

  1. Android源码

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...