xref: /aosp_15_r20/external/bazelbuild-rules_android/rules/sandboxed_sdk_toolbox.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux# Copyright 2023 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux#
3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux#
7*9e965d6fSRomain Jobredeaux#    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux#
9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux# limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux"""Bazel SandboxedSdkToolbox commands."""
16*9e965d6fSRomain Jobredeaux
17*9e965d6fSRomain Jobredeauxload(":java.bzl", _java = "java")
18*9e965d6fSRomain Jobredeaux
19*9e965d6fSRomain Jobredeauxdef _extract_api_descriptors(
20*9e965d6fSRomain Jobredeaux        ctx,
21*9e965d6fSRomain Jobredeaux        output = None,
22*9e965d6fSRomain Jobredeaux        sdk_deploy_jar = None,
23*9e965d6fSRomain Jobredeaux        sandboxed_sdk_toolbox = None,
24*9e965d6fSRomain Jobredeaux        host_javabase = None):
25*9e965d6fSRomain Jobredeaux    """Extracts API descriptors from a sandboxed SDK classpath.
26*9e965d6fSRomain Jobredeaux
27*9e965d6fSRomain Jobredeaux    The API descriptors can later be used to generate sources for communicating with this SDK.
28*9e965d6fSRomain Jobredeaux
29*9e965d6fSRomain Jobredeaux    Args:
30*9e965d6fSRomain Jobredeaux      ctx: The context.
31*9e965d6fSRomain Jobredeaux      output: Output API descriptors jar file.
32*9e965d6fSRomain Jobredeaux      sdk_deploy_jar: The SDK classpath, with transitive dependencies.
33*9e965d6fSRomain Jobredeaux      sandboxed_sdk_toolbox: Toolbox executable files.
34*9e965d6fSRomain Jobredeaux      host_javabase: Javabase used to run the toolbox.
35*9e965d6fSRomain Jobredeaux    """
36*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
37*9e965d6fSRomain Jobredeaux    args.add("extract-api-descriptors")
38*9e965d6fSRomain Jobredeaux    args.add("--sdk-deploy-jar", sdk_deploy_jar)
39*9e965d6fSRomain Jobredeaux    args.add("--output-sdk-api-descriptors", output)
40*9e965d6fSRomain Jobredeaux    _java.run(
41*9e965d6fSRomain Jobredeaux        ctx = ctx,
42*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
43*9e965d6fSRomain Jobredeaux        executable = sandboxed_sdk_toolbox,
44*9e965d6fSRomain Jobredeaux        arguments = [args],
45*9e965d6fSRomain Jobredeaux        inputs = [sdk_deploy_jar],
46*9e965d6fSRomain Jobredeaux        outputs = [output],
47*9e965d6fSRomain Jobredeaux        mnemonic = "ExtractApiDescriptors",
48*9e965d6fSRomain Jobredeaux        progress_message = "Extract SDK API descriptors %s" % output.short_path,
49*9e965d6fSRomain Jobredeaux    )
50*9e965d6fSRomain Jobredeaux
51*9e965d6fSRomain Jobredeauxdef _extract_api_descriptors_from_asar(
52*9e965d6fSRomain Jobredeaux        ctx,
53*9e965d6fSRomain Jobredeaux        output = None,
54*9e965d6fSRomain Jobredeaux        asar = None,
55*9e965d6fSRomain Jobredeaux        sandboxed_sdk_toolbox = None,
56*9e965d6fSRomain Jobredeaux        host_javabase = None):
57*9e965d6fSRomain Jobredeaux    """Extracts API descriptors from a sandboxed SDK archive.
58*9e965d6fSRomain Jobredeaux
59*9e965d6fSRomain Jobredeaux    The API descriptors can later be used to generate sources for communicating with this SDK.
60*9e965d6fSRomain Jobredeaux
61*9e965d6fSRomain Jobredeaux    Args:
62*9e965d6fSRomain Jobredeaux      ctx: The context.
63*9e965d6fSRomain Jobredeaux      output: Output API descriptors jar file.
64*9e965d6fSRomain Jobredeaux      asar: The sandboxed sdk archive.
65*9e965d6fSRomain Jobredeaux      sandboxed_sdk_toolbox: Toolbox executable files.
66*9e965d6fSRomain Jobredeaux      host_javabase: Javabase used to run the toolbox.
67*9e965d6fSRomain Jobredeaux    """
68*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
69*9e965d6fSRomain Jobredeaux    args.add("extract-api-descriptors-from-asar")
70*9e965d6fSRomain Jobredeaux    args.add("--asar", asar)
71*9e965d6fSRomain Jobredeaux    args.add("--output-sdk-api-descriptors", output)
72*9e965d6fSRomain Jobredeaux    _java.run(
73*9e965d6fSRomain Jobredeaux        ctx = ctx,
74*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
75*9e965d6fSRomain Jobredeaux        executable = sandboxed_sdk_toolbox,
76*9e965d6fSRomain Jobredeaux        arguments = [args],
77*9e965d6fSRomain Jobredeaux        inputs = [asar],
78*9e965d6fSRomain Jobredeaux        outputs = [output],
79*9e965d6fSRomain Jobredeaux        mnemonic = "ExtractApiDescriptorsFromAsar",
80*9e965d6fSRomain Jobredeaux        progress_message = "Extract SDK API descriptors from ASAR %s" % output.short_path,
81*9e965d6fSRomain Jobredeaux    )
82*9e965d6fSRomain Jobredeaux
83*9e965d6fSRomain Jobredeauxdef _generate_client_sources(
84*9e965d6fSRomain Jobredeaux        ctx,
85*9e965d6fSRomain Jobredeaux        output_kotlin_dir = None,
86*9e965d6fSRomain Jobredeaux        output_java_dir = None,
87*9e965d6fSRomain Jobredeaux        sdk_api_descriptors = None,
88*9e965d6fSRomain Jobredeaux        aidl_compiler = None,
89*9e965d6fSRomain Jobredeaux        framework_aidl = None,
90*9e965d6fSRomain Jobredeaux        sandboxed_sdk_toolbox = None,
91*9e965d6fSRomain Jobredeaux        host_javabase = None):
92*9e965d6fSRomain Jobredeaux    """Generate Kotlin and Java sources for SDK communication.
93*9e965d6fSRomain Jobredeaux
94*9e965d6fSRomain Jobredeaux    Args:
95*9e965d6fSRomain Jobredeaux      ctx: The context.
96*9e965d6fSRomain Jobredeaux      output_kotlin_dir: Directory for Kotlin source tree. It depends on the Java sources.
97*9e965d6fSRomain Jobredeaux      output_java_dir: Directory for Java source tree. Doesn't depend on Kotlin sources.
98*9e965d6fSRomain Jobredeaux      sdk_api_descriptors: SDK API descriptor jar.
99*9e965d6fSRomain Jobredeaux      aidl_compiler: Executable files for the AOSP AIDL compiler.
100*9e965d6fSRomain Jobredeaux      framework_aidl: Framework.aidl file used to compile AIDL sources.
101*9e965d6fSRomain Jobredeaux      sandboxed_sdk_toolbox: Toolbox executable files.
102*9e965d6fSRomain Jobredeaux      host_javabase: Javabase used to run the toolbox.
103*9e965d6fSRomain Jobredeaux    """
104*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
105*9e965d6fSRomain Jobredeaux    args.add("generate-client-sources")
106*9e965d6fSRomain Jobredeaux    args.add("--sdk-api-descriptors", sdk_api_descriptors)
107*9e965d6fSRomain Jobredeaux    args.add("--aidl-compiler", aidl_compiler)
108*9e965d6fSRomain Jobredeaux    args.add("--framework-aidl", framework_aidl)
109*9e965d6fSRomain Jobredeaux    args.add("--output-kotlin-dir", output_kotlin_dir.path)
110*9e965d6fSRomain Jobredeaux    args.add("--output-java-dir", output_java_dir.path)
111*9e965d6fSRomain Jobredeaux    _java.run(
112*9e965d6fSRomain Jobredeaux        ctx = ctx,
113*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
114*9e965d6fSRomain Jobredeaux        executable = sandboxed_sdk_toolbox,
115*9e965d6fSRomain Jobredeaux        arguments = [args],
116*9e965d6fSRomain Jobredeaux        inputs = [
117*9e965d6fSRomain Jobredeaux            sdk_api_descriptors,
118*9e965d6fSRomain Jobredeaux            aidl_compiler,
119*9e965d6fSRomain Jobredeaux            framework_aidl,
120*9e965d6fSRomain Jobredeaux        ],
121*9e965d6fSRomain Jobredeaux        outputs = [output_kotlin_dir, output_java_dir],
122*9e965d6fSRomain Jobredeaux        mnemonic = "GenClientSources",
123*9e965d6fSRomain Jobredeaux        progress_message = "Generate client sources for %s" % output_kotlin_dir.short_path,
124*9e965d6fSRomain Jobredeaux    )
125*9e965d6fSRomain Jobredeaux
126*9e965d6fSRomain Jobredeauxdef _generate_sdk_dependencies_manifest(
127*9e965d6fSRomain Jobredeaux        ctx,
128*9e965d6fSRomain Jobredeaux        output = None,
129*9e965d6fSRomain Jobredeaux        manifest_package = None,
130*9e965d6fSRomain Jobredeaux        sdk_module_configs = None,
131*9e965d6fSRomain Jobredeaux        sdk_archives = None,
132*9e965d6fSRomain Jobredeaux        debug_key = None,
133*9e965d6fSRomain Jobredeaux        sandboxed_sdk_toolbox = None,
134*9e965d6fSRomain Jobredeaux        host_javabase = None):
135*9e965d6fSRomain Jobredeaux    """Generates a manifest that lists all sandboxed SDK dependencies.
136*9e965d6fSRomain Jobredeaux
137*9e965d6fSRomain Jobredeaux    The generated manifest will contain <uses-sdk-library> tags for each SDK. This is required for
138*9e965d6fSRomain Jobredeaux    loading the SDK in the Privacy Sandbox.
139*9e965d6fSRomain Jobredeaux
140*9e965d6fSRomain Jobredeaux    Args:
141*9e965d6fSRomain Jobredeaux      ctx: The context.
142*9e965d6fSRomain Jobredeaux      output: File where the final manifest will be written.
143*9e965d6fSRomain Jobredeaux      manifest_package: The package used in the manifest.
144*9e965d6fSRomain Jobredeaux      sdk_module_configs: List of SDK Module config JSON files with SDK packages and versions.
145*9e965d6fSRomain Jobredeaux      sdk_archives: List of SDK archives, as ASAR files. They will also be listed as dependencies.
146*9e965d6fSRomain Jobredeaux      debug_key: Debug keystore that will later be used to sign the SDK APKs.
147*9e965d6fSRomain Jobredeaux      sandboxed_sdk_toolbox: Toolbox executable files.
148*9e965d6fSRomain Jobredeaux      host_javabase: Javabase used to run the toolbox.
149*9e965d6fSRomain Jobredeaux    """
150*9e965d6fSRomain Jobredeaux    inputs = [debug_key]
151*9e965d6fSRomain Jobredeaux    args = ctx.actions.args()
152*9e965d6fSRomain Jobredeaux    args.add("generate-sdk-dependencies-manifest")
153*9e965d6fSRomain Jobredeaux    args.add("--manifest-package", manifest_package)
154*9e965d6fSRomain Jobredeaux    if sdk_module_configs:
155*9e965d6fSRomain Jobredeaux        args.add("--sdk-module-configs", ",".join([config.path for config in sdk_module_configs]))
156*9e965d6fSRomain Jobredeaux        inputs.extend(sdk_module_configs)
157*9e965d6fSRomain Jobredeaux    if sdk_archives:
158*9e965d6fSRomain Jobredeaux        args.add("--sdk-archives", ",".join([archive.path for archive in sdk_archives]))
159*9e965d6fSRomain Jobredeaux        inputs.extend(sdk_archives)
160*9e965d6fSRomain Jobredeaux    args.add("--debug-keystore", debug_key)
161*9e965d6fSRomain Jobredeaux    args.add("--debug-keystore-pass", "android")
162*9e965d6fSRomain Jobredeaux    args.add("--debug-keystore-alias", "androiddebugkey")
163*9e965d6fSRomain Jobredeaux    args.add("--output-manifest", output)
164*9e965d6fSRomain Jobredeaux    _java.run(
165*9e965d6fSRomain Jobredeaux        ctx = ctx,
166*9e965d6fSRomain Jobredeaux        host_javabase = host_javabase,
167*9e965d6fSRomain Jobredeaux        executable = sandboxed_sdk_toolbox,
168*9e965d6fSRomain Jobredeaux        arguments = [args],
169*9e965d6fSRomain Jobredeaux        inputs = inputs,
170*9e965d6fSRomain Jobredeaux        outputs = [output],
171*9e965d6fSRomain Jobredeaux        mnemonic = "GenSdkDepManifest",
172*9e965d6fSRomain Jobredeaux        progress_message = "Generate SDK dependencies manifest %s" % output.short_path,
173*9e965d6fSRomain Jobredeaux    )
174*9e965d6fSRomain Jobredeaux
175*9e965d6fSRomain Jobredeauxsandboxed_sdk_toolbox = struct(
176*9e965d6fSRomain Jobredeaux    extract_api_descriptors = _extract_api_descriptors,
177*9e965d6fSRomain Jobredeaux    extract_api_descriptors_from_asar = _extract_api_descriptors_from_asar,
178*9e965d6fSRomain Jobredeaux    generate_client_sources = _generate_client_sources,
179*9e965d6fSRomain Jobredeaux    generate_sdk_dependencies_manifest = _generate_sdk_dependencies_manifest,
180*9e965d6fSRomain Jobredeaux)
181