From 0bcc813e3507fc4a6729ec226ba2ccedb467a208 Mon Sep 17 00:00:00 2001 From: Vaibhav Devmurari Date: Wed, 6 Mar 2024 11:50:38 +0000 Subject: [PATCH 1/2] Revert "Widevine version genrules" This reverts commit 9f32150e5fae37bc200eaaca3794605a8bf17806. Reason for revert: Potential cause for b/328364975 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:8aef6927981a8c701d4b7aeca7e61df774f16468) Merged-In: I3d1411cb183bf3faf04dee51f8a191ec796517f4 Change-Id: I3d1411cb183bf3faf04dee51f8a191ec796517f4 --- libwvdrmengine/Android.bp | 37 ------ libwvdrmengine/apex/Android.bp | 2 +- libwvdrmengine/apex/apex_manifest.json | 7 ++ .../apex/nonupdatable/lazy/Android.bp | 2 +- .../apex/nonupdatable/lazy/apex_manifest.json | 7 ++ .../cdm/include/wv_android_constants.h | 3 +- libwvdrmengine/cdm/src/properties_android.cpp | 15 ++- libwvdrmengine/wv-android-genrule.py | 117 ------------------ 8 files changed, 29 insertions(+), 161 deletions(-) create mode 100644 libwvdrmengine/apex/apex_manifest.json create mode 100644 libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json delete mode 100644 libwvdrmengine/wv-android-genrule.py diff --git a/libwvdrmengine/Android.bp b/libwvdrmengine/Android.bp index 1e0c5840..677c1ebd 100644 --- a/libwvdrmengine/Android.bp +++ b/libwvdrmengine/Android.bp @@ -224,10 +224,6 @@ cc_library_static { "libutils_headers", ], - generated_headers: [ - "wv_android_build_id", - ], - shared_libs: [ "libbinder_ndk", "libcrypto", @@ -372,36 +368,3 @@ cc_fuzz { ], }, } - -python_binary_host { - name: "wv-android-genrule", - srcs: [ - "wv-android-genrule.py", - ], - version: { - py3: { - embedded_launcher: true, - }, - }, -} - -genrule { - name: "wv_android_build_id", - tools: ["wv-android-genrule"], - cmd: "$(location wv-android-genrule) build_id_header > $(out)", - out: ["wv_android_build_id.h"], -} - -genrule { - name: "widevine_apex_manifest.json", - tools: ["wv-android-genrule"], - cmd: "$(location wv-android-genrule) apex_manifest > $(out)", - out: ["gen_wv_apex_manifest.json"], -} - -genrule { - name: "widevine_lazy_apex_manifest.json", - tools: ["wv-android-genrule"], - cmd: "$(location wv-android-genrule) apex_manifest --name com.google.android.widevine.lazy > $(out)", - out: ["gen_wv_lazy_apex_manifest.json"], -} diff --git a/libwvdrmengine/apex/Android.bp b/libwvdrmengine/apex/Android.bp index 5edb0f38..62a6171e 100644 --- a/libwvdrmengine/apex/Android.bp +++ b/libwvdrmengine/apex/Android.bp @@ -77,7 +77,7 @@ widevine_key_apex_defaults { apex { name: "com.google.android.widevine", - manifest: ":widevine_apex_manifest.json", + manifest: "apex_manifest.json", prebuilts: [ "com.google.android.widevine.rc", "com.google.android.widevine.xml", // etc/vintf diff --git a/libwvdrmengine/apex/apex_manifest.json b/libwvdrmengine/apex/apex_manifest.json new file mode 100644 index 00000000..84f6795a --- /dev/null +++ b/libwvdrmengine/apex/apex_manifest.json @@ -0,0 +1,7 @@ +{ + "name": "com.google.android.widevine", + "version": 1, + "requireNativeLibs": [ + "liboemcrypto.so" + ] +} \ No newline at end of file diff --git a/libwvdrmengine/apex/nonupdatable/lazy/Android.bp b/libwvdrmengine/apex/nonupdatable/lazy/Android.bp index dff04551..eca4a55e 100644 --- a/libwvdrmengine/apex/nonupdatable/lazy/Android.bp +++ b/libwvdrmengine/apex/nonupdatable/lazy/Android.bp @@ -57,7 +57,7 @@ apex { "com.google.android.widevine-defaults", "com.google.android.widevine.lazy-key-defaults", ], - manifest: ":widevine_lazy_apex_manifest.json", + manifest: "apex_manifest.json", prebuilts: [ "com.google.android.widevine.lazy.rc", ], diff --git a/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json b/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json new file mode 100644 index 00000000..89d9fe75 --- /dev/null +++ b/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json @@ -0,0 +1,7 @@ +{ + "name": "com.google.android.widevine.lazy", + "version": 1, + "requireNativeLibs": [ + "liboemcrypto.so" + ] +} \ No newline at end of file diff --git a/libwvdrmengine/cdm/include/wv_android_constants.h b/libwvdrmengine/cdm/include/wv_android_constants.h index a617bd4b..bd49ea1b 100644 --- a/libwvdrmengine/cdm/include/wv_android_constants.h +++ b/libwvdrmengine/cdm/include/wv_android_constants.h @@ -11,7 +11,8 @@ namespace wvcdm { // Note: If you change this, make sure you also change // https://developers.google.com/widevine/drm/client/oemcrypto/compatibility -static const std::string kWVAndroidCdmVersion = "18.0.1"; +static const std::string kWVAndroidCdmVersion_18_0_1 = "18.0.1"; +static const std::string kWVAndroidCdmVersion_18_0_2 = "18.0.2"; } // namespace wvcdm diff --git a/libwvdrmengine/cdm/src/properties_android.cpp b/libwvdrmengine/cdm/src/properties_android.cpp index 64639b32..04afdd7e 100644 --- a/libwvdrmengine/cdm/src/properties_android.cpp +++ b/libwvdrmengine/cdm/src/properties_android.cpp @@ -4,7 +4,6 @@ #include "properties.h" #include "properties_configuration.h" -#include "wv_android_build_id.h" #include #include @@ -143,11 +142,19 @@ bool Properties::GetWVCdmVersion(std::string* version) { return false; } - *version = kWVAndroidCdmVersion; + std::string apex_version = ""; +#ifdef __ANDROID_APEX__ +{ + auto info = widevine::apex::GetApexInfo(); + apex_version = "@" + std::to_string(info->version); +} +#endif + if (mediadrm_flags::update_cdm_version_to_18_0_2()) { - (*version)[kWVAndroidCdmVersion.size() - 1] = '2'; + *version = kWVAndroidCdmVersion_18_0_2 + apex_version; + } else { + *version = kWVAndroidCdmVersion_18_0_1 + apex_version; } - *version = *version + "@" + WV_ANDROID_BUILD_ID; return true; } diff --git a/libwvdrmengine/wv-android-genrule.py b/libwvdrmengine/wv-android-genrule.py deleted file mode 100644 index 9e6194ad..00000000 --- a/libwvdrmengine/wv-android-genrule.py +++ /dev/null @@ -1,117 +0,0 @@ -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) From 2ba1b4237944f514baf8a390a125f482bd5540fc Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Wed, 6 Mar 2024 10:41:55 -0800 Subject: [PATCH 2/2] Widevine version genrules (2nd attempt) Bug: 327241925 Bug: 328438268 Test: dumpsys android.hardware.drm.IDrmFactory/widevine (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:6f038879372c8b49099edb9a35cfeddb5c9ae2d5) Merged-In: I0336f366910de9c4ea8903b09d64c32b8d68c977 Change-Id: I0336f366910de9c4ea8903b09d64c32b8d68c977 --- libwvdrmengine/Android.bp | 37 ++++++ libwvdrmengine/apex/Android.bp | 2 +- libwvdrmengine/apex/apex_manifest.json | 7 -- .../apex/nonupdatable/lazy/Android.bp | 2 +- .../apex/nonupdatable/lazy/apex_manifest.json | 7 -- .../cdm/include/wv_android_constants.h | 3 +- libwvdrmengine/cdm/src/properties_android.cpp | 15 +-- libwvdrmengine/wv-android-genrule.py | 117 ++++++++++++++++++ 8 files changed, 161 insertions(+), 29 deletions(-) delete mode 100644 libwvdrmengine/apex/apex_manifest.json delete mode 100644 libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json create mode 100644 libwvdrmengine/wv-android-genrule.py diff --git a/libwvdrmengine/Android.bp b/libwvdrmengine/Android.bp index 677c1ebd..1e0c5840 100644 --- a/libwvdrmengine/Android.bp +++ b/libwvdrmengine/Android.bp @@ -224,6 +224,10 @@ cc_library_static { "libutils_headers", ], + generated_headers: [ + "wv_android_build_id", + ], + shared_libs: [ "libbinder_ndk", "libcrypto", @@ -368,3 +372,36 @@ cc_fuzz { ], }, } + +python_binary_host { + name: "wv-android-genrule", + srcs: [ + "wv-android-genrule.py", + ], + version: { + py3: { + embedded_launcher: true, + }, + }, +} + +genrule { + name: "wv_android_build_id", + tools: ["wv-android-genrule"], + cmd: "$(location wv-android-genrule) build_id_header > $(out)", + out: ["wv_android_build_id.h"], +} + +genrule { + name: "widevine_apex_manifest.json", + tools: ["wv-android-genrule"], + cmd: "$(location wv-android-genrule) apex_manifest > $(out)", + out: ["gen_wv_apex_manifest.json"], +} + +genrule { + name: "widevine_lazy_apex_manifest.json", + tools: ["wv-android-genrule"], + cmd: "$(location wv-android-genrule) apex_manifest --name com.google.android.widevine.lazy > $(out)", + out: ["gen_wv_lazy_apex_manifest.json"], +} diff --git a/libwvdrmengine/apex/Android.bp b/libwvdrmengine/apex/Android.bp index 62a6171e..5edb0f38 100644 --- a/libwvdrmengine/apex/Android.bp +++ b/libwvdrmengine/apex/Android.bp @@ -77,7 +77,7 @@ widevine_key_apex_defaults { apex { name: "com.google.android.widevine", - manifest: "apex_manifest.json", + manifest: ":widevine_apex_manifest.json", prebuilts: [ "com.google.android.widevine.rc", "com.google.android.widevine.xml", // etc/vintf diff --git a/libwvdrmengine/apex/apex_manifest.json b/libwvdrmengine/apex/apex_manifest.json deleted file mode 100644 index 84f6795a..00000000 --- a/libwvdrmengine/apex/apex_manifest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "com.google.android.widevine", - "version": 1, - "requireNativeLibs": [ - "liboemcrypto.so" - ] -} \ No newline at end of file diff --git a/libwvdrmengine/apex/nonupdatable/lazy/Android.bp b/libwvdrmengine/apex/nonupdatable/lazy/Android.bp index eca4a55e..dff04551 100644 --- a/libwvdrmengine/apex/nonupdatable/lazy/Android.bp +++ b/libwvdrmengine/apex/nonupdatable/lazy/Android.bp @@ -57,7 +57,7 @@ apex { "com.google.android.widevine-defaults", "com.google.android.widevine.lazy-key-defaults", ], - manifest: "apex_manifest.json", + manifest: ":widevine_lazy_apex_manifest.json", prebuilts: [ "com.google.android.widevine.lazy.rc", ], diff --git a/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json b/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json deleted file mode 100644 index 89d9fe75..00000000 --- a/libwvdrmengine/apex/nonupdatable/lazy/apex_manifest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "com.google.android.widevine.lazy", - "version": 1, - "requireNativeLibs": [ - "liboemcrypto.so" - ] -} \ No newline at end of file diff --git a/libwvdrmengine/cdm/include/wv_android_constants.h b/libwvdrmengine/cdm/include/wv_android_constants.h index bd49ea1b..a617bd4b 100644 --- a/libwvdrmengine/cdm/include/wv_android_constants.h +++ b/libwvdrmengine/cdm/include/wv_android_constants.h @@ -11,8 +11,7 @@ namespace wvcdm { // Note: If you change this, make sure you also change // https://developers.google.com/widevine/drm/client/oemcrypto/compatibility -static const std::string kWVAndroidCdmVersion_18_0_1 = "18.0.1"; -static const std::string kWVAndroidCdmVersion_18_0_2 = "18.0.2"; +static const std::string kWVAndroidCdmVersion = "18.0.1"; } // namespace wvcdm diff --git a/libwvdrmengine/cdm/src/properties_android.cpp b/libwvdrmengine/cdm/src/properties_android.cpp index 04afdd7e..64639b32 100644 --- a/libwvdrmengine/cdm/src/properties_android.cpp +++ b/libwvdrmengine/cdm/src/properties_android.cpp @@ -4,6 +4,7 @@ #include "properties.h" #include "properties_configuration.h" +#include "wv_android_build_id.h" #include #include @@ -142,19 +143,11 @@ bool Properties::GetWVCdmVersion(std::string* version) { return false; } - std::string apex_version = ""; -#ifdef __ANDROID_APEX__ -{ - auto info = widevine::apex::GetApexInfo(); - apex_version = "@" + std::to_string(info->version); -} -#endif - + *version = kWVAndroidCdmVersion; if (mediadrm_flags::update_cdm_version_to_18_0_2()) { - *version = kWVAndroidCdmVersion_18_0_2 + apex_version; - } else { - *version = kWVAndroidCdmVersion_18_0_1 + apex_version; + (*version)[kWVAndroidCdmVersion.size() - 1] = '2'; } + *version = *version + "@" + WV_ANDROID_BUILD_ID; return true; } diff --git a/libwvdrmengine/wv-android-genrule.py b/libwvdrmengine/wv-android-genrule.py new file mode 100644 index 00000000..f1f28d1c --- /dev/null +++ b/libwvdrmengine/wv-android-genrule.py @@ -0,0 +1,117 @@ +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.so']) + 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)