0%

Android bp 编译相关

1. 编译相关

1.1. bp makefile通用规则

编译规则:

  • bp 可以引用bp定义的module
  • bp不能引用mk定义的module
  • mk可以引用mk和bp定义的module

传统的写法下, bp中不能引用外部的make定义的变量

可以借助原生文件的写法, 在soong_config.mk中引用mk文件
build/core/soong_config.mk
–include miui/build/soong/import_miui_soong_vars.mk

在mk文件中可以加bp规则的hook

1
2
3
4
ifeq (true,$(ENABLE_MIUI_DEBUGGING))
_adb_local_cflags := -UALLOW_ADBD_ROOT -DALLOW_ADBD_ROOT=1 -DALLOW_ADBD_DISABLE_VERITY -DALLOW_ADBD_NO_AUTH
$(call add_additional_soong_var, adbd_defaults, cflags, $(_adb_local_cflags))
endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cc_defaults {
name: "adbd_defaults",
defaults: ["adb_defaults"],

cflags: ["-UADB_HOST", "-DADB_HOST=0"],
...
}

cc_library {
name: "libadbd",
defaults: ["adbd_defaults", "host_adbd_supported"],
recovery_available: true,
...
}

参照上述写法, 可以在bp中引用外部的mk变量

bp中的required规则可以无视上述规则. 即bp可以required mk定义的module

1.2. recovery bp相关编译规则

在androidq上新增了recovery_availablerecovery变量
定义了recovery_available后, 如果目标需要被recovery引用(主系统也需要用), 需要添加 recovery_available:true
如果目标只是给recovery用的可以添加recovery:true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cc_library {
name: "libadbd",
defaults: ["adbd_defaults", "host_adbd_supported"],
recovery_available: true,
...
}

cc_binary {
name: "fastbootd",
defaults: ["fastboot_defaults"],

recovery: true,
...
shared_libs: [
...
"libadbd",
"libasyncio",
],
}

定义recovery_available的module可以直接被引用, 如编译fastbootd时, 指定shared_libs可以直接引用libadbd
如果不能直接引用的, 如required规则, 则需要添加.recovery后缀, 而定义了recovery的module则不需要添加.recovery后缀

binary不能被直接引用, 可以被required规则引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cc_binary {
name: "recovery",
recovery: true,
...
required: [
...
"mke2fs.recovery",
"recovery_deps",
],
}

cc_binary {
name: "mke2fs",
host_supported: true,
recovery_available: true,
defaults: ["e2fsprogs-defaults"],
...
}

或者可以被PRODUCT_PACKAGES引用

1
2
3
4
5
6
PRODUCT_PACKAGES += \
adbd.recovery \
android.hardware.health@2.0-impl-default.recovery \
cgroups.recovery.json \
charger.recovery \
init_second_stage.recovery \

PRODUCT_PACKAGES 引用后, 在生成recoveryimage时会拷贝对应的module放到对应位置的module path下