Как добавить условие в 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,
  },
}
Другие вопросы по тегам