diff options
Diffstat (limited to 'rules/sandboxed_sdk_toolbox.bzl')
-rw-r--r-- | rules/sandboxed_sdk_toolbox.bzl | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/rules/sandboxed_sdk_toolbox.bzl b/rules/sandboxed_sdk_toolbox.bzl new file mode 100644 index 0000000..1c1a5dd --- /dev/null +++ b/rules/sandboxed_sdk_toolbox.bzl @@ -0,0 +1,172 @@ +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Bazel SandboxedSdkToolbox commands.""" + +load(":java.bzl", _java = "java") + +def _extract_api_descriptors( + ctx, + output = None, + sdk_deploy_jar = None, + sandboxed_sdk_toolbox = None, + host_javabase = None): + """Extracts API descriptors from a sandboxed SDK classpath. + + The API descriptors can later be used to generate sources for communicating with this SDK. + + Args: + ctx: The context. + output: Output API descriptors jar file. + sdk_deploy_jar: The SDK classpath, with transitive dependencies. + sandboxed_sdk_toolbox: Toolbox executable files. + host_javabase: Javabase used to run the toolbox. + """ + args = ctx.actions.args() + args.add("extract-api-descriptors") + args.add("--sdk-deploy-jar", sdk_deploy_jar) + args.add("--output-sdk-api-descriptors", output) + _java.run( + ctx = ctx, + host_javabase = host_javabase, + executable = sandboxed_sdk_toolbox, + arguments = [args], + inputs = [sdk_deploy_jar], + outputs = [output], + mnemonic = "ExtractApiDescriptors", + progress_message = "Extract SDK API descriptors %s" % output.short_path, + ) + +def _extract_api_descriptors_from_asar( + ctx, + output = None, + asar = None, + sandboxed_sdk_toolbox = None, + host_javabase = None): + """Extracts API descriptors from a sandboxed SDK archive. + + The API descriptors can later be used to generate sources for communicating with this SDK. + + Args: + ctx: The context. + output: Output API descriptors jar file. + asar: The sandboxed sdk archive. + sandboxed_sdk_toolbox: Toolbox executable files. + host_javabase: Javabase used to run the toolbox. + """ + args = ctx.actions.args() + args.add("extract-api-descriptors-from-asar") + args.add("--asar", asar) + args.add("--output-sdk-api-descriptors", output) + _java.run( + ctx = ctx, + host_javabase = host_javabase, + executable = sandboxed_sdk_toolbox, + arguments = [args], + inputs = [asar], + outputs = [output], + mnemonic = "ExtractApiDescriptorsFromAsar", + progress_message = "Extract SDK API descriptors from ASAR %s" % output.short_path, + ) + +def _generate_client_sources( + ctx, + output_kotlin_dir = None, + output_java_dir = None, + sdk_api_descriptors = None, + aidl_compiler = None, + framework_aidl = None, + sandboxed_sdk_toolbox = None, + host_javabase = None): + """Generate Kotlin and Java sources for SDK communication. + + Args: + ctx: The context. + output_kotlin_dir: Directory for Kotlin source tree. It depends on the Java sources. + output_java_dir: Directory for Java source tree. Doesn't depend on Kotlin sources. + sdk_api_descriptors: SDK API descriptor jar. + aidl_compiler: Executable files for the AOSP AIDL compiler. + framework_aidl: Framework.aidl file used to compile AIDL sources. + sandboxed_sdk_toolbox: Toolbox executable files. + host_javabase: Javabase used to run the toolbox. + """ + args = ctx.actions.args() + args.add("generate-client-sources") + args.add("--sdk-api-descriptors", sdk_api_descriptors) + args.add("--aidl-compiler", aidl_compiler) + args.add("--framework-aidl", framework_aidl) + args.add("--output-kotlin-dir", output_kotlin_dir.path) + args.add("--output-java-dir", output_java_dir.path) + _java.run( + ctx = ctx, + host_javabase = host_javabase, + executable = sandboxed_sdk_toolbox, + arguments = [args], + inputs = [ + sdk_api_descriptors, + aidl_compiler, + framework_aidl, + ], + outputs = [output_kotlin_dir, output_java_dir], + mnemonic = "GenClientSources", + progress_message = "Generate client sources for %s" % output_kotlin_dir.short_path, + ) + +def _generate_sdk_dependencies_manifest( + ctx, + output = None, + manifest_package = None, + sdk_module_configs = None, + debug_key = None, + sandboxed_sdk_toolbox = None, + host_javabase = None): + """Generates a manifest that lists all sandboxed SDK dependencies. + + The generated manifest will contain <uses-sdk-library> tags for each SDK. This is required for + loading the SDK in the Privacy Sandbox. + + Args: + ctx: The context. + output: File where the final manifest will be written. + manifest_package: The package used in the manifest. + sdk_module_configs: List of SDK Module config JSON files with SDK packages and versions. + debug_key: Keystore that will later be used to sign the SDK APKs. It's expected to be a + sandboxed_sdk_toolbox: Toolbox executable files. + host_javabase: Javabase used to run the toolbox. + """ + args = ctx.actions.args() + args.add("generate-sdk-dependencies-manifest") + args.add("--manifest-package", manifest_package) + args.add("--sdk-module-configs", ",".join([config.path for config in sdk_module_configs])) + args.add("--debug-keystore", debug_key) + args.add("--debug-keystore-pass", "android") + args.add("--debug-keystore-alias", "androiddebugkey") + args.add("--output-manifest", output) + _java.run( + ctx = ctx, + host_javabase = host_javabase, + executable = sandboxed_sdk_toolbox, + arguments = [args], + inputs = sdk_module_configs + [debug_key], + outputs = [output], + mnemonic = "GenSdkDepManifest", + progress_message = "Generate SDK dependencies manifest %s" % output.short_path, + ) + +sandboxed_sdk_toolbox = struct( + extract_api_descriptors = _extract_api_descriptors, + extract_api_descriptors_from_asar = _extract_api_descriptors_from_asar, + generate_client_sources = _generate_client_sources, + generate_sdk_dependencies_manifest = _generate_sdk_dependencies_manifest, +) |