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"],