aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-16 19:00:43 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-16 19:00:43 +0000
commitde553e8e97980a871cb27d071d2021d765bb1221 (patch)
tree4a50f5ce3aad8e651b6aef8fbdd8934a4093f8da
parent80b6f770faae10a5de9178d66cfde5f93d11d88f (diff)
parentf52cc6b3b76070a4a813dfabf7b46ad5ec3eca37 (diff)
downloadcommon-de553e8e97980a871cb27d071d2021d765bb1221.tar.gz
Snap for 8735767 from f52cc6b3b76070a4a813dfabf7b46ad5ec3eca37 to mainline-go-appsearch-release
Change-Id: I41ed38a4ceb915010ed3512cba3139301d98ff72
-rw-r--r--build/allowed_deps.txt3
-rwxr-xr-xbuild/mainline_modules_sdks.py101
-rw-r--r--build/mainline_modules_sdks_test.py30
-rw-r--r--build/mainline_modules_sdks_test_data/wifi_Android.bp.expected168
-rw-r--r--build/mainline_modules_sdks_test_data/wifi_Android.bp.input108
5 files changed, 397 insertions, 13 deletions
diff --git a/build/allowed_deps.txt b/build/allowed_deps.txt
index 6d3e8896..57afbb6a 100644
--- a/build/allowed_deps.txt
+++ b/build/allowed_deps.txt
@@ -747,6 +747,8 @@ netd-client(minSdkVersion:29)
netd_aidl_interface-java(minSdkVersion:29)
netd_aidl_interface-lateststable-java(minSdkVersion:29)
netd_aidl_interface-lateststable-ndk(minSdkVersion:29)
+netd_aidl_interface-V10-java(minSdkVersion:29)
+netd_aidl_interface-V10-ndk(minSdkVersion:29)
netd_aidl_interface-V3-java(minSdkVersion:29)
netd_aidl_interface-V5-java(minSdkVersion:29)
netd_aidl_interface-V6-java(minSdkVersion:29)
@@ -759,6 +761,7 @@ netd_event_listener_interface-ndk_platform(minSdkVersion:29)
netd_event_listener_interface-V1-java(minSdkVersion:29)
netd_event_listener_interface-V1-ndk(minSdkVersion:29)
netd_event_listener_interface-V1-ndk_platform(minSdkVersion:29)
+netd_mainline_headers(minSdkVersion:29)
netlink-client(minSdkVersion:29)
networkstack-aidl-interfaces-V10-java(minSdkVersion:29)
networkstack-aidl-interfaces-V11-java(minSdkVersion:29)
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py
index d3b4993f..2f4daa6f 100755
--- a/build/mainline_modules_sdks.py
+++ b/build/mainline_modules_sdks.py
@@ -20,6 +20,7 @@ the APEXes in it are built, otherwise all configured SDKs are built.
"""
import argparse
import dataclasses
+import functools
import io
import os
import re
@@ -161,25 +162,29 @@ class SoongConfigBoilerplateInserter(FileTransformation):
}},
}},""")
+ # Add the module type to the list of module types that need to
+ # have corresponding config module types.
+ config_module_types.add(module_type)
+
# Change the module type to the corresponding soong config
# module type by adding the prefix.
module_type = self.configModuleTypePrefix + module_type
- # Add the module type to the list of module types that need to
- # be imported into the bp file.
- config_module_types.add(module_type)
# Generate the module, possibly with the new module type and
- # containing the
+ # containing the soong config variables entry.
content_lines.append(module_type + " {")
content_lines.extend(module_content)
content_lines.append("}")
- # Add the soong_config_module_type_import module definition that imports
- # the soong config module types into this bp file to the header lines so
- # that they appear before any uses.
- module_types = "\n".join(
- [f' "{mt}",' for mt in sorted(config_module_types)])
- header_lines.append(f"""
+ if self.configBpDefFile:
+ # Add the soong_config_module_type_import module definition that
+ # imports the soong config module types into this bp file to the
+ # header lines so that they appear before any uses.
+ module_types = "\n".join([
+ f' "{self.configModuleTypePrefix}{mt}",'
+ for mt in sorted(config_module_types)
+ ])
+ header_lines.append(f"""
// Soong config variable stanza added by {producer.script}.
soong_config_module_type_import {{
from: "{self.configBpDefFile}",
@@ -188,6 +193,24 @@ soong_config_module_type_import {{
],
}}
""")
+ else:
+ # Add the soong_config_module_type module definitions to the header
+ # lines so that they appear before any uses.
+ header_lines.append("")
+ for module_type in sorted(config_module_types):
+ # Create the corresponding soong config module type name by
+ # adding the prefix.
+ config_module_type = self.configModuleTypePrefix + module_type
+ header_lines.append(f"""
+// Soong config variable module type added by {producer.script}.
+soong_config_module_type {{
+ name: "{config_module_type}",
+ module_type: "{module_type}",
+ config_namespace: "{self.configVar.namespace}",
+ bool_variables: ["{self.configVar.name}"],
+ properties: ["prefer"],
+}}
+""".lstrip())
# Overwrite the file with the updated contents.
file.seek(0)
@@ -396,6 +419,7 @@ ALL_BUILD_RELEASES = []
@dataclasses.dataclass(frozen=True)
+@functools.total_ordering
class BuildRelease:
"""Represents a build release"""
@@ -453,6 +477,9 @@ class BuildRelease:
"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": self.name,
})
+ def __eq__(self, other):
+ return self.ordinal == other.ordinal
+
def __le__(self, other):
return self.ordinal <= other.ordinal
@@ -628,6 +655,30 @@ class MainlineModule:
for_r_build: typing.Optional[ForRBuild] = None
+ # The last release on which this module was optional.
+ #
+ # Some modules are optional when they are first released, usually because
+ # some vendors of Android devices have their own customizations of the
+ # module that they would like to preserve and which cannot yet be achieved
+ # through the existing APIs. Once those issues have been resolved then they
+ # will become mandatory.
+ #
+ # This field records the last build release in which they are optional. It
+ # defaults to None which indicates that the module was never optional.
+ last_optional_release: typing.Optional[BuildRelease] = None
+
+ # The short name for the module.
+ #
+ # Defaults to the last part of the apex name.
+ short_name: str = ""
+
+ def __post_init__(self):
+ # If short_name is not set then set it to the last component of the apex
+ # name.
+ if not self.short_name:
+ short_name = self.apex.rsplit(".", 1)[-1]
+ object.__setattr__(self, "short_name", short_name)
+
def is_bundled(self):
"""Returns true for bundled modules. See BundledMainlineModule."""
return False
@@ -636,11 +687,29 @@ class MainlineModule:
"""Returns the transformations to apply to this module's snapshot(s)."""
transformations = []
if build_release.supports_soong_config_boilerplate:
+
+ config_var = self.configVar
+ config_module_type_prefix = self.configModuleTypePrefix
+ config_bp_def_file = self.configBpDefFile
+
+ # If the module is optional then it needs its own Soong config
+ # variable to allow it to be managed separately from other modules.
+ if (self.last_optional_release and
+ self.last_optional_release > build_release):
+ config_var = ConfigVar(
+ namespace=f"{self.short_name}_module",
+ name="source_build",
+ )
+ config_module_type_prefix = f"{self.short_name}_prebuilt_"
+ # Optional modules don't have their own config_bp_def_file so
+ # they have to generate the soong_config_module_types inline.
+ config_bp_def_file = ""
+
inserter = SoongConfigBoilerplateInserter(
"Android.bp",
- configVar=self.configVar,
- configModuleTypePrefix=self.configModuleTypePrefix,
- configBpDefFile=self.configBpDefFile)
+ configVar=config_var,
+ configModuleTypePrefix=config_module_type_prefix,
+ configBpDefFile=config_bp_def_file)
transformations.append(inserter)
return transformations
@@ -702,6 +771,8 @@ MAINLINE_MODULES = [
apex="com.android.bluetooth",
sdks=["bluetooth-module-sdk"],
first_release=Tiramisu,
+ # Bluetooth has always been and is still optional.
+ last_optional_release=LATEST,
),
MainlineModule(
apex="com.android.conscrypt",
@@ -792,6 +863,8 @@ MAINLINE_MODULES = [
apex="com.android.uwb",
sdks=["uwb-module-sdk"],
first_release=Tiramisu,
+ # Uwb has always been and is still optional.
+ last_optional_release=LATEST,
),
MainlineModule(
apex="com.android.wifi",
@@ -800,6 +873,8 @@ MAINLINE_MODULES = [
for_r_build=ForRBuild(sdk_libraries=[
SdkLibrary(name="framework-wifi"),
]),
+ # Wifi has always been and is still optional.
+ last_optional_release=LATEST,
),
]
diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py
index 6d06303c..56bc3218 100644
--- a/build/mainline_modules_sdks_test.py
+++ b/build/mainline_modules_sdks_test.py
@@ -413,6 +413,36 @@ class TestSoongConfigBoilerplateInserter(unittest.TestCase):
self.apply_transformations(src, transformations, expected)
+ # Check that Tiramisu provides the same transformations as S.
+ tiramisu_transformations = module.transformations(mm.Tiramisu)
+ self.assertEqual(
+ transformations,
+ tiramisu_transformations,
+ msg="Tiramisu must use the same transformations as S")
+
+ def test_optional_mainline_module(self):
+ """Tests the transformations applied to an optional mainline module.
+
+ This uses wifi as an example of a optional mainline module. This checks
+ that the module specific Soong config module types and variables are
+ used.
+ """
+ src = read_test_data("wifi_Android.bp.input")
+
+ expected = read_test_data("wifi_Android.bp.expected")
+
+ module = MAINLINE_MODULES_BY_APEX["com.android.wifi"]
+ transformations = module.transformations(mm.S)
+
+ self.apply_transformations(src, transformations, expected)
+
+ # Check that Tiramisu provides the same transformations as S.
+ tiramisu_transformations = module.transformations(mm.Tiramisu)
+ self.assertEqual(
+ transformations,
+ tiramisu_transformations,
+ msg="Tiramisu must use the same transformations as S")
+
def test_art(self):
"""Tests the transformations applied to a the ART mainline module.
diff --git a/build/mainline_modules_sdks_test_data/wifi_Android.bp.expected b/build/mainline_modules_sdks_test_data/wifi_Android.bp.expected
new file mode 100644
index 00000000..d68abfef
--- /dev/null
+++ b/build/mainline_modules_sdks_test_data/wifi_Android.bp.expected
@@ -0,0 +1,168 @@
+// This is auto-generated. DO NOT EDIT.
+
+// Soong config variable module type added by test_optional_mainline_module.
+soong_config_module_type {
+ name: "wifi_prebuilt_java_import",
+ module_type: "java_import",
+ config_namespace: "wifi_module",
+ bool_variables: ["source_build"],
+ properties: ["prefer"],
+}
+
+// Soong config variable module type added by test_optional_mainline_module.
+soong_config_module_type {
+ name: "wifi_prebuilt_java_sdk_library_import",
+ module_type: "java_sdk_library_import",
+ config_namespace: "wifi_module",
+ bool_variables: ["source_build"],
+ properties: ["prefer"],
+}
+
+// Soong config variable module type added by test_optional_mainline_module.
+soong_config_module_type {
+ name: "wifi_prebuilt_prebuilt_bootclasspath_fragment",
+ module_type: "prebuilt_bootclasspath_fragment",
+ config_namespace: "wifi_module",
+ bool_variables: ["source_build"],
+ properties: ["prefer"],
+}
+
+// Soong config variable module type added by test_optional_mainline_module.
+soong_config_module_type {
+ name: "wifi_prebuilt_prebuilt_systemserverclasspath_fragment",
+ module_type: "prebuilt_systemserverclasspath_fragment",
+ config_namespace: "wifi_module",
+ bool_variables: ["source_build"],
+ properties: ["prefer"],
+}
+
+package {
+ // A default list here prevents the license LSC from adding its own list which would
+ // be unnecessary as every module in the sdk already has its own licenses property.
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+wifi_prebuilt_prebuilt_bootclasspath_fragment {
+ name: "com.android.wifi-bootclasspath-fragment",
+ // Do not prefer prebuilt if the Soong config variable "source_build" in namespace "wifi_module" is true.
+ prefer: true,
+ soong_config_variables: {
+ source_build: {
+ prefer: false,
+ },
+ },
+ visibility: ["//visibility:public"],
+ apex_available: ["com.android.wifi"],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ contents: ["framework-wifi"],
+ fragments: [
+ {
+ apex: "com.android.art",
+ module: "art-bootclasspath-fragment",
+ },
+ ],
+ hidden_api: {
+ unsupported: ["hiddenapi/hiddenapi-unsupported.txt"],
+ max_target_r_low_priority: ["hiddenapi/hiddenapi-max-target-r-low-priority.txt"],
+ max_target_o_low_priority: ["hiddenapi/hiddenapi-max-target-o-low-priority.txt"],
+ annotation_flags: "hiddenapi/annotation-flags.csv",
+ metadata: "hiddenapi/metadata.csv",
+ index: "hiddenapi/index.csv",
+ signature_patterns: "hiddenapi/signature-patterns.csv",
+ filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
+ filtered_flags: "hiddenapi/filtered-flags.csv",
+ },
+}
+
+wifi_prebuilt_java_sdk_library_import {
+ name: "framework-wifi",
+ // Do not prefer prebuilt if the Soong config variable "source_build" in namespace "wifi_module" is true.
+ prefer: true,
+ soong_config_variables: {
+ source_build: {
+ prefer: false,
+ },
+ },
+ visibility: ["//visibility:public"],
+ apex_available: [
+ "com.android.wifi",
+ "test_com.android.wifi",
+ ],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ shared_library: false,
+ permitted_packages: [
+ "android.hardware.wifi",
+ "android.net.wifi",
+ "com.android.wifi.x",
+ ],
+ public: {
+ jars: ["sdk_library/public/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/public/framework-wifi_stub_sources"],
+ current_api: "sdk_library/public/framework-wifi.txt",
+ removed_api: "sdk_library/public/framework-wifi-removed.txt",
+ annotations: "sdk_library/public/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+ system: {
+ jars: ["sdk_library/system/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/system/framework-wifi_stub_sources"],
+ current_api: "sdk_library/system/framework-wifi.txt",
+ removed_api: "sdk_library/system/framework-wifi-removed.txt",
+ annotations: "sdk_library/system/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+ module_lib: {
+ jars: ["sdk_library/module-lib/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/module-lib/framework-wifi_stub_sources"],
+ current_api: "sdk_library/module-lib/framework-wifi.txt",
+ removed_api: "sdk_library/module-lib/framework-wifi-removed.txt",
+ annotations: "sdk_library/module-lib/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+}
+
+wifi_prebuilt_java_import {
+ name: "service-wifi",
+ // Do not prefer prebuilt if the Soong config variable "source_build" in namespace "wifi_module" is true.
+ prefer: true,
+ soong_config_variables: {
+ source_build: {
+ prefer: false,
+ },
+ },
+ visibility: [
+ "//frameworks/opt/net/wifi/service/apex",
+ "//frameworks/opt/net/wifi/tests/wifitests/apex",
+ "//packages/modules/Wifi/apex",
+ "//packages/modules/Wifi/service",
+ "//packages/modules/Wifi/service/tests/wifitests/apex",
+ ],
+ apex_available: [
+ "com.android.wifi",
+ "test_com.android.wifi",
+ ],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ jars: ["java_systemserver_libs/snapshot/jars/are/invalid/service-wifi.jar"],
+}
+
+license {
+ name: "wifi-module-sdk_Android-Apache-2.0",
+ visibility: ["//visibility:private"],
+ license_kinds: ["SPDX-license-identifier-Apache-2.0"],
+ license_text: ["licenses/build/soong/licenses/LICENSE"],
+}
+
+wifi_prebuilt_prebuilt_systemserverclasspath_fragment {
+ name: "com.android.wifi-systemserverclasspath-fragment",
+ // Do not prefer prebuilt if the Soong config variable "source_build" in namespace "wifi_module" is true.
+ prefer: true,
+ soong_config_variables: {
+ source_build: {
+ prefer: false,
+ },
+ },
+ visibility: ["//visibility:public"],
+ apex_available: ["com.android.wifi"],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ standalone_contents: ["service-wifi"],
+}
diff --git a/build/mainline_modules_sdks_test_data/wifi_Android.bp.input b/build/mainline_modules_sdks_test_data/wifi_Android.bp.input
new file mode 100644
index 00000000..29ce3987
--- /dev/null
+++ b/build/mainline_modules_sdks_test_data/wifi_Android.bp.input
@@ -0,0 +1,108 @@
+// This is auto-generated. DO NOT EDIT.
+
+package {
+ // A default list here prevents the license LSC from adding its own list which would
+ // be unnecessary as every module in the sdk already has its own licenses property.
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+prebuilt_bootclasspath_fragment {
+ name: "com.android.wifi-bootclasspath-fragment",
+ prefer: false,
+ visibility: ["//visibility:public"],
+ apex_available: ["com.android.wifi"],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ contents: ["framework-wifi"],
+ fragments: [
+ {
+ apex: "com.android.art",
+ module: "art-bootclasspath-fragment",
+ },
+ ],
+ hidden_api: {
+ unsupported: ["hiddenapi/hiddenapi-unsupported.txt"],
+ max_target_r_low_priority: ["hiddenapi/hiddenapi-max-target-r-low-priority.txt"],
+ max_target_o_low_priority: ["hiddenapi/hiddenapi-max-target-o-low-priority.txt"],
+ annotation_flags: "hiddenapi/annotation-flags.csv",
+ metadata: "hiddenapi/metadata.csv",
+ index: "hiddenapi/index.csv",
+ signature_patterns: "hiddenapi/signature-patterns.csv",
+ filtered_stub_flags: "hiddenapi/filtered-stub-flags.csv",
+ filtered_flags: "hiddenapi/filtered-flags.csv",
+ },
+}
+
+java_sdk_library_import {
+ name: "framework-wifi",
+ prefer: false,
+ visibility: ["//visibility:public"],
+ apex_available: [
+ "com.android.wifi",
+ "test_com.android.wifi",
+ ],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ shared_library: false,
+ permitted_packages: [
+ "android.hardware.wifi",
+ "android.net.wifi",
+ "com.android.wifi.x",
+ ],
+ public: {
+ jars: ["sdk_library/public/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/public/framework-wifi_stub_sources"],
+ current_api: "sdk_library/public/framework-wifi.txt",
+ removed_api: "sdk_library/public/framework-wifi-removed.txt",
+ annotations: "sdk_library/public/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+ system: {
+ jars: ["sdk_library/system/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/system/framework-wifi_stub_sources"],
+ current_api: "sdk_library/system/framework-wifi.txt",
+ removed_api: "sdk_library/system/framework-wifi-removed.txt",
+ annotations: "sdk_library/system/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+ module_lib: {
+ jars: ["sdk_library/module-lib/framework-wifi-stubs.jar"],
+ stub_srcs: ["sdk_library/module-lib/framework-wifi_stub_sources"],
+ current_api: "sdk_library/module-lib/framework-wifi.txt",
+ removed_api: "sdk_library/module-lib/framework-wifi-removed.txt",
+ annotations: "sdk_library/module-lib/framework-wifi_annotations.zip",
+ sdk_version: "module_current",
+ },
+}
+
+java_import {
+ name: "service-wifi",
+ prefer: false,
+ visibility: [
+ "//frameworks/opt/net/wifi/service/apex",
+ "//frameworks/opt/net/wifi/tests/wifitests/apex",
+ "//packages/modules/Wifi/apex",
+ "//packages/modules/Wifi/service",
+ "//packages/modules/Wifi/service/tests/wifitests/apex",
+ ],
+ apex_available: [
+ "com.android.wifi",
+ "test_com.android.wifi",
+ ],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ jars: ["java_systemserver_libs/snapshot/jars/are/invalid/service-wifi.jar"],
+}
+
+license {
+ name: "wifi-module-sdk_Android-Apache-2.0",
+ visibility: ["//visibility:private"],
+ license_kinds: ["SPDX-license-identifier-Apache-2.0"],
+ license_text: ["licenses/build/soong/licenses/LICENSE"],
+}
+
+prebuilt_systemserverclasspath_fragment {
+ name: "com.android.wifi-systemserverclasspath-fragment",
+ prefer: false,
+ visibility: ["//visibility:public"],
+ apex_available: ["com.android.wifi"],
+ licenses: ["wifi-module-sdk_Android-Apache-2.0"],
+ standalone_contents: ["service-wifi"],
+}