本文转载自: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%B3

Android.bp 添加宏开关

平台: android 8.1 + mt6739

作者: 李强 日期: 2018-04-18

以前在android系统控制编译的Android.mk不是纯文本形式,里面还有流控制,而Android.bp是类似JSON的纯文本形式. 对于Android.mk里面流控制部分,在Android.bp里要借助使用go语言文件去进行控制.

这里的添加宏开关两种情况:

  • 无流控制的宏开关添加
  • 有流控制的宏开关添加

1.无流控制的宏开关添加Demo

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

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

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

例如要添加的宏:

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

将上面的宏补在原有的'cc_defaults'里面的'cppflags'后面:

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,使用方法:

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

Android.bp 添加宏开关【转】的更多相关文章

  1. C语言添加宏开关

    原文地址:http://blog.csdn.net/cp1300/article/details/7773239 我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是 ...

  2. 【定制Android系统】Android O 在ROM中添加自己的 so 库(1)——Android.mk 与 Android.bp 的区别【转】

    本文转载自: 版权声明:本文为博主原创文章,转载时请注明原作者及出处.    https://blog.csdn.net/u014248312/article/details/82020204需求:在 ...

  3. Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关

    一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...

  4. Android编译系统中的Android.bp【转】

    本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...

  5. Android.bp学习笔记

    1.Android.bp简介 Android 7.0之后希望用Android.bp替换Android.mk,bp简单的配置更方便Ninja 文件的产生,而Blueprint和Soong 就此产生.An ...

  6. Android按键添加和处理的方案

    Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个W ...

  7. Android按键添加和处理的方案【转】

    本文转载自:http://www.cnblogs.com/skywang12345/p/3142851.html Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Andro ...

  8. Android.mk添加本地程序和库的经常使用模版

    Android.mk添加本地程序和库的经常使用模版 Android中添加本地程序或者库.这些程序和库与其所在路径没有关系.仅仅与它们的配置文件Android.mk有关.Android.mk文件里可以主 ...

  9. Android编译系统中的Android.bp

    https://www.cnblogs.com/bluestorm/p/10895005.html Android.bp,是用来替换Android.mk的配置文件. 它使用Blueprint框架来解析 ...

随机推荐

  1. EF或LINQ 查询时使用IN并且根据列表自定义排序方法

    EF和LINQ改变了原有的手写SQL时期的一些编码方法,并且增强了各数据库之间的移植性简化了开发时的代码量和难度,由于很多人不熟,经常会碰到一些写SQL语句时经常会用到的一些方法,而使用EF或LINQ ...

  2. Docker下操作指令

    Docker下操作指令 以mysql为例 1.搜索镜像: #docker search mysql 2.拉取镜像 #docker pull mysql:5.7 3.加载镜像并绑定端口: #docker ...

  3. MYSQL导入数据时,出现错误:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1

    Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1 这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表 ...

  4. train_val.prototxt文件和deploy.prototxt文件开头的区别

    1.开头不同 对train_val.prototxt文件来说,开头部分定义训练和测试的网络及参数 对deploy.prototxt文件来说,开头部分定义实际运用场景的配置文件,其参数不定义数据来源,仅 ...

  5. maven 常用 Archetypes

    maven 常用 Archetypes Archetypes简介 什么是原型? 简而言之,Archetype是一个Maven项目模板工具包.原型被定义为原始模式或模型,从中创建所有其他相同类型的东西. ...

  6. python os.path.dirname()

    ----返回文件所在的路径 ----如果path变量直接是文件名则返回空

  7. RNN实例

    https://blog.csdn.net/jmh1996/article/details/78821216

  8. 设计模式之Facade(外观)(转)

    Facade的定义: 为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { Connec ...

  9. Git简明使用教程

    猴子都能懂的GIT入门 https://backlog.com/git-tutorial/cn/git - 简易指南(这份教程挺好的) http://www.bootcss.com/p/git-gui ...

  10. php 网站301重定向设置代码实战案例

    php 网站301重定向设置代码实战案例 301重定向就是页面永久性移走的意思,搜索引擎知道这个页面是301重定向的话,就会把旧的地址替换成重定向之后的地址. 302重定向就是页面暂时性转移,搜索引擎 ...