import argparse import datetime import json import os import re import sys INT32_MAX = 2 ** 31 - 1 def guess_build_top(): if 'ANDROID_BUILD_TOP' in os.environ: return os.environ['ANDROID_BUILD_TOP'] cwd = os.getcwd() parts = cwd.split('/out/soong/') return parts[0] def get_build_number(): top = guess_build_top() with open(f'{top}/out/soong/build_number.txt', 'r') as file: soong_build_number = file.read().strip() return soong_build_number def get_build_id(): top = guess_build_top() with open(f'{top}/build/core/build_id.mk', 'r') as file: for line in file: if line.startswith('BUILD_ID='): _, rc = line.strip().split('=', 1) return rc def hdr(args): output = f'''\ #ifndef {args.guard} #define {args.guard} #define WV_ANDROID_BUILD_ID "{get_build_id()}" #endif // {args.guard}''' print(output) def safe_int(str_value): """Converts a build number to an integer, capped at INT32_MAX. INT32_MAX is the max supported by Android Build. Args: str_value: The build number to convert. Returns: The integer representation of build number, capped at INT32_MAX; 0 on error. """ try: v = int(str_value) return min(INT32_MAX, v) except ValueError: return 0 def apex_manifest(args): rc = get_build_id() v = get_build_number() if v.startswith('eng.'): # local build # # set large version so local builds can overwrite other build types v = INT32_MAX elif re.match(r'P\d+$', v): # presubmit build # # numeric value of presubmit builds are typically higher than # postsubmit builds, so presubmit builds can overwrite postsubmit # builds during test v = safe_int(v[1:]) elif rc in ('MASTER', 'MAIN'): # postsubmit dev branch # # set APEX version to 1 (preserve udc behavior) v = 1 elif re.match(r'\d+$', v): # postsubmit release branch # # set APEX version to ab build number v = safe_int(v) else: raise RuntimeError('Unsupported Widevine APEX build env') out = dict(name=args.name, version=v, requireNativeLibs=['liboemcrypto']) print(json.dumps(out)) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Widevine Android genrule utility') parser.set_defaults(func=lambda _: parser.print_help()) subparsers = parser.add_subparsers(help='Available subcommands') hdr_description = 'Generate build id C++ header (stdout)' parser_hdr = subparsers.add_parser('build_id_header', help=hdr_description) parser_hdr.add_argument('--guard', type=str, default='WVCDM_WV_ANDROID_BUILD_ID_H_', help='Include guard') parser_hdr.set_defaults(func=hdr) apex_description = 'Generate APEX manifest json (stdout)' parser_apex = subparsers.add_parser('apex_manifest', help=apex_description) parser_apex.add_argument('--name', help='apex name', default='com.google.android.widevine') parser_apex.set_defaults(func=apex_manifest) # Parse the arguments and call the appropriate function args = parser.parse_args() args.func(args)