From 8f148dd61519a28b913d07b105bd8f263179b263 Mon Sep 17 00:00:00 2001 From: Gurpreet Singh Date: Tue, 19 Mar 2024 12:31:08 +0000 Subject: Generate file for module to project mapping. Currently there exist no mapping between the module name to its git project directory (for prebuilts/module_sdk). This CL adds a .json file to android build artifacts, which can be fetched to obtain this mapping. The .json file contents for 2 modules looks like - { "com.google.android.adservices": { "module_sdk_project": "prebuilts/module_sdk/AdServices" }, "com.google.android.appsearch": { "module_sdk_project": "prebuilts/module_sdk/AppSearch" }, } This can be extended to add any more information about a module. Bug: 321970705 Test: packages/modules/common/build/mainline_modules_sdks.sh --build-release=latest Test: The file generates successfully at dist root. Test: atest mainline_modules_sdks_test Change-Id: I2fde908612b890057ce79ef1eb2668168ca070df --- build/mainline_modules_sdks.py | 56 +++++++++++++++++++++++++++++++++ build/mainline_modules_sdks_test.py | 62 ++++++++++++++++++++++++++++++++----- 2 files changed, 111 insertions(+), 7 deletions(-) diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py index de94e923..2ba4389e 100755 --- a/build/mainline_modules_sdks.py +++ b/build/mainline_modules_sdks.py @@ -27,6 +27,7 @@ import functools import io import json import os +from pathlib import Path import re import shutil import subprocess @@ -310,6 +311,39 @@ def set_default_timestamp(base_dir, paths): os.utime(p, (timestamp, timestamp)) +# Find the git project path of the module_sdk for given module. +def module_sdk_project_for_module(module, root_dir): + module = module.rsplit(".", 1)[1] + # git_master-art and aosp-master-art branches does not contain project for + # art, hence adding special case for art. + if module == "art": + return "prebuilts/module_sdk/art" + if module == "btservices": + return "prebuilts/module_sdk/Bluetooth" + if module == "media": + return "prebuilts/module_sdk/Media" + if module == "rkpd": + return "prebuilts/module_sdk/RemoteKeyProvisioning" + if module == "tethering": + return "prebuilts/module_sdk/Connectivity" + + target_dir = "" + for dir in os.listdir(os.path.join(root_dir, "prebuilts/module_sdk/")): + if module.lower() in dir.lower(): + if target_dir: + print( + 'Multiple target dirs matched "%s": %s' + % (module, (target_dir, dir)) + ) + sys.exit(1) + target_dir = dir + if not target_dir: + print("Could not find a target dir for %s" % module) + sys.exit(1) + + return "prebuilts/module_sdk/%s" % target_dir + + @dataclasses.dataclass() class SnapshotBuilder: """Builds sdk snapshots""" @@ -1438,6 +1472,25 @@ class SdkDistProducer: if module in MAINLINE_MODULES: file.write(aosp_to_google_name(module.apex) + "\n") + def generate_mainline_modules_info_file(self, modules, root_dir): + mainline_modules_info_file = os.path.join( + self.dist_dir, "mainline-modules-info.json" + ) + os.makedirs(os.path.dirname(mainline_modules_info_file), exist_ok=True) + mainline_modules_info_dict = {} + for module in modules: + if module not in MAINLINE_MODULES: + continue + + module = aosp_to_google_name(module.apex) + mainline_modules_info_dict[module] = dict() + mainline_modules_info_dict[module]["module_sdk_project"] = ( + module_sdk_project_for_module(module, root_dir) + ) + + with open(mainline_modules_info_file, "w", encoding="utf8") as file: + json.dump(mainline_modules_info_dict, file, indent=4) + def populate_unbundled_dist(self, build_release, modules, snapshots_dir): build_release_dist_dir = os.path.join( self.mainline_sdks_dir, build_release.sub_dir @@ -1727,6 +1780,9 @@ def main(args): producer = create_producer(args.tool_path, args.skip_allowed_deps_check) producer.dist_generate_sdk_supported_modules_file(modules) + producer.generate_mainline_modules_info_file( + modules, os.environ["ANDROID_BUILD_TOP"] + ) producer.produce_dist(modules, build_releases) diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py index 82b329cc..d56576df 100644 --- a/build/mainline_modules_sdks_test.py +++ b/build/mainline_modules_sdks_test.py @@ -160,6 +160,14 @@ class TestProduceDist(unittest.TestCase): os.mkdir(self.tmp_out_dir) self.tmp_dist_dir = os.path.join(self.tmp_dir, "dist") os.mkdir(self.tmp_dist_dir) + os.makedirs( + os.path.join(self.tmp_dir, "prebuilts/module_sdk/AdServices"), + exist_ok=True, + ) + os.makedirs( + os.path.join(self.tmp_dir, "prebuilts/module_sdk/Connectivity"), + exist_ok=True, + ) def tearDown(self): shutil.rmtree(self.tmp_dir, ignore_errors=True) @@ -467,11 +475,6 @@ class TestProduceDist(unittest.TestCase): snapshot_builder=snapshot_builder, dist_dir=self.tmp_dist_dir, ) - producer = mm.SdkDistProducer( - subprocess_runner=subprocess_runner, - snapshot_builder=snapshot_builder, - dist_dir=self.tmp_dist_dir, - ) # Contains only sdk modules. modules = [ @@ -499,7 +502,7 @@ class TestProduceDist(unittest.TestCase): first_release="", ), mm.MainlineModule( - apex="com.android.adbd", + apex="com.android.extservices", sdks=[], first_release="", ), @@ -524,7 +527,7 @@ class TestProduceDist(unittest.TestCase): first_release="", ), mm.MainlineModule( - apex="com.android.adbd", + apex="com.android.extservices", sdks=[], first_release="", ), @@ -542,6 +545,51 @@ class TestProduceDist(unittest.TestCase): self.assertFalse("com.google.android.adbd\n" in sdk_modules) self.assertFalse("com.google.android.extservices\n" in sdk_modules) + def test_generate_mainline_modules_info_file(self): + subprocess_runner = mm.SubprocessRunner() + snapshot_builder = FakeSnapshotBuilder( + tool_path="path/to/mainline_modules_sdks.sh", + subprocess_runner=subprocess_runner, + out_dir=self.tmp_out_dir, + ) + producer = mm.SdkDistProducer( + subprocess_runner=subprocess_runner, + snapshot_builder=snapshot_builder, + dist_dir=self.tmp_dist_dir, + ) + + modules = [ + MAINLINE_MODULES_BY_APEX["com.android.adservices"], + MAINLINE_MODULES_BY_APEX["com.android.tethering"], + mm.MainlineModule( + apex="com.android.adbd", + sdks=[], + first_release="", + ), + ] + + producer.generate_mainline_modules_info_file(modules, self.tmp_dir) + with open( + os.path.join(self.tmp_dist_dir, "mainline-modules-info.json"), + "r", + encoding="utf8", + ) as mainline_modules_info_file: + mainline_modules_info = json.load(mainline_modules_info_file) + + self.assertEqual( + mainline_modules_info["com.google.android.adservices"][ + "module_sdk_project" + ], + "prebuilts/module_sdk/AdServices", + ) + self.assertEqual( + mainline_modules_info["com.google.android.tethering"][ + "module_sdk_project" + ], + "prebuilts/module_sdk/Connectivity", + ) + self.assertFalse("adbd" in mainline_modules_info) + def path_to_test_data(relative_path): """Construct a path to a test data file. -- cgit v1.2.3