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%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 addsanitize: {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_mgrimport ("android/soong/android""android/soong/cc""fmt"
)func init() {// for DEBUGfmt.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 []stringfmt.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 modulename: "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 endcc_defaults {name: "fs_mgr_defaults",defaults: ["BBB"],// new addsanitize: {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_VERITYif (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
11111111111if (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"],
参考:
- Android编译系统中的Android.bp、Blueprint与Soong
- Android 编译系统之Android.bp
转载于:https://www.cnblogs.com/zzb-Dream-90Time/p/10195062.html
Android.bp 添加宏开关【转】相关推荐
- Android.bp 添加宏开关
以前在android系统控制编译的Android.mk不是纯文本形式,里面还有流控制,而Android.bp是类似JSON的纯文本形式. 对于Android.mk里面流控制部分,在Android.bp ...
- android 编译宏,android 添加全局变量宏开关的三种方式
开发的时候,我们经常会有这样的一种需求: 在什么位置(如db)保存一个变量,可以跨应用的读写此值. system.prop 我们可以在system.prop中定义一个宏开关,可以很好的实现此目的. 此 ...
- Android 编译系统之Android.bp
从Android 7.0 (N)开始, Google开始逐步使用Android.bp代替原来的Android.mk进行编译. Google称之为soong, 具体可以参考: https://andro ...
- Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...
- 问题二十二:C++中怎么添加log开关
说这问题的原因有二. 其一,这两天在条程序时,如果在每条光线都会跑到的函数添加log,log的总量非常多(200*100的图片,每个像素点采样100次的话,一共就是1百万次采样,如果每次采样打一条lo ...
- android bp文件_Android 基础 | Android.bp 语法浅析
相关推荐: 随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多.Google 在 7.0 引入了 ninja 是 Google ...
- android bp文件_Android.bp学习笔记
1.Android.bp简介 Android 7.0之后希望用Android.bp替换Android.mk,bp简单的配置更方便Ninja 文件的产生,而Blueprint和Soong 就此产生.An ...
- android bp文件_Android编译系统中的Android.bp【转】
本文转载自: 转自:http://note.qidong.name/2017/08/android-blueprint/ Android编译系统中的Android.bp.Blueprint与Soong ...
- android.bp 编译,Android编译系统中的Android.bp
Android.bp,是用来替换Android.mk的配置文件. 它使用Blueprint框架来解析,最终转换成Ninja文件. 与Android.mk不同的是,Android.bp是纯粹的配置文件, ...
最新文章
- 如何用Python实现超级玛丽的人物行走和碰撞检测?
- ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)
- 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)
- 鸿蒙关键技术研究,华为鸿蒙 2.0 系统主题演讲公布,详细架构 9 月 11 日揭晓
- Python黑帽编程 3.4 跨越VLAN
- dell台式计算机恢复出厂设置,戴尔Win10电脑怎么恢复出厂设置?
- `OSError: file error: bad input file` in RDkit with .sdf file
- UITextView 首行缩进
- 如何使用Windows Identity Foundation(WTF)实现单点登录
- 欲望无限--《贝奥武夫》给我们的启示
- 传奇单机架设登录器配置教程
- 线上教育相关的微信公众号图文这样排版,阅读量翻十倍!
- Linux 系统注册系统服务流程
- IDempiere 富文本编辑器优化
- 高新技术企业认定申请通过后补贴
- linux虚拟机安装过程中卡在mount: block device /dev/sr0 is write-protected, mounting read-only
- 求第N个素数的值,时间复杂度尽量低
- 塞班S60三版系统中—MR,FP1,FP2区别
- 以firejail sandbox解析Docker核心原理依赖的四件套
- 【php基础入门】PHP中常用的数组操作使用方法笔记整理(推荐)