tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

android.star (25474B)


      1 # -*- bazel-starlark -*-
      2 # Copyright 2023 The Chromium Authors
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 """Siso configuration for Android builds."""
      6 
      7 load("@builtin//encoding.star", "json")
      8 load("@builtin//lib/gn.star", "gn")
      9 load("@builtin//struct.star", "module")
     10 load("./config.star", "config")
     11 load("./gn_logs.star", "gn_logs")
     12 
     13 # TODO: crbug.com/323091468 - Propagate target android ABI and
     14 # android SDK version from GN, and remove the hardcoded filegroups.
     15 __archs = [
     16     "aarch64-linux-android",
     17     "arm-linux-androideabi",
     18     "i686-linux-android",
     19     "riscv64-linux-android",
     20     "x86_64-linux-android",
     21 ]
     22 
     23 def __enabled(ctx):
     24     if "args.gn" in ctx.metadata:
     25         gn_args = gn.args(ctx)
     26         if gn_args.get("target_os") == '"android"':
     27             return True
     28     return False
     29 
     30 def __filegroups(ctx):
     31     fg = {}
     32     for arch in __archs:
     33         api_level = gn_logs.read(ctx).get("android64_ndk_api_level")
     34         if api_level:
     35             group = "third_party/android_toolchain/ndk/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/%s/%s:link" % (arch, api_level)
     36             fg[group] = {
     37                 "type": "glob",
     38                 "includes": ["*"],
     39             }
     40     return fg
     41 
     42 def __step_config(ctx, step_config):
     43     remote_run = True  # Turn this to False when you do file access trace.
     44 
     45     # Run static analysis steps locally when build server is enabled.
     46     # https://chromium.googlesource.com/chromium/src/+/main/docs/android_build_instructions.md#asynchronous-static-analysis
     47     remote_run_static_analysis = True
     48     if "args.gn" in ctx.metadata:
     49         gn_args = gn.args(ctx)
     50         if gn_args.get("android_static_analysis") == '"build_server"':
     51             remote_run_static_analysis = False
     52 
     53     step_config["rules"].extend([
     54         # See also https://chromium.googlesource.com/chromium/src/build/+/HEAD/android/docs/java_toolchain.md
     55         {
     56             "name": "android/write_build_config",
     57             "command_prefix": "python3 ../../build/android/gyp/write_build_config.py",
     58             "handler": "android_write_build_config",
     59             "remote": remote_run,
     60             "canonicalize_dir": True,
     61             "timeout": "2m",
     62         },
     63         {
     64             "name": "android/ijar",
     65             "command_prefix": "python3 ../../build/android/gyp/ijar.py",
     66             "remote": remote_run,
     67             "canonicalize_dir": True,
     68             "timeout": "2m",
     69         },
     70         {
     71             "name": "android/turbine",
     72             "command_prefix": "python3 ../../build/android/gyp/turbine.py",
     73             "handler": "android_turbine",
     74             # TODO: crbug.com/396220357 - fix gn to remove unnecessary deps
     75             "exclude_input_patterns": [
     76                 "*.a",
     77                 "*.cc",
     78                 "*.cpp",
     79                 "*.h",
     80                 "*.html",
     81                 "*.inc",
     82                 "*.info",
     83                 "*.js",
     84                 "*.map",
     85                 "*.o",
     86                 "*.pak",
     87                 "*.proto",
     88                 "*.sql",
     89                 "*.stamp",
     90                 "*.svg",
     91                 "*.xml",
     92             ],
     93             "remote": remote_run,
     94             "platform_ref": "large",
     95             "canonicalize_dir": True,
     96             "timeout": "2m",
     97         },
     98         {
     99             "name": "android/compile_resources",
    100             "command_prefix": "python3 ../../build/android/gyp/compile_resources.py",
    101             "handler": "android_compile_resources",
    102             "exclude_input_patterns": [
    103                 "*.a",
    104                 "*.cc",
    105                 "*.h",
    106                 "*.inc",
    107                 "*.info",
    108                 "*.o",
    109                 "*.pak",
    110                 "*.sql",
    111             ],
    112             "remote": remote_run,
    113             "canonicalize_dir": True,
    114             "timeout": "5m",
    115         },
    116         {
    117             "name": "android/compile_java",
    118             "command_prefix": "python3 ../../build/android/gyp/compile_java.py",
    119             "handler": "android_compile_java",
    120             "exclude_input_patterns": [
    121                 "*.a",
    122                 "*.cc",
    123                 "*.h",
    124                 "*.inc",
    125                 "*.info",
    126                 "*.o",
    127                 "*.pak",
    128                 "*.sql",
    129             ],
    130             # Don't include files under --generated-dir.
    131             # This is probably optimization for local incrmental builds.
    132             # However, this is harmful for remote build cache hits.
    133             "ignore_extra_input_pattern": ".*srcjars.*\\.java",
    134             "ignore_extra_output_pattern": ".*srcjars.*\\.java",
    135             "remote": remote_run,
    136             "platform_ref": "large",
    137             "canonicalize_dir": True,
    138             "timeout": "2m",
    139         },
    140         {
    141             "name": "android/errorprone",
    142             "command_prefix": "python3 ../../build/android/gyp/errorprone.py",
    143             "handler": "android_compile_java",
    144             "exclude_input_patterns": [
    145                 "*.a",
    146                 "*.cc",
    147                 "*.h",
    148                 "*.inc",
    149                 "*.info",
    150                 "*.o",
    151                 "*.pak",
    152                 "*.sql",
    153             ],
    154             "remote": remote_run_static_analysis,
    155             "platform_ref": "large",
    156             "canonicalize_dir": True,
    157             "timeout": "2m",
    158         },
    159         {
    160             "name": "android/compile_kt",
    161             "command_prefix": "python3 ../../build/android/gyp/compile_kt.py",
    162             "handler": "android_compile_java",
    163             "exclude_input_patterns": [
    164                 "*.a",
    165                 "*.cc",
    166                 "*.h",
    167                 "*.inc",
    168                 "*.info",
    169                 "*.o",
    170                 "*.pak",
    171                 "*.sql",
    172             ],
    173             # Don't include files under --generated-dir.
    174             # This is probably optimization for local incrmental builds.
    175             # However, this is harmful for remote build cache hits.
    176             "ignore_extra_input_pattern": ".*srcjars.*\\.java",
    177             "ignore_extra_output_pattern": ".*srcjars.*\\.java",
    178             "remote": remote_run,
    179             "platform_ref": "large",
    180             "canonicalize_dir": True,
    181             "timeout": "2m",
    182         },
    183         {
    184             "name": "android/dex",
    185             "command_prefix": "python3 ../../build/android/gyp/dex.py",
    186             "handler": "android_dex",
    187             # TODO(crbug.com/40270798): include only required jar, dex files in GN config.
    188             "indirect_inputs": {
    189                 "includes": ["*.dex", "*.ijar.jar", "*.turbine.jar"],
    190             },
    191             "exclude_input_patterns": [
    192                 "*.a",
    193                 "*.cc",
    194                 "*.h",
    195                 "*.inc",
    196                 "*.info",
    197                 "*.o",
    198                 "*.pak",
    199                 "*.sql",
    200             ],
    201             # *.dex files are intermediate files used in incremental builds.
    202             # Fo remote actions, let's ignore them, assuming remote cache hits compensate.
    203             "ignore_extra_input_pattern": ".*\\.dex",
    204             "ignore_extra_output_pattern": ".*\\.dex",
    205             "remote": remote_run,
    206             "platform_ref": "large",
    207             "canonicalize_dir": True,
    208             "timeout": "2m",
    209         },
    210         {
    211             "name": "android/filter_zip",
    212             "command_prefix": "python3 ../../build/android/gyp/filter_zip.py",
    213             "remote": remote_run,
    214             "canonicalize_dir": True,
    215             "timeout": "2m",
    216         },
    217         {
    218             "name": "android/generate_resource_allowlist",
    219             "command_prefix": "python3 ../../tools/resources/generate_resource_allowlist.py",
    220             "indirect_inputs": {
    221                 "includes": ["*.o", "*.a"],
    222             },
    223             # When remote linking without bytes enabled, .o, .a files don't
    224             # exist on the local file system.
    225             # This step also should run remortely to avoid downloading them.
    226             "remote": config.get(ctx, "remote-link"),
    227             "platform_ref": "large",
    228             "canonicalize_dir": True,
    229             "timeout": "2m",
    230         },
    231         {
    232             "name": "android/trace_event_bytecode_rewriter",
    233             "command_prefix": "python3 ../../build/android/gyp/trace_event_bytecode_rewriter.py",
    234             "handler": "android_trace_event_bytecode_rewriter",
    235             "canonicalize_dir": True,
    236             "remote": remote_run,
    237             "platform_ref": "large",
    238             "timeout": "10m",
    239         },
    240         {
    241             "name": "android/proguard",
    242             "command_prefix": "python3 ../../build/android/gyp/proguard.py",
    243             "handler": "android_proguard",
    244             "exclude_input_patterns": [
    245                 "*.a",
    246                 "*.cc",
    247                 "*.h",
    248                 "*.inc",
    249                 "*.info",
    250                 "*.o",
    251                 "*.pak",
    252                 "*.sql",
    253             ],
    254             "canonicalize_dir": True,
    255             "remote": remote_run,
    256             "platform_ref": "large",
    257             "timeout": "10m",
    258         },
    259         {
    260             "name": "android/trace_references",
    261             "command_prefix": "python3 ../../build/android/gyp/tracereferences.py",
    262             "handler": "android_trace_references",
    263             "exclude_input_patterns": [
    264                 "*.a",
    265                 "*.cc",
    266                 "*.h",
    267                 "*.inc",
    268                 "*.info",
    269                 "*.o",
    270                 "*.pak",
    271                 "*.sql",
    272             ],
    273             "canonicalize_dir": True,
    274             "remote": remote_run_static_analysis,
    275             "platform_ref": "large",
    276             "timeout": "10m",
    277         },
    278     ])
    279     return step_config
    280 
    281 def __filearg(ctx, arg):
    282     fn = ""
    283     if arg.startswith("@FileArg("):
    284         f = arg.removeprefix("@FileArg(").removesuffix(")").split(":")
    285         fn = f[0].removesuffix("[]")  # [] suffix controls expand list?
    286         v = json.decode(str(ctx.fs.read(ctx.fs.canonpath(fn))))
    287         for k in f[1:]:
    288             v = v[k]
    289         arg = v
    290     if type(arg) == "string":
    291         if arg.startswith("["):
    292             return fn, json.decode(arg)
    293         return fn, [arg]
    294     return fn, arg
    295 
    296 def __android_compile_resources_handler(ctx, cmd):
    297     # Script:
    298     #   https://crsrc.org/c/build/android/gyp/compile_resources.py
    299     # GN Config:
    300     #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=2163;drc=1b15af251f8a255e44f2e3e3e7990e67e87dcc3b
    301     #   https://crsrc.org/c/build/config/android/system_image.gni;l=58;drc=39debde76e509774287a655285d8556a9b8dc634
    302     # Sample args:
    303     #   --aapt2-path ../../third_party/android_build_tools/aapt2/cipd/aapt2
    304     #   --android-manifest gen/chrome/android/trichrome_library_system_stub_apk__manifest.xml
    305     #   --arsc-package-name=org.chromium.trichromelibrary
    306     #   --arsc-path obj/chrome/android/trichrome_library_system_stub_apk.ap_
    307     #   --debuggable
    308     #   --dependencies-res-zip-overlays=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:dependency_zip_overlays\)
    309     #   --dependencies-res-zips=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:dependency_zips\)
    310     #   --depfile gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.d
    311     #   --emit-ids-out=gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.resource_ids
    312     #   --extra-res-packages=@FileArg\(gen/chrome/android/webapk/shell_apk/maps_go_webapk.build_config.json:deps_info:extra_package_names\)
    313     #   --include-resources(=)../../third_party/android_sdk/public/platforms/android-34/android.jar
    314     #   --info-path obj/chrome/android/webapk/shell_apk/maps_go_webapk.ap_.info
    315     #   --min-sdk-version=24
    316     #   --proguard-file obj/chrome/android/webapk/shell_apk/maps_go_webapk/maps_go_webapk.resources.proguard.txt
    317     #   --r-text-out gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources_R.txt
    318     #   --rename-manifest-package=org.chromium.trichromelibrary
    319     #   --srcjar-out gen/chrome/android/webapk/shell_apk/maps_go_webapk__compile_resources.srcjar
    320     #   --target-sdk-version=33
    321     #   --version-code 1
    322     #   --version-name Developer\ Build
    323     #   --webp-cache-dir=obj/android-webp-cache
    324     inputs = []
    325     for i, arg in enumerate(cmd.args):
    326         for k in ["--dependencies-res-zips=", "--dependencies-res-zip-overlays=", "--extra-res-packages="]:
    327             if arg.startswith(k):
    328                 arg = arg.removeprefix(k)
    329                 _, v = __filearg(ctx, arg)
    330                 for f in v:
    331                     f = ctx.fs.canonpath(f)
    332                     inputs.append(f)
    333                     if k == "--dependencies-res-zips=" and ctx.fs.exists(f + ".info"):
    334                         inputs.append(f + ".info")
    335 
    336     ctx.actions.fix(
    337         inputs = cmd.inputs + inputs,
    338     )
    339 
    340 def __android_compile_java_handler(ctx, cmd):
    341     # Script:
    342     #   https://crsrc.org/c/build/android/gyp/compile_java.py
    343     # GN Config:
    344     #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=2995;drc=775b3a9ebccd468c79592dad43ef46632d3a411f
    345     # Sample args:
    346     #   --depfile=gen/chrome/android/chrome_test_java__compile_java.d
    347     #   --generated-dir=gen/chrome/android/chrome_test_java/generated_java
    348     #   --jar-path=obj/chrome/android/chrome_test_java.javac.jar
    349     #   --java-srcjars=\[\"gen/chrome/browser/tos_dialog_behavior_generated_enum.srcjar\",\ \"gen/chrome/android/chrome_test_java__assetres.srcjar\",\ \"gen/chrome/android/chrome_test_java.generated.srcjar\"\]
    350     #   --target-name //chrome/android:chrome_test_java__compile_java
    351     #   --classpath=@FileArg\(gen/chrome/android/chrome_test_java.build_config.json:android:sdk_interface_jars\)
    352     #   --header-jar obj/chrome/android/chrome_test_java.turbine.jar
    353     #   --classpath=\[\"obj/chrome/android/chrome_test_java.turbine.jar\"\]
    354     #   --classpath=@FileArg\(gen/chrome/android/chrome_test_java.build_config.json:deps_info:javac_full_interface_classpath\)
    355     #   --kotlin-jar-path=obj/chrome/browser/tabmodel/internal/java.kotlinc.jar
    356     #   --chromium-code=1
    357     #   --warnings-as-errors
    358     #   --jar-info-exclude-globs=\[\"\*/R.class\",\ \"\*/R\\\$\*.class\",\ \"\*/Manifest.class\",\ \"\*/Manifest\\\$\*.class\",\ \"\*/\*GEN_JNI.class\"\]
    359     #   --enable-errorprone
    360     #   @gen/chrome/android/chrome_test_java.sources
    361 
    362     out = cmd.outputs[0]
    363     outputs = [
    364         out + ".md5.stamp",
    365     ]
    366 
    367     inputs = []
    368     for i, arg in enumerate(cmd.args):
    369         for k in ["--classpath=", "--bootclasspath=", "--processorpath="]:
    370             if arg.startswith(k):
    371                 arg = arg.removeprefix(k)
    372                 fn, v = __filearg(ctx, arg)
    373                 if fn:
    374                     inputs.append(ctx.fs.canonpath(fn))
    375                 for f in v:
    376                     f, _, _ = f.partition(":")
    377                     inputs.append(ctx.fs.canonpath(f))
    378 
    379     ctx.actions.fix(
    380         inputs = cmd.inputs + inputs,
    381         outputs = cmd.outputs + outputs,
    382     )
    383 
    384 def __android_dex_handler(ctx, cmd):
    385     out = cmd.outputs[0]
    386     inputs = []
    387 
    388     # Add __dex.desugardeps to the outputs.
    389     outputs = [
    390         out + ".md5.stamp",
    391     ]
    392     for i, arg in enumerate(cmd.args):
    393         if arg == "--desugar-dependencies":
    394             outputs.append(ctx.fs.canonpath(cmd.args[i + 1]))
    395         for k in ["--class-inputs=", "--bootclasspath=", "--classpath=", "--class-inputs-filearg=", "--dex-inputs-filearg="]:
    396             if arg.startswith(k):
    397                 arg = arg.removeprefix(k)
    398                 _, v = __filearg(ctx, arg)
    399                 for f in v:
    400                     f, _, _ = f.partition(":")
    401                     f = ctx.fs.canonpath(f)
    402                     inputs.append(f)
    403 
    404     # TODO: dex.py takes --incremental-dir to reuse the .dex produced in a previous build.
    405     # Should remote dex action also take this?
    406     ctx.actions.fix(
    407         inputs = cmd.inputs + inputs,
    408         outputs = cmd.outputs + outputs,
    409     )
    410 
    411 def __android_trace_event_bytecode_rewriter(ctx, cmd):
    412     # Sample command:
    413     # python3 ../../build/android/gyp/trace_event_bytecode_rewriter.py \
    414     #   --stamp obj/chrome/android/trichrome_chrome_bundle.trace_event_rewrite.stamp \
    415     #   --depfile gen/chrome/android/trichrome_chrome_bundle__trace_event_rewritten.d \
    416     #   --script bin/helper/trace_event_adder \
    417     #   --classpath @FileArg\(gen/chrome/android/trichrome_chrome_bundle.build_config.json:android:sdk_jars\) \
    418     #   --input-jars @FileArg\(gen/chrome/android/trichrome_chrome_bundle.build_config.json:deps_info:device_classpath\) \
    419     #   --output-jars @FileArg\(gen/chrome/android/trichrome_chrome_bundle.build_config.json:deps_info:trace_event_rewritten_device_classpath\)
    420     inputs = []
    421     outputs = []
    422     script = ""
    423     for i, arg in enumerate(cmd.args):
    424         if arg in ["--input-jars", "--classpath"]:
    425             fn, v = __filearg(ctx, cmd.args[i + 1])
    426             if fn:
    427                 inputs.append(ctx.fs.canonpath(fn))
    428             for f in v:
    429                 f, _, _ = f.partition(":")
    430                 inputs.append(ctx.fs.canonpath(f))
    431             continue
    432         if arg == "--output-jars":
    433             fn, v = __filearg(ctx, cmd.args[i + 1])
    434             if fn:
    435                 inputs.append(ctx.fs.canonpath(fn))
    436             for f in v:
    437                 f, _, _ = f.partition(":")
    438                 outputs.append(ctx.fs.canonpath(f))
    439             continue
    440         if arg == "--script":
    441             script = cmd.args[i + 1]
    442             continue
    443 
    444     # Find runtime jars for trace_event_adder
    445     if script == "bin/helper/trace_event_adder":
    446         trace_event_adder_json = json.decode(
    447             str(ctx.fs.read(ctx.fs.canonpath("gen/build/android/bytecode/trace_event_adder.build_config.json"))),
    448         )
    449         for path in trace_event_adder_json.get("deps_info", {}).get("host_classpath", []):
    450             inputs.append(ctx.fs.canonpath(path))
    451 
    452     ctx.actions.fix(
    453         inputs = cmd.inputs + inputs,
    454         outputs = cmd.outputs + outputs,
    455     )
    456 
    457 def __android_proguard_handler(ctx, cmd):
    458     inputs = []
    459     outputs = []
    460     for i, arg in enumerate(cmd.args):
    461         for k in ["--proguard-configs=", "--input-paths=", "--feature-jars="]:
    462             if arg.startswith(k):
    463                 arg = arg.removeprefix(k)
    464                 fn, v = __filearg(ctx, arg)
    465                 if fn:
    466                     inputs.append(ctx.fs.canonpath(fn))
    467                 for f in v:
    468                     f, _, _ = f.partition(":")
    469                     inputs.append(ctx.fs.canonpath(f))
    470                 break
    471         if arg in ["--sdk-jars", "--sdk-extension-jars"]:
    472             fn, v = __filearg(ctx, cmd.args[i + 1])
    473             if fn:
    474                 inputs.append(ctx.fs.canonpath(fn))
    475             for f in v:
    476                 f, _, _ = f.partition(":")
    477                 inputs.append(ctx.fs.canonpath(f))
    478             continue
    479         if arg.startswith("--dex-dest="):
    480             arg = arg.removeprefix("--dex-dest=")
    481             fn, v = __filearg(ctx, arg)
    482             if fn:
    483                 inputs.append(ctx.fs.canonpath(fn))
    484             for f in v:
    485                 f, _, _ = f.partition(":")
    486                 outputs.append(ctx.fs.canonpath(f))
    487             continue
    488 
    489     ctx.actions.fix(
    490         inputs = cmd.inputs + inputs,
    491         outputs = cmd.outputs + outputs,
    492     )
    493 
    494 def __android_trace_references_handler(ctx, cmd):
    495     # Sample command:
    496     # python3 ../../build/android/gyp/tracereferences.py \
    497     #   --depfile gen/chrome/android/monochrome_public_bundle__dex.d \
    498     #   --tracerefs-json gen/chrome/android/monochrome_public_bundle__dex.tracerefs.json \
    499     #   --stamp obj/chrome/android/monochrome_public_bundle__dex.tracereferences.stamp --warnings-as-errors
    500     # Sample tracerefs.json:
    501     # {
    502     #   "r8jar": "../../third_party/r8/cipd/lib/r8.jar",
    503     #   "libs": [
    504     #     "../../clank/third_party/android_system_sdk/src/android_system.jar",
    505     #     "../../third_party/android_sdk/xr_extensions/com.android.extensions.xr.jar",
    506     #     "obj/third_party/android_sdk/window_extensions/androidx_window_extensions_java.javac.jar"
    507     #   ],
    508     #   "jobs": [
    509     #     {
    510     #       "name": "",
    511     #       "jars": [
    512     #         "obj/chrome/android/monochrome_public_bundle__base_bundle_module/monochrome_public_bundle__base_bundle_module.r8dex.jar",
    513     #         "obj/chrome/android/monochrome_public_bundle__chrome_bundle_module/monochrome_public_bundle__chrome_bundle_module.r8dex.jar",
    514     #         "obj/chrome/android/monochrome_public_bundle__dev_ui_bundle_module/monochrome_public_bundle__dev_ui_bundle_module.r8dex.jar",
    515     #         "obj/chrome/android/monochrome_public_bundle__stack_unwinder_bundle_module/monochrome_public_bundle__stack_unwinder_bundle_module.r8dex.jar",
    516     #         "obj/chrome/android/monochrome_public_bundle__test_dummy_bundle_module/monochrome_public_bundle__test_dummy_bundle_module.r8dex.jar"
    517     #       ]
    518     #     },
    519     #     {
    520     #       "name": "base",
    521     #       "jars": [
    522     #         "obj/chrome/android/monochrome_public_bundle__base_bundle_module/monochrome_public_bundle__base_bundle_module.r8dex.jar"
    523     #       ]
    524     #     }
    525     #   ]
    526     # }
    527     inputs = []
    528     for i, arg in enumerate(cmd.args):
    529         if arg == "--tracerefs-json":
    530             tracerefs_json = json.decode(str(ctx.fs.read(ctx.fs.canonpath(cmd.args[i + 1]))))
    531             break
    532 
    533     for lib in tracerefs_json.get("libs", []):
    534         inputs.append(ctx.fs.canonpath(lib))
    535     for job in tracerefs_json.get("jobs", []):
    536         for jar in job.get("jars", ""):
    537             inputs.append(ctx.fs.canonpath(jar))
    538 
    539     ctx.actions.fix(
    540         inputs = cmd.inputs + inputs,
    541     )
    542 
    543 def __android_turbine_handler(ctx, cmd):
    544     inputs = []
    545     for i, arg in enumerate(cmd.args):
    546         for k in ["--classpath=", "--processorpath="]:
    547             if arg.startswith(k):
    548                 arg = arg.removeprefix(k)
    549                 _, v = __filearg(ctx, arg)
    550                 for f in v:
    551                     f, _, _ = f.partition(":")
    552                     inputs.append(ctx.fs.canonpath(f))
    553 
    554     ctx.actions.fix(
    555         inputs = cmd.inputs + inputs,
    556     )
    557 
    558 def __deps_configs(ctx, f, seen, inputs):
    559     if f in seen:
    560         return
    561     seen[f] = True
    562     inputs.append(f)
    563     v = json.decode(str(ctx.fs.read(f)))
    564     for f in v["deps_info"]["deps_configs"]:
    565         f = ctx.fs.canonpath(f)
    566         __deps_configs(ctx, f, seen, inputs)
    567     if "public_deps_configs" in v["deps_info"]:
    568         for f in v["deps_info"]["public_deps_configs"]:
    569             f = ctx.fs.canonpath(f)
    570             __deps_configs(ctx, f, seen, inputs)
    571 
    572 def __android_write_build_config_handler(ctx, cmd):
    573     # Script:
    574     #   https://crsrc.org/c/build/android/gyp/write_build_config.py
    575     # GN Config:
    576     #   https://crsrc.org/c/build/config/android/internal_rules.gni;l=122;drc=99e4f79301e108ea3d27ec84320f430490382587
    577     # Sample args:
    578     #   --type=java_library
    579     #   --depfile gen/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm_java__build_config_crbug_908819.d
    580     #   --deps-configs=\[\"gen/third_party/kotlin_stdlib/kotlin_stdlib_java.build_config.json\"\]
    581     #   --public-deps-configs=\[\]
    582     #   --build-config gen/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm_java.build_config.json
    583     #   --gn-target //third_party/android_deps:org_jetbrains_kotlinx_kotlinx_metadata_jvm_java
    584     #   --non-chromium-code
    585     #   --host-jar-path lib.java/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm.jar
    586     #   --unprocessed-jar-path ../../third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/kotlinx-metadata-jvm-0.1.0.jar
    587     #   --interface-jar-path obj/third_party/android_deps/org_jetbrains_kotlinx_kotlinx_metadata_jvm.ijar.jar
    588     #   --is-prebuilt
    589     #   --bundled-srcjars=\[\]
    590     inputs = []
    591     seen = {}
    592     for i, arg in enumerate(cmd.args):
    593         if arg in ["--shared-libraries-runtime-deps", "--secondary-abi-shared-libraries-runtime-deps"]:
    594             inputs.append(ctx.fs.canonpath(cmd.args[i + 1]))
    595             continue
    596         if arg == "--tested-apk-config":
    597             f = ctx.fs.canonpath(cmd.args[i + 1])
    598             __deps_configs(ctx, f, seen, inputs)
    599             continue
    600         for k in ["--deps-configs=", "--public-deps-configs=", "--annotation-processor-configs="]:
    601             if arg.startswith(k):
    602                 arg = arg.removeprefix(k)
    603                 v = json.decode(arg)
    604                 for f in v:
    605                     f = ctx.fs.canonpath(f)
    606                     __deps_configs(ctx, f, seen, inputs)
    607 
    608     ctx.actions.fix(inputs = cmd.inputs + inputs)
    609 
    610 __handlers = {
    611     "android_compile_java": __android_compile_java_handler,
    612     "android_compile_resources": __android_compile_resources_handler,
    613     "android_dex": __android_dex_handler,
    614     "android_trace_event_bytecode_rewriter": __android_trace_event_bytecode_rewriter,
    615     "android_proguard": __android_proguard_handler,
    616     "android_trace_references": __android_trace_references_handler,
    617     "android_turbine": __android_turbine_handler,
    618     "android_write_build_config": __android_write_build_config_handler,
    619 }
    620 
    621 android = module(
    622     "android",
    623     enabled = __enabled,
    624     archs = __archs,
    625     step_config = __step_config,
    626     filegroups = __filegroups,
    627     handlers = __handlers,
    628 )