android13/build/bazel/rules/android/android_binary.bzl

100 lines
3.5 KiB
Python

"""
Copyright (C) 2022 The Android Open Source Project
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.
"""
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@rules_android//rules:rules.bzl", _android_binary = "android_binary")
load("@soong_injection//product_config:product_variables.bzl", "product_vars")
load("android_app_certificate.bzl", "android_app_certificate")
load("android_app_keystore.bzl", "android_app_keystore")
def _default_cert_prod_var():
return product_vars["DefaultAppCertificate"]
def _default_app_certificate_package():
default_cert = _default_cert_prod_var()
if default_cert:
return "//" + paths.dirname(default_cert)
# if product variable is not set, default to Soong default:
return "//build/make/target/product/security"
def _default_app_certificate():
default_cert = _default_cert_prod_var()
if default_cert:
return default_cert
return _default_app_certificate_package() + ":testkey"
def _android_app_certificate_with_default_cert(name, cert_name):
if cert_name:
# if a specific certificate name is given, check the default directory
# for that certificate
certificate = _default_app_certificate_package() + ":" + cert_name
else:
certificate = _default_app_certificate()
android_app_certificate(
name = name,
certificate = certificate,
)
def android_binary(
name,
certificate = None,
certificate_name = None,
**kwargs):
"""Bazel macro to find and create a keystore to use for debug_signing_keys
with @rules_android android_binary.
This module emulates the Soong behavior which allows a developer to specify
a specific module name for the android_app_certificate or the name of a
.pem/.pk8 certificate/key pair in a directory specified by the
DefaultAppCertificate product variable. In either case, we convert the specified
.pem/.pk8 certificate/key pair to a JKS .keystore file before passing it to the
android_binary rule.
Arguments:
certificate: Bazel target
certificate_name: string, name of private key file in default certificate directory
**kwargs: map, additional args to pass to android_binary
"""
if certificate and certificate_name:
fail("Cannot use both certificate_name and certificate attributes together. Use only one of them.")
debug_signing_keys = kwargs.pop("debug_signing_keys", [])
if certificate or certificate_name:
if certificate_name:
app_cert_name = name + "_app_certificate"
_android_app_certificate_with_default_cert(app_cert_name, certificate_name)
certificate = ":" + app_cert_name
app_keystore_name = name + "_keystore"
android_app_keystore(
name = app_keystore_name,
certificate = certificate
)
debug_signing_keys.append(app_keystore_name)
_android_binary(
name = name,
debug_signing_keys = debug_signing_keys,
**kwargs
)