本文转载自: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. Unity shader学习之屏幕后期处理效果之边缘检测

    边缘检测的原理是利用一些边缘检测算子对图像进行卷积操作. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7232707.html 例如: 代码如下: usin ...

  2. (1)打造简单OS-汇编写入引导区,虚拟机启动步骤

    首先需要您在网上下载NASM编译器,可以将汇编编译为二进制文件 1.写一段汇编代码在屏幕上打印一段字符,可以运行的!并进行nasm为二进制文件,如下"test.asm" 该段汇编主 ...

  3. Attention Is All You Need 一些好的资料

    The encoders are all identical in structure (yet they do not share weights). Each one is broken down ...

  4. 【2017-04-20】Sql字符串注入式攻击与防御,实体类,数据访问类

    字符串攻击 所谓sql字符串注入式攻击就是在用户输入界面输入通过精心编制的含有某种指令的字符串,来改变C#中连接数据库要执行的sql语句,从而对数据库进行攻击性操作 在用户输入界面输入  a');up ...

  5. 【2017-03-20】HTML基础知识,标记,表格,表格嵌套及布局,超链接

    一.HTML  网站(站点),网页基础知识 HTML是一门编程语言的名字:超文本标记语言 可以理解为:超越了文本的范畴,可以有图片.视频.音频.动画特效等其他内容,用标记的方法进行编程的计算机语言 基 ...

  6. SLAM学习笔记 - 世界坐标系到相机坐标系的变换

    参考自: http://blog.csdn.net/yangdashi888/article/details/51356385 http://blog.csdn.net/li_007/article/ ...

  7. 为什么我们要使用HTTP Strict Transport Security?

    http://www.freebuf.com/articles/web/66827.html

  8. HashMap集合存储自定义类

    第一种情况,key为String,value为自定义类person类: 输出结果,key重复的被去掉了,key重复的那个value值之前的被最后一个覆盖了: 第二种情况,key为自定义类person类 ...

  9. python迭代器以及生成器

    迭代器iter():节省内存 Iter()迭代器 每一次输出下一个值 >>> a=iter(range(10)) >>> a.next() 0 >>&g ...

  10. 三角形垂点坐标js算法(三点定圆求圆心)

    已知平面三点坐标A(x1, y1).B(x2, y2).C(x3, y3),三点定圆也就是三角形的中垂线交点, //平面三点定位算法 function locate(x1, y1, x2, y2, x ...