Android.bp 添加宏開關【轉】

本文轉載自:https://github.com/zzb2760715357/document/blob/master/android_doc/Android.bp%E6%B7%BB%E5%8A%A0%E5%AE%8F%E5%BC%80%E5%85%B3.md#androidbp-%E6%B7%BB%E5%8A%A0%E5%AE%8F%E5%BC%80%E5%85%B3linux

Android.bp 添加宏開關

平臺: android 8.1 + mt6739android

做者: 李強 日期: 2018-04-18git

之前在android系統控制編譯的Android.mk不是純文本形式,裏面還有流控制,而Android.bp是相似JSON的純文本形式. 對於Android.mk裏面流控制部分,在Android.bp裏要藉助使用go語言文件去進行控制.github

這裏的添加宏開關兩種狀況:bootstrap

  • 無流控制的宏開關添加
  • 有流控制的宏開關添加

1.無流控制的宏開關添加Demo

1.1 在已有的Android.bp中添加宏

首先找要添加的Android.bp文件中是否有cppflags或者'cflags',基本上都是有的,例如:app

cc_defaults {
    name: "fs_mgr_defaults",
    defaults: ["BBB"],// new add
    sanitize: {
        misc_undefined: ["integer"],
    },
    local_include_dirs: ["include/"],
    cppflags: ["-Werror", "-DMTK_FSTAB_FLAGS"],
}

例如要添加的宏:ui

LOCAL_CFLAGS += -DTEST1
LOCAL_CFLAGS += -DTEST2=1

將上面的宏補在原有的'cc_defaults'裏面的'cppflags'後面:spa

cc_defaults {
    name: "fs_mgr_defaults",
    sanitize: {
        misc_undefined: ["integer"],
    },
    local_include_dirs: ["include/"],
    cppflags: ["-Werror",
               "-DMTK_FSTAB_FLAGS",
               "-DTEST1",
               "-DTEST2=1"],
}

1.2 androidmk命令

若是要轉化的Android.mk內容沒有流控制,可使用Androidmk命令直接轉換. 該命令在:out/soong/host/linux-x86/bin/androidmk,使用方法:.net

androidmk Android.mk > Android.bp

若是要轉換的Android.mk裏面沒有複雜結構,就能夠轉換成功,若是報錯就可能有複雜結構.須要手動轉換.調試

2. 有流控制的宏開關添加Demo

在Android.mk中添加的宏開關:

ifeq ($(ENABLE_USER2ENG),true)
LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY=1
LOCAL_CFLAGS += -DENABLE_USER2ENG=1
endif

若是要將以上的宏開關添加到Android.bp中去要經過使用go語言書寫一個新文件:

好比個人修改是在system/core/fs_mgr/Android.bp,那麼要在添加 system/core/fs_mgr/fs_mgr.go:

package fs_mgr

import (
        "android/soong/android"
        "android/soong/cc"
        "fmt"
)

func init() {
    // for DEBUG
    fmt.Println("init start")
    android.RegisterModuleType("AAA", fs_mgrDefaultsFactory)
}

func fs_mgrDefaultsFactory() (android.Module) {
    module := cc.DefaultsFactory()
    android.AddLoadHook(module, fs_mgrDefaults)
    return module
}

func fs_mgrDefaults(ctx android.LoadHookContext) {
    type props struct {
        Cflags []string
    }
    p := &props{}
    p.Cflags = globalDefaults(ctx)
    ctx.AppendProperties(p)
}

func globalDefaults(ctx android.BaseContext) ([]string) {
    var cppflags []string

    fmt.Println("ENABLE_USER2ENG:",
        ctx.AConfig().IsEnvTrue("ENABLE_USER2ENG"))
    if ctx.AConfig().IsEnvTrue("ENABLE_USER2ENG") {
          cppflags = append(cppflags,
                         "-DALLOW_ADBD_DISABLE_VERITY=1",
                         "-DENABLE_USER2ENG=1")
    }

    return cppflags
}

Android.bp須要修改的地方:

/// add start
bootstrap_go_package {
    // name and pkgPath need to  according to your module
    name: "soong-fs_mgr",
    pkgPath: "android/soong/fs_mgr",
    deps: [
        "blueprint",
        "blueprint-pathtools",
        "soong",
        "soong-android",
        "soong-cc",
        "soong-genrule",
    ],
    srcs: [
          // include new add .go file
          "fs_mgr.go",
    ],
    pluginFor: ["soong_build"],
}

// AAA is a module
AAA {
    name: "BBB",
}
/// add end

cc_defaults {
    name: "fs_mgr_defaults",
    defaults: ["BBB"],// new add
    sanitize: {
        misc_undefined: ["integer"],
    },
    local_include_dirs: ["include/"],
    cppflags: ["-Werror", "-DMTK_FSTAB_FLAGS"],
}

參照該例子修改時注意AAA,BBB的對應關係便可.

3. 一些相關的經驗

3.1

在go文件中使用fmt.Println添加打印信息,能夠調試go代碼有沒有按照正確的.使用方式參考上面的例子. 這些打印信息會在用mmm或者make命令編譯是打印在屏幕上.

3.2

若是添加了*.go文件,能夠在使用到宏的地方加入編譯會報錯的代碼,例如上面的例子:

#ifdef ALLOW_ADBD_DISABLE_VERITY
    if (verity.disabled) {
        retval = FS_MGR_SETUP_VERITY_DISABLED;
        LINFO << "Attempt to cleanly disable verity - only works in USERDEBUG";
        goto out;
    }
#endif

改成:

#ifdef ALLOW_ADBD_DISABLE_VERITY
11111111111
    if (verity.disabled) {
        retval = FS_MGR_SETUP_VERITY_DISABLED;
        LINFO << "Attempt to cleanly disable verity - only works in USERDEBUG";
        goto out;
    }
#endif

這樣就能夠很快的驗證本身添加的flag是否生效.

4. Android.bp的相關知識

該部份內容結合上面的例子,主要參考android/build/soong/README.md

4.1 註釋

有兩種形式:單行註釋//和多行註釋/* */

4.2 module

在上文的例子中:

AAA {
    name: "BBB",
}

AAA 必需要在go文件中註冊,name的值必需要是在全部Android.bp文件中是惟一的(建議按照所在的模塊取名字). 每一個module必需要有一個name.在module中的值都是用name: value的形式來,好比:

name: "libfstab",
    vendor_available: true,
    defaults: ["fs_mgr_defaults"],
    srcs: [
        "fs_mgr_fstab.cpp",
        "fs_mgr_boot_config.cpp",
        "fs_mgr_slotselect.cpp",
    ],
    export_include_dirs: ["include_fstab"],
    header_libs: ["libbase_headers"],

參考:

  1. Android編譯系統中的Android.bp、Blueprint與Soong
  2. Android 編譯系統之Android.bp
相關文章
相關標籤/搜索