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