diff --git a/Android.bp b/Android.bp index bb3107d..3609c1b 100644 --- a/Android.bp +++ b/Android.bp @@ -1,6 +1,19 @@ soong_namespace { } +bootstrap_go_package { + name: "soong-carrier_settings", + pkgPath: "android/soong/carrier_settings", + deps: [ + "soong-android", + "soong-genrule", + ], + srcs: [ + "build/carrier_settings.go", + ], + pluginFor: ["soong_build"], +} + python_binary_host { name: "carriersettings_extractor", defaults: ["carrier_extractor_defaults"], @@ -34,19 +47,24 @@ python_library_host { }, } -genrule { - name: "carrier_extraction-apn", +carrier_settings_genrule_defaults { + name: "carrier_settings_defaults", tools: ["carriersettings_extractor"], - cmd: "$(location carriersettings_extractor) vendor/google_devices/$$TARGET_PRODUCT/proprietary/product/etc/CarrierSettings/ . $(genDir)/apns-conf.xml $(genDir)/carrierconfig-vendor.xml $$TARGET_PRODUCT", +} + +genrule { + name: "apns_config", + defaults: ["carrier_settings_defaults"], + cmd: "$(location) --pb_files $(in) --apn_out $(out)", out: [ "apns-conf.xml", ], } genrule { - name: "carrier_extraction-cc", - tools: ["carriersettings_extractor"], - cmd: "$(location carriersettings_extractor) vendor/google_devices/$$TARGET_PRODUCT/proprietary/product/etc/CarrierSettings/ . $(genDir)/apns-conf.xml $(genDir)/carrierconfig-vendor.xml $$TARGET_PRODUCT", + name: "carrier_config", + defaults: ["carrier_settings_defaults"], + cmd: "$(location) --pb_files $(in) --cc_out $(out)", out: [ "carrierconfig-vendor.xml", ], @@ -56,12 +74,12 @@ prebuilt_etc { name: "extracted-apns", filename: "apns-conf.xml", product_specific: true, - src: ":carrier_extraction-apn", + src: ":apns_config", } prebuilt_etc { name: "extracted-carrierconfig", filename: "carrierconfig-vendor.xml", product_specific: true, - src: ":carrier_extraction-cc", + src: ":carrier_config", } diff --git a/build/carrier_settings.go b/build/carrier_settings.go new file mode 100644 index 0000000..5be235c --- /dev/null +++ b/build/carrier_settings.go @@ -0,0 +1,30 @@ +package carrier_settings + +import ( + "path" + + "android/soong/android" + "android/soong/genrule" +) + +func carrierSettingsGenRuleDefaults(ctx android.LoadHookContext) { + type props struct { + Srcs []string + } + + p := &props{} + p.Srcs = []string{path.Join("google_devices", ctx.Config().DeviceName(), "proprietary/product/etc/CarrierSettings/*.pb")} + + ctx.AppendProperties(p) +} + +func init() { + android.RegisterModuleType("carrier_settings_genrule_defaults", carrierSettingsGenRuleDefaultsFactory) +} + +func carrierSettingsGenRuleDefaultsFactory() android.Module { + module := genrule.DefaultsFactory() + android.AddLoadHook(module, carrierSettingsGenRuleDefaults) + + return module +} diff --git a/carriersettings_extractor.py b/carriersettings_extractor.py index a3ef132..d3ba60f 100755 --- a/carriersettings_extractor.py +++ b/carriersettings_extractor.py @@ -1,26 +1,54 @@ #!/usr/bin/env python3 +import sys +from argparse import ArgumentParser from collections import OrderedDict -from glob import glob from itertools import product -import os.path -import sys +from os import devnull, getcwd, getenv +from pathlib import Path from xml.etree import ElementTree as ET from xml.sax.saxutils import escape, quoteattr -from carrier_settings_pb2 import CarrierSettings, MultiCarrierSettings from carrier_list_pb2 import CarrierList +from carrier_settings_pb2 import CarrierSettings, MultiCarrierSettings from carrierId_pb2 import CarrierList as CarrierIdList -pb_path = sys.argv[1] - -android_build_top = sys.argv[2] - -apn_out = sys.argv[3] +parser = ArgumentParser() +parser.add_argument( + "--pb_files", + required=True, + nargs="+", + help="path to carrier setting protobufs", +) +parser.add_argument("--apn_out", default=None, help="path to apn config output") +parser.add_argument("--cc_out", default=None, help="path to carrier config output") + +args = parser.parse_args() + +pb_files = set() +# carrier_list.pb and others.pb are handled separately. +carrier_list_pb_path = None +others_pb_path = None +for pb_file in args.pb_files: + pb_path = Path(pb_file).resolve() + if pb_path.name == "carrier_list.pb": + carrier_list_pb_path = pb_path + elif pb_path.name == "others.pb": + others_pb_path = pb_path + else: + pb_files.add(pb_path) -cc_out = sys.argv[4] +apn_out = args.apn_out +cc_out = args.cc_out +if apn_out is None and cc_out is None: + parser.error("at least one of --apn_out or --cc_out is required") +apn_out = apn_out or devnull +cc_out = cc_out or devnull -device = sys.argv[5] +android_build_top = getenv("ANDROID_BUILD_TOP", getcwd()) +device = getenv("TARGET_PRODUCT") +if device is None: + raise RuntimeError("TARGET_PRODUCT environment variable must be set") android_path_to_carrierid = ( "packages/providers/TelephonyProvider/assets/latest_carrier_id" @@ -28,7 +56,7 @@ carrier_id_list = CarrierIdList() carrier_attribute_map = {} with open( - os.path.join(android_build_top, android_path_to_carrierid, "carrier_list.pb"), "rb" + Path(android_build_top, android_path_to_carrierid, "carrier_list.pb"), "rb" ) as pb: carrier_id_list.ParseFromString(pb.read()) for carrier_id_obj in carrier_id_list.carrier_id: @@ -52,32 +80,23 @@ carrier_list = CarrierList() all_settings = {} -carrier_list.ParseFromString( - open(os.path.join(pb_path, "carrier_list.pb"), "rb").read() -) +carrier_list.ParseFromString(open(carrier_list_pb_path, "rb").read()) # Load generic settings first multi_settings = MultiCarrierSettings() -multi_settings.ParseFromString(open(os.path.join(pb_path, "others.pb"), "rb").read()) +multi_settings.ParseFromString(open(others_pb_path, "rb").read()) for setting in multi_settings.setting: all_settings[setting.canonical_name] = setting # Load carrier specific files last, to allow overriding generic settings -for filename in glob(os.path.join(pb_path, "*.pb")): - with open(filename, "rb") as pb: - if os.path.basename(filename) == "carrier_list.pb": - # Handled above already - continue - elif os.path.basename(filename) == "others.pb": - # Handled above already - continue - else: - setting = CarrierSettings() - setting.ParseFromString(pb.read()) - if setting.canonical_name in all_settings: - print( - "Overriding generic settings for " + setting.canonical_name, - file=sys.stderr, - ) - all_settings[setting.canonical_name] = setting +for filepath in pb_files: + with open(filepath, "rb") as pb: + setting = CarrierSettings() + setting.ParseFromString(pb.read()) + if setting.canonical_name in all_settings: + print( + "Overriding generic settings for " + setting.canonical_name, + file=sys.stderr, + ) + all_settings[setting.canonical_name] = setting # Unfortunately, python processors like xml and lxml, as well as command-line diff --git a/google_devices b/google_devices new file mode 120000 index 0000000..347ebcc --- /dev/null +++ b/google_devices @@ -0,0 +1 @@ +../google_devices \ No newline at end of file