Как добавить условие в Android.bp
Я хочу различать код между Android Q и Android R, как мне этого добиться в Android.bp? В Android.mk я сделал что-то вроде этого
ifeq ($(PLATFORM_VERSION), R)
LOCAL_CFLAGS += -DANDROID_R_AOSP
else
LOCAL_CFLAGS += -DANDROID_Q_AOSP
Как сделать вышеуказанный код в Android.bp?
2 ответа
Следуйте инструкциям, приведенным здесь.
Замените эту деталь в my_defaults.go
:
if ctx.AConfig().Getenv("SOME_ENV_VAR") == "some_value" {
cflags = append(cflags, "-DCONDITIONAL")
}
С:
if ctx.AConfig().PlatformVersionName() == "R" {
cflags = append(cflags, "-DANDROID_R_AOSP")
} else {
cflags = append(cflags, "-DANDROID_Q_AOSP")
}
Ссылка: ссылка. В более старых версиях эта функция называласьPlatformVersion()
( ссылка), но для Android 9 или выше все будет в порядке.
ИДТИ
Вы можете написать сценарий go с вашими условиями. Следовать
Есть ли способ добавить/удалить модуль в Android.bp?
Что такое art.go? И почему это считается способом написания условных выражений в файлах bp?
Условная компиляция
Если вы просто хотите включить модуль условно, вы можете определить много модулей и включить их на основе условий в
Android.mk
файлы. https://android.googlesource.com/platform/build/soong/+/HEAD/docs/best_practices.md#removing-conditionals
скоро_config_modules
Вы столкнетесь с ошибками синтаксического анализа, если какой-либо из ваших файлов содержит библиотеки, не поддерживаемые вашим AOSP.
Чтобы исправить это, вы можете использовать . Обратите внимание, что это поддерживается только
Android 11 R
вперед.
Подробности приведены в https://android.googlesource.com/platform/build/soong/+/refs/heads/master/android/soong_config_modules.go.
Тем не менее, я приведу вам пример.
Здесь я включаю специальные библиотеки, когда AOSP — это Android 12. Поскольку эти библиотеки могут отсутствовать в более ранних версиях, я не буду включать
iot-camera-system.mk
в
PRODUCT_PACKAGES
поэтому оно не будет включено в качестве предустановленного приложения.
Чего конкретно я добьюсь с помощью
soong_config_modules
удаление ошибок парсинга при отсутствии этих библиотек (Android парсит все
Android.bp
файлы для формирования дерева синтаксического анализа, он также проверяет наличие их зависимостей и завершается сбоем сборки, если они отсутствуют).
iot-камера-system.mk
# CameraApp Android Application Package
ifeq ($(PLATFORM_VERSION), $(filter $(PLATFORM_VERSION),S 12))
PRODUCT_PACKAGES += CameraApp
SOONG_CONFIG_NAMESPACES += camera
SOONG_CONFIG_camera += camtargets
SOONG_CONFIG_camera_camtargets := newCameraTarget
else
SOONG_CONFIG_NAMESPACES += camera
SOONG_CONFIG_camera += camtargets
SOONG_CONFIG_camera_camtargets := oldCameraTarget
endif
Android.bp
// This introduces the module type camera_cc_defaults
// If target.mk file contained:
//
// SOONG_CONFIG_NAMESPACES += camera
// SOONG_CONFIG_camera += camtargets
// SOONG_CONFIG_camera_camtargets := newCameraTarget
//
// Then our libs would build with static_libs
soong_config_module_type {
name: "camera_cc_defaults",
module_type: "cc_defaults",
config_namespace: "camera",
variables: ["camtargets"],
properties: ["static_libs"],
}
soong_config_string_variable {
name: "camtargets",
values: ["oldCameraTarget", "newCameraTarget"],
}
camera_cc_defaults {
name: "camera_defaults",
soong_config_variables: {
camtargets: {
oldCameraTarget: {
static_libs: [
],
},
newCameraTarget: {
static_libs: [
"androidx.core_core-ktx",
"androidx.fragment_fragment-ktx",
"androidx.navigation_navigation-fragment-ktx",
"androidx.navigation_navigation-ui-ktx",
"androidx.lifecycle_lifecycle-runtime-ktx",
"kotlinx_coroutines",
"kotlinx_coroutines_android",
],
},
},
},
}
android_library {
name: "utils",
defaults: ["camera_defaults"],
manifest: "utils/src/main/AndroidManifest.xml",
platform_apis: true,
srcs: [
"utils/src/main/java/com/example/android/camera/utils/*.kt",
],
resource_dirs: [
"utils/src/main/res/",
],
static_libs: [
"androidx-constraintlayout_constraintlayout",
"androidx.appcompat_appcompat",
"androidx.localbroadcastmanager_localbroadcastmanager",
"com.google.android.material_material",
"androidx.exifinterface_exifinterface",
"androidx.core_core",
"androidx.preference_preference",
"androidx.fragment_fragment",
"androidx.recyclerview_recyclerview",
"androidx.lifecycle_lifecycle-runtime",
"androidx.lifecycle_lifecycle-extensions",
"kotlin-stdlib",
"kotlin-reflect",
"gson-prebuilt-jar",
],
optimize: {
enabled: false,
},
dex_preopt: {
enabled: false,
},
}
android_app {
name: "CameraApp",
defaults: ["camera_defaults"],
manifest: "app/src/main/AndroidManifest.xml",
privileged: true,
platform_apis: true,
certificate: "platform",
srcs: [
"app/src/main/java/com/example/android/camera2/video/*.kt",
"app/src/main/java/com/example/android/camera2/video/fragments/*.kt",
"app/src/main/java/com/example/android/camera2/video/overlay/*.kt",
],
resource_dirs: [
"app/src/main/res/",
],
static_libs: [
"androidx-constraintlayout_constraintlayout",
"androidx.appcompat_appcompat",
"androidx.localbroadcastmanager_localbroadcastmanager",
"com.google.android.material_material",
"androidx.exifinterface_exifinterface",
"androidx.core_core",
"androidx.preference_preference",
"androidx.fragment_fragment",
"androidx.recyclerview_recyclerview",
"androidx.lifecycle_lifecycle-runtime",
"androidx.lifecycle_lifecycle-extensions",
"kotlin-stdlib",
"kotlin-reflect",
"gson-prebuilt-jar",
"utils",
],
optimize: {
enabled: false,
},
dex_preopt: {
enabled: false,
},
}