Skip to content
This repository was archived by the owner on Jul 24, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 26 additions & 8 deletions Android.bp
Original file line number Diff line number Diff line change
@@ -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"],
Expand Down Expand Up @@ -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",
],
Expand All @@ -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",
}
30 changes: 30 additions & 0 deletions build/carrier_settings.go
Original file line number Diff line number Diff line change
@@ -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
}
85 changes: 52 additions & 33 deletions carriersettings_extractor.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,62 @@
#!/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"
)
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:
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions google_devices