1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "encoding/gob" 19*333d2b36SAndroid Build Coastguard Worker "fmt" 20*333d2b36SAndroid Build Coastguard Worker "path/filepath" 21*333d2b36SAndroid Build Coastguard Worker "reflect" 22*333d2b36SAndroid Build Coastguard Worker "slices" 23*333d2b36SAndroid Build Coastguard Worker "strconv" 24*333d2b36SAndroid Build Coastguard Worker "strings" 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 27*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 28*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 29*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 32*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 33*333d2b36SAndroid Build Coastguard Worker "android/soong/java/config" 34*333d2b36SAndroid Build Coastguard Worker) 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker// This file contains the definition and the implementation of the base module that most 37*333d2b36SAndroid Build Coastguard Worker// source-based Java module structs embed. 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker// TODO: 40*333d2b36SAndroid Build Coastguard Worker// Autogenerated files: 41*333d2b36SAndroid Build Coastguard Worker// Renderscript 42*333d2b36SAndroid Build Coastguard Worker// Post-jar passes: 43*333d2b36SAndroid Build Coastguard Worker// Proguard 44*333d2b36SAndroid Build Coastguard Worker// Rmtypedefs 45*333d2b36SAndroid Build Coastguard Worker// DroidDoc 46*333d2b36SAndroid Build Coastguard Worker// Findbugs 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker// Properties that are common to most Java modules, i.e. whether it's a host or device module. 49*333d2b36SAndroid Build Coastguard Workertype CommonProperties struct { 50*333d2b36SAndroid Build Coastguard Worker // list of source files used to compile the Java module. May be .java, .kt, .logtags, .proto, 51*333d2b36SAndroid Build Coastguard Worker // or .aidl files. 52*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Worker // list Kotlin of source files containing Kotlin code that should be treated as common code in 55*333d2b36SAndroid Build Coastguard Worker // a codebase that supports Kotlin multiplatform. See 56*333d2b36SAndroid Build Coastguard Worker // https://kotlinlang.org/docs/reference/multiplatform.html. May be only be .kt files. 57*333d2b36SAndroid Build Coastguard Worker Common_srcs []string `android:"path,arch_variant"` 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker // list of source files that should not be used to build the Java module. 60*333d2b36SAndroid Build Coastguard Worker // This is most useful in the arch/multilib variants to remove non-common files 61*333d2b36SAndroid Build Coastguard Worker Exclude_srcs []string `android:"path,arch_variant"` 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker // list of directories containing Java resources 64*333d2b36SAndroid Build Coastguard Worker Java_resource_dirs []string `android:"arch_variant"` 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker // list of directories that should be excluded from java_resource_dirs 67*333d2b36SAndroid Build Coastguard Worker Exclude_java_resource_dirs []string `android:"arch_variant"` 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker // list of files to use as Java resources 70*333d2b36SAndroid Build Coastguard Worker Java_resources proptools.Configurable[[]string] `android:"path,arch_variant"` 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker // list of files that should be excluded from java_resources and java_resource_dirs 73*333d2b36SAndroid Build Coastguard Worker Exclude_java_resources []string `android:"path,arch_variant"` 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker // Same as java_resources, but modules added here will use the device variant. Can be useful 76*333d2b36SAndroid Build Coastguard Worker // for making a host test that tests the contents of a device built app. 77*333d2b36SAndroid Build Coastguard Worker Device_common_java_resources proptools.Configurable[[]string] `android:"path_device_common"` 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker // Same as java_resources, but modules added here will use the device's os variant and the 80*333d2b36SAndroid Build Coastguard Worker // device's first architecture variant. Can be useful for making a host test that tests the 81*333d2b36SAndroid Build Coastguard Worker // contents of a native device built app. 82*333d2b36SAndroid Build Coastguard Worker Device_first_java_resources proptools.Configurable[[]string] `android:"path_device_first"` 83*333d2b36SAndroid Build Coastguard Worker 84*333d2b36SAndroid Build Coastguard Worker // list of module-specific flags that will be used for javac compiles 85*333d2b36SAndroid Build Coastguard Worker Javacflags []string `android:"arch_variant"` 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker // list of module-specific flags that will be used for kotlinc compiles 88*333d2b36SAndroid Build Coastguard Worker Kotlincflags []string `android:"arch_variant"` 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker // list of java libraries that will be in the classpath 91*333d2b36SAndroid Build Coastguard Worker Libs []string `android:"arch_variant"` 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Worker // list of java libraries that will be compiled into the resulting jar 94*333d2b36SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] `android:"arch_variant"` 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker // manifest file to be included in resulting jar 97*333d2b36SAndroid Build Coastguard Worker Manifest *string `android:"path"` 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker // if not blank, run jarjar using the specified rules file 100*333d2b36SAndroid Build Coastguard Worker Jarjar_rules *string `android:"path,arch_variant"` 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker // java class names to rename with jarjar when a reverse dependency has a jarjar_prefix 103*333d2b36SAndroid Build Coastguard Worker // property. 104*333d2b36SAndroid Build Coastguard Worker Jarjar_rename []string 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker // if not blank, used as prefix to generate repackage rule 107*333d2b36SAndroid Build Coastguard Worker Jarjar_prefix *string 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker // If not blank, set the java version passed to javac as -source and -target 110*333d2b36SAndroid Build Coastguard Worker Java_version *string 111*333d2b36SAndroid Build Coastguard Worker 112*333d2b36SAndroid Build Coastguard Worker // If set to true, allow this module to be dexed and installed on devices. Has no 113*333d2b36SAndroid Build Coastguard Worker // effect on host modules, which are always considered installable. 114*333d2b36SAndroid Build Coastguard Worker Installable *bool 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker // If set to true, include sources used to compile the module in to the final jar 117*333d2b36SAndroid Build Coastguard Worker Include_srcs *bool 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker // If not empty, classes are restricted to the specified packages and their sub-packages. 120*333d2b36SAndroid Build Coastguard Worker // This restriction is checked after applying jarjar rules and including static libs. 121*333d2b36SAndroid Build Coastguard Worker Permitted_packages []string 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker // List of modules to use as annotation processors 124*333d2b36SAndroid Build Coastguard Worker Plugins []string 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker // List of modules to use as kotlin plugin 127*333d2b36SAndroid Build Coastguard Worker Kotlin_plugins []string 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Worker // List of modules to export to libraries that directly depend on this library as annotation 130*333d2b36SAndroid Build Coastguard Worker // processors. Note that if the plugins set generates_api: true this will disable the turbine 131*333d2b36SAndroid Build Coastguard Worker // optimization on modules that depend on this module, which will reduce parallelism and cause 132*333d2b36SAndroid Build Coastguard Worker // more recompilation. 133*333d2b36SAndroid Build Coastguard Worker Exported_plugins []string 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker // The number of Java source entries each Javac instance can process 136*333d2b36SAndroid Build Coastguard Worker Javac_shard_size *int64 137*333d2b36SAndroid Build Coastguard Worker 138*333d2b36SAndroid Build Coastguard Worker // Add host jdk tools.jar to bootclasspath 139*333d2b36SAndroid Build Coastguard Worker Use_tools_jar *bool 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker Openjdk9 struct { 142*333d2b36SAndroid Build Coastguard Worker // List of source files that should only be used when passing -source 1.9 or higher 143*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path"` 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker // List of javac flags that should only be used when passing -source 1.9 or higher 146*333d2b36SAndroid Build Coastguard Worker Javacflags []string 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker // When compiling language level 9+ .java code in packages that are part of 150*333d2b36SAndroid Build Coastguard Worker // a system module, patch_module names the module that your sources and 151*333d2b36SAndroid Build Coastguard Worker // dependencies should be patched into. The Android runtime currently 152*333d2b36SAndroid Build Coastguard Worker // doesn't implement the JEP 261 module system so this option is only 153*333d2b36SAndroid Build Coastguard Worker // supported at compile time. It should only be needed to compile tests in 154*333d2b36SAndroid Build Coastguard Worker // packages that exist in libcore and which are inconvenient to move 155*333d2b36SAndroid Build Coastguard Worker // elsewhere. 156*333d2b36SAndroid Build Coastguard Worker Patch_module *string 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker Jacoco struct { 159*333d2b36SAndroid Build Coastguard Worker // List of classes to include for instrumentation with jacoco to collect coverage 160*333d2b36SAndroid Build Coastguard Worker // information at runtime when building with coverage enabled. If unset defaults to all 161*333d2b36SAndroid Build Coastguard Worker // classes. 162*333d2b36SAndroid Build Coastguard Worker // Supports '*' as the last character of an entry in the list as a wildcard match. 163*333d2b36SAndroid Build Coastguard Worker // If preceded by '.' it matches all classes in the package and subpackages, otherwise 164*333d2b36SAndroid Build Coastguard Worker // it matches classes in the package that have the class name as a prefix. 165*333d2b36SAndroid Build Coastguard Worker Include_filter []string 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker // List of classes to exclude from instrumentation with jacoco to collect coverage 168*333d2b36SAndroid Build Coastguard Worker // information at runtime when building with coverage enabled. Overrides classes selected 169*333d2b36SAndroid Build Coastguard Worker // by the include_filter property. 170*333d2b36SAndroid Build Coastguard Worker // Supports '*' as the last character of an entry in the list as a wildcard match. 171*333d2b36SAndroid Build Coastguard Worker // If preceded by '.' it matches all classes in the package and subpackages, otherwise 172*333d2b36SAndroid Build Coastguard Worker // it matches classes in the package that have the class name as a prefix. 173*333d2b36SAndroid Build Coastguard Worker Exclude_filter []string 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker Errorprone struct { 177*333d2b36SAndroid Build Coastguard Worker // List of javac flags that should only be used when running errorprone. 178*333d2b36SAndroid Build Coastguard Worker Javacflags []string 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker // List of java_plugin modules that provide extra errorprone checks. 181*333d2b36SAndroid Build Coastguard Worker Extra_check_modules []string 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker // This property can be in 3 states. When set to true, errorprone will 184*333d2b36SAndroid Build Coastguard Worker // be run during the regular build. When set to false, errorprone will 185*333d2b36SAndroid Build Coastguard Worker // never be run. When unset, errorprone will be run when the RUN_ERROR_PRONE 186*333d2b36SAndroid Build Coastguard Worker // environment variable is true. Setting this to false will improve build 187*333d2b36SAndroid Build Coastguard Worker // performance more than adding -XepDisableAllChecks in javacflags. 188*333d2b36SAndroid Build Coastguard Worker Enabled *bool 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker Proto struct { 192*333d2b36SAndroid Build Coastguard Worker // List of extra options that will be passed to the proto generator. 193*333d2b36SAndroid Build Coastguard Worker Output_params []string 194*333d2b36SAndroid Build Coastguard Worker } 195*333d2b36SAndroid Build Coastguard Worker 196*333d2b36SAndroid Build Coastguard Worker // If true, then jacocoagent is automatically added as a libs dependency so that 197*333d2b36SAndroid Build Coastguard Worker // r8 will not strip instrumentation classes out of dexed libraries. 198*333d2b36SAndroid Build Coastguard Worker Instrument bool `blueprint:"mutated"` 199*333d2b36SAndroid Build Coastguard Worker // If true, then the module supports statically including the jacocoagent 200*333d2b36SAndroid Build Coastguard Worker // into the library. 201*333d2b36SAndroid Build Coastguard Worker Supports_static_instrumentation bool `blueprint:"mutated"` 202*333d2b36SAndroid Build Coastguard Worker 203*333d2b36SAndroid Build Coastguard Worker // List of files to include in the META-INF/services folder of the resulting jar. 204*333d2b36SAndroid Build Coastguard Worker Services []string `android:"path,arch_variant"` 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker // If true, package the kotlin stdlib into the jar. Defaults to true. 207*333d2b36SAndroid Build Coastguard Worker Static_kotlin_stdlib *bool `android:"arch_variant"` 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker // A list of java_library instances that provide additional hiddenapi annotations for the library. 210*333d2b36SAndroid Build Coastguard Worker Hiddenapi_additional_annotations []string 211*333d2b36SAndroid Build Coastguard Worker 212*333d2b36SAndroid Build Coastguard Worker // Additional srcJars tacked in by GeneratedJavaLibraryModule 213*333d2b36SAndroid Build Coastguard Worker Generated_srcjars []android.Path `android:"mutated"` 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Worker // intermediate aconfig cache file tacked in by GeneratedJavaLibraryModule 216*333d2b36SAndroid Build Coastguard Worker Aconfig_Cache_files []android.Path `android:"mutated"` 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker // If true, then only the headers are built and not the implementation jar. 219*333d2b36SAndroid Build Coastguard Worker Headers_only *bool 220*333d2b36SAndroid Build Coastguard Worker 221*333d2b36SAndroid Build Coastguard Worker // A list of files or dependencies to make available to the build sandbox. This is 222*333d2b36SAndroid Build Coastguard Worker // useful if source files are symlinks, the targets of the symlinks must be listed here. 223*333d2b36SAndroid Build Coastguard Worker // Note that currently not all actions implemented by android_apps are sandboxed, so you 224*333d2b36SAndroid Build Coastguard Worker // may only see this being necessary in lint builds. 225*333d2b36SAndroid Build Coastguard Worker Compile_data []string `android:"path"` 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker // Property signifying whether the module compiles stubs or not. 228*333d2b36SAndroid Build Coastguard Worker // Should be set to true when srcs of this module are stub files. 229*333d2b36SAndroid Build Coastguard Worker // This property does not need to be set to true when the module depends on 230*333d2b36SAndroid Build Coastguard Worker // the stubs via libs, but should be set to true when the module depends on 231*333d2b36SAndroid Build Coastguard Worker // the stubs via static libs. 232*333d2b36SAndroid Build Coastguard Worker Is_stubs_module *bool 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Worker Ravenizer struct { 235*333d2b36SAndroid Build Coastguard Worker // If true, enable the "Ravenizer" tool on the output jar. 236*333d2b36SAndroid Build Coastguard Worker // "Ravenizer" is a tool for Ravenwood tests, but it can also be enabled on other kinds 237*333d2b36SAndroid Build Coastguard Worker // of java targets. 238*333d2b36SAndroid Build Coastguard Worker Enabled *bool 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Worker // If true, the "Ravenizer" tool will remove all Mockito and DexMaker 241*333d2b36SAndroid Build Coastguard Worker // classes from the output jar. 242*333d2b36SAndroid Build Coastguard Worker Strip_mockito *bool 243*333d2b36SAndroid Build Coastguard Worker } 244*333d2b36SAndroid Build Coastguard Worker 245*333d2b36SAndroid Build Coastguard Worker // Contributing api surface of the stub module. Is not visible to bp modules, and should 246*333d2b36SAndroid Build Coastguard Worker // only be set for stub submodules generated by the java_sdk_library 247*333d2b36SAndroid Build Coastguard Worker Stub_contributing_api *string `blueprint:"mutated"` 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker // If true, enable the "ApiMapper" tool on the output jar. "ApiMapper" is a tool to inject 250*333d2b36SAndroid Build Coastguard Worker // bytecode to log API calls. 251*333d2b36SAndroid Build Coastguard Worker ApiMapper bool `blueprint:"mutated"` 252*333d2b36SAndroid Build Coastguard Worker} 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Worker// Properties that are specific to device modules. Host module factories should not add these when 255*333d2b36SAndroid Build Coastguard Worker// constructing a new module. 256*333d2b36SAndroid Build Coastguard Workertype DeviceProperties struct { 257*333d2b36SAndroid Build Coastguard Worker // If not blank, set to the version of the sdk to compile against. 258*333d2b36SAndroid Build Coastguard Worker // Defaults to an empty string, which compiles the module against the private platform APIs. 259*333d2b36SAndroid Build Coastguard Worker // Values are of one of the following forms: 260*333d2b36SAndroid Build Coastguard Worker // 1) numerical API level, "current", "none", or "core_platform" 261*333d2b36SAndroid Build Coastguard Worker // 2) An SDK kind with an API level: "<sdk kind>_<API level>" 262*333d2b36SAndroid Build Coastguard Worker // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds. 263*333d2b36SAndroid Build Coastguard Worker // If the SDK kind is empty, it will be set to public. 264*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 265*333d2b36SAndroid Build Coastguard Worker 266*333d2b36SAndroid Build Coastguard Worker // if not blank, set the maximum version of the sdk that the compiled artifacts will run against. 267*333d2b36SAndroid Build Coastguard Worker // Defaults to empty string "". See sdk_version for possible values. 268*333d2b36SAndroid Build Coastguard Worker Max_sdk_version *string 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker // if not blank, set the maxSdkVersion properties of permission and uses-permission tags. 271*333d2b36SAndroid Build Coastguard Worker // Defaults to empty string "". See sdk_version for possible values. 272*333d2b36SAndroid Build Coastguard Worker Replace_max_sdk_version_placeholder *string 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker // if not blank, set the targetSdkVersion in the AndroidManifest.xml. 275*333d2b36SAndroid Build Coastguard Worker // Defaults to sdk_version if not set. See sdk_version for possible values. 276*333d2b36SAndroid Build Coastguard Worker Target_sdk_version *string 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker // Whether to compile against the platform APIs instead of an SDK. 279*333d2b36SAndroid Build Coastguard Worker // If true, then sdk_version must be empty. The value of this field 280*333d2b36SAndroid Build Coastguard Worker // is ignored when module's type isn't android_app, android_test, or android_test_helper_app. 281*333d2b36SAndroid Build Coastguard Worker Platform_apis *bool 282*333d2b36SAndroid Build Coastguard Worker 283*333d2b36SAndroid Build Coastguard Worker Aidl struct { 284*333d2b36SAndroid Build Coastguard Worker // Top level directories to pass to aidl tool 285*333d2b36SAndroid Build Coastguard Worker Include_dirs []string 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker // Directories rooted at the Android.bp file to pass to aidl tool 288*333d2b36SAndroid Build Coastguard Worker Local_include_dirs []string 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker // directories that should be added as include directories for any aidl sources of modules 291*333d2b36SAndroid Build Coastguard Worker // that depend on this module, as well as to aidl for this module. 292*333d2b36SAndroid Build Coastguard Worker Export_include_dirs []string 293*333d2b36SAndroid Build Coastguard Worker 294*333d2b36SAndroid Build Coastguard Worker // whether to generate traces (for systrace) for this interface 295*333d2b36SAndroid Build Coastguard Worker Generate_traces *bool 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker // whether to generate Binder#GetTransaction name method. 298*333d2b36SAndroid Build Coastguard Worker Generate_get_transaction_name *bool 299*333d2b36SAndroid Build Coastguard Worker 300*333d2b36SAndroid Build Coastguard Worker // whether all interfaces should be annotated with required permissions. 301*333d2b36SAndroid Build Coastguard Worker Enforce_permissions *bool 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker // allowlist for interfaces that (temporarily) do not require annotation for permissions. 304*333d2b36SAndroid Build Coastguard Worker Enforce_permissions_exceptions []string `android:"path"` 305*333d2b36SAndroid Build Coastguard Worker 306*333d2b36SAndroid Build Coastguard Worker // list of flags that will be passed to the AIDL compiler 307*333d2b36SAndroid Build Coastguard Worker Flags []string 308*333d2b36SAndroid Build Coastguard Worker } 309*333d2b36SAndroid Build Coastguard Worker 310*333d2b36SAndroid Build Coastguard Worker // If true, export a copy of the module as a -hostdex module for host testing. 311*333d2b36SAndroid Build Coastguard Worker Hostdex *bool 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker Target struct { 314*333d2b36SAndroid Build Coastguard Worker Hostdex struct { 315*333d2b36SAndroid Build Coastguard Worker // Additional required dependencies to add to -hostdex modules. 316*333d2b36SAndroid Build Coastguard Worker Required []string 317*333d2b36SAndroid Build Coastguard Worker } 318*333d2b36SAndroid Build Coastguard Worker } 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Worker // When targeting 1.9 and above, override the modules to use with --system, 321*333d2b36SAndroid Build Coastguard Worker // otherwise provides defaults libraries to add to the bootclasspath. 322*333d2b36SAndroid Build Coastguard Worker System_modules *string 323*333d2b36SAndroid Build Coastguard Worker 324*333d2b36SAndroid Build Coastguard Worker IsSDKLibrary bool `blueprint:"mutated"` 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker // If true, generate the signature file of APK Signing Scheme V4, along side the signed APK file. 327*333d2b36SAndroid Build Coastguard Worker // Defaults to false. 328*333d2b36SAndroid Build Coastguard Worker V4_signature *bool 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Worker // Only for libraries created by a sysprop_library module, SyspropPublicStub is the name of the 331*333d2b36SAndroid Build Coastguard Worker // public stubs library. 332*333d2b36SAndroid Build Coastguard Worker SyspropPublicStub string `blueprint:"mutated"` 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker HiddenAPIPackageProperties 335*333d2b36SAndroid Build Coastguard Worker HiddenAPIFlagFileProperties 336*333d2b36SAndroid Build Coastguard Worker} 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker// Properties that can be overridden by overriding module (e.g. override_android_app) 339*333d2b36SAndroid Build Coastguard Workertype OverridableProperties struct { 340*333d2b36SAndroid Build Coastguard Worker // set the name of the output. If not set, `name` is used. 341*333d2b36SAndroid Build Coastguard Worker // To override a module with this property set, overriding module might need to set this as well. 342*333d2b36SAndroid Build Coastguard Worker // Otherwise, both the overridden and the overriding modules will have the same output name, which 343*333d2b36SAndroid Build Coastguard Worker // can cause the duplicate output error. 344*333d2b36SAndroid Build Coastguard Worker Stem *string 345*333d2b36SAndroid Build Coastguard Worker 346*333d2b36SAndroid Build Coastguard Worker // if not blank, set the minimum version of the sdk that the compiled artifacts will run against. 347*333d2b36SAndroid Build Coastguard Worker // Defaults to sdk_version if not set. See sdk_version for possible values. 348*333d2b36SAndroid Build Coastguard Worker Min_sdk_version *string 349*333d2b36SAndroid Build Coastguard Worker} 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker// Functionality common to Module and Import 352*333d2b36SAndroid Build Coastguard Worker// 353*333d2b36SAndroid Build Coastguard Worker// It is embedded in Module so its functionality can be used by methods in Module 354*333d2b36SAndroid Build Coastguard Worker// but it is currently only initialized by Import and Library. 355*333d2b36SAndroid Build Coastguard Workertype embeddableInModuleAndImport struct { 356*333d2b36SAndroid Build Coastguard Worker 357*333d2b36SAndroid Build Coastguard Worker // Functionality related to this being used as a component of a java_sdk_library. 358*333d2b36SAndroid Build Coastguard Worker EmbeddableSdkLibraryComponent 359*333d2b36SAndroid Build Coastguard Worker} 360*333d2b36SAndroid Build Coastguard Worker 361*333d2b36SAndroid Build Coastguard Workerfunc (e *embeddableInModuleAndImport) initModuleAndImport(module android.Module) { 362*333d2b36SAndroid Build Coastguard Worker e.initSdkLibraryComponent(module) 363*333d2b36SAndroid Build Coastguard Worker} 364*333d2b36SAndroid Build Coastguard Worker 365*333d2b36SAndroid Build Coastguard Worker// Module/Import's DepIsInSameApex(...) delegates to this method. 366*333d2b36SAndroid Build Coastguard Worker// 367*333d2b36SAndroid Build Coastguard Worker// This cannot implement DepIsInSameApex(...) directly as that leads to ambiguity with 368*333d2b36SAndroid Build Coastguard Worker// the one provided by ApexModuleBase. 369*333d2b36SAndroid Build Coastguard Workerfunc (e *embeddableInModuleAndImport) depIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 370*333d2b36SAndroid Build Coastguard Worker // dependencies other than the static linkage are all considered crossing APEX boundary 371*333d2b36SAndroid Build Coastguard Worker if staticLibTag == ctx.OtherModuleDependencyTag(dep) { 372*333d2b36SAndroid Build Coastguard Worker return true 373*333d2b36SAndroid Build Coastguard Worker } 374*333d2b36SAndroid Build Coastguard Worker return false 375*333d2b36SAndroid Build Coastguard Worker} 376*333d2b36SAndroid Build Coastguard Worker 377*333d2b36SAndroid Build Coastguard Worker// OptionalDexJarPath can be either unset, hold a valid path to a dex jar file, 378*333d2b36SAndroid Build Coastguard Worker// or an invalid path describing the reason it is invalid. 379*333d2b36SAndroid Build Coastguard Worker// 380*333d2b36SAndroid Build Coastguard Worker// It is unset if a dex jar isn't applicable, i.e. no build rule has been 381*333d2b36SAndroid Build Coastguard Worker// requested to create one. 382*333d2b36SAndroid Build Coastguard Worker// 383*333d2b36SAndroid Build Coastguard Worker// If a dex jar has been requested to be built then it is set, and it may be 384*333d2b36SAndroid Build Coastguard Worker// either a valid android.Path, or invalid with a reason message. The latter 385*333d2b36SAndroid Build Coastguard Worker// happens if the source that should produce the dex file isn't able to. 386*333d2b36SAndroid Build Coastguard Worker// 387*333d2b36SAndroid Build Coastguard Worker// E.g. it is invalid with a reason message if there is a prebuilt APEX that 388*333d2b36SAndroid Build Coastguard Worker// could produce the dex jar through a deapexer module, but the APEX isn't 389*333d2b36SAndroid Build Coastguard Worker// installable so doing so wouldn't be safe. 390*333d2b36SAndroid Build Coastguard Workertype OptionalDexJarPath struct { 391*333d2b36SAndroid Build Coastguard Worker isSet bool 392*333d2b36SAndroid Build Coastguard Worker path android.OptionalPath 393*333d2b36SAndroid Build Coastguard Worker} 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Worker// IsSet returns true if a path has been set, either invalid or valid. 396*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) IsSet() bool { 397*333d2b36SAndroid Build Coastguard Worker return o.isSet 398*333d2b36SAndroid Build Coastguard Worker} 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Worker// Valid returns true if there is a path that is valid. 401*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) Valid() bool { 402*333d2b36SAndroid Build Coastguard Worker return o.isSet && o.path.Valid() 403*333d2b36SAndroid Build Coastguard Worker} 404*333d2b36SAndroid Build Coastguard Worker 405*333d2b36SAndroid Build Coastguard Worker// Path returns the valid path, or panics if it's either not set or is invalid. 406*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) Path() android.Path { 407*333d2b36SAndroid Build Coastguard Worker if !o.isSet { 408*333d2b36SAndroid Build Coastguard Worker panic("path isn't set") 409*333d2b36SAndroid Build Coastguard Worker } 410*333d2b36SAndroid Build Coastguard Worker return o.path.Path() 411*333d2b36SAndroid Build Coastguard Worker} 412*333d2b36SAndroid Build Coastguard Worker 413*333d2b36SAndroid Build Coastguard Worker// PathOrNil returns the path if it's set and valid, or else nil. 414*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) PathOrNil() android.Path { 415*333d2b36SAndroid Build Coastguard Worker if o.Valid() { 416*333d2b36SAndroid Build Coastguard Worker return o.Path() 417*333d2b36SAndroid Build Coastguard Worker } 418*333d2b36SAndroid Build Coastguard Worker return nil 419*333d2b36SAndroid Build Coastguard Worker} 420*333d2b36SAndroid Build Coastguard Worker 421*333d2b36SAndroid Build Coastguard Worker// InvalidReason returns the reason for an invalid path, which is never "". It 422*333d2b36SAndroid Build Coastguard Worker// returns "" for an unset or valid path. 423*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) InvalidReason() string { 424*333d2b36SAndroid Build Coastguard Worker if !o.isSet { 425*333d2b36SAndroid Build Coastguard Worker return "" 426*333d2b36SAndroid Build Coastguard Worker } 427*333d2b36SAndroid Build Coastguard Worker return o.path.InvalidReason() 428*333d2b36SAndroid Build Coastguard Worker} 429*333d2b36SAndroid Build Coastguard Worker 430*333d2b36SAndroid Build Coastguard Workerfunc (o OptionalDexJarPath) String() string { 431*333d2b36SAndroid Build Coastguard Worker if !o.isSet { 432*333d2b36SAndroid Build Coastguard Worker return "<unset>" 433*333d2b36SAndroid Build Coastguard Worker } 434*333d2b36SAndroid Build Coastguard Worker return o.path.String() 435*333d2b36SAndroid Build Coastguard Worker} 436*333d2b36SAndroid Build Coastguard Worker 437*333d2b36SAndroid Build Coastguard Worker// makeUnsetDexJarPath returns an unset OptionalDexJarPath. 438*333d2b36SAndroid Build Coastguard Workerfunc makeUnsetDexJarPath() OptionalDexJarPath { 439*333d2b36SAndroid Build Coastguard Worker return OptionalDexJarPath{isSet: false} 440*333d2b36SAndroid Build Coastguard Worker} 441*333d2b36SAndroid Build Coastguard Worker 442*333d2b36SAndroid Build Coastguard Worker// makeDexJarPathFromOptionalPath returns an OptionalDexJarPath that is set with 443*333d2b36SAndroid Build Coastguard Worker// the given OptionalPath, which may be valid or invalid. 444*333d2b36SAndroid Build Coastguard Workerfunc makeDexJarPathFromOptionalPath(path android.OptionalPath) OptionalDexJarPath { 445*333d2b36SAndroid Build Coastguard Worker return OptionalDexJarPath{isSet: true, path: path} 446*333d2b36SAndroid Build Coastguard Worker} 447*333d2b36SAndroid Build Coastguard Worker 448*333d2b36SAndroid Build Coastguard Worker// makeDexJarPathFromPath returns an OptionalDexJarPath that is set with the 449*333d2b36SAndroid Build Coastguard Worker// valid given path. It returns an unset OptionalDexJarPath if the given path is 450*333d2b36SAndroid Build Coastguard Worker// nil. 451*333d2b36SAndroid Build Coastguard Workerfunc makeDexJarPathFromPath(path android.Path) OptionalDexJarPath { 452*333d2b36SAndroid Build Coastguard Worker if path == nil { 453*333d2b36SAndroid Build Coastguard Worker return makeUnsetDexJarPath() 454*333d2b36SAndroid Build Coastguard Worker } 455*333d2b36SAndroid Build Coastguard Worker return makeDexJarPathFromOptionalPath(android.OptionalPathForPath(path)) 456*333d2b36SAndroid Build Coastguard Worker} 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker// Module contains the properties and members used by all java module types 459*333d2b36SAndroid Build Coastguard Workertype Module struct { 460*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 461*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 462*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 463*333d2b36SAndroid Build Coastguard Worker 464*333d2b36SAndroid Build Coastguard Worker // Functionality common to Module and Import. 465*333d2b36SAndroid Build Coastguard Worker embeddableInModuleAndImport 466*333d2b36SAndroid Build Coastguard Worker 467*333d2b36SAndroid Build Coastguard Worker properties CommonProperties 468*333d2b36SAndroid Build Coastguard Worker protoProperties android.ProtoProperties 469*333d2b36SAndroid Build Coastguard Worker deviceProperties DeviceProperties 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Worker overridableProperties OverridableProperties 472*333d2b36SAndroid Build Coastguard Worker sourceProperties android.SourceProperties 473*333d2b36SAndroid Build Coastguard Worker 474*333d2b36SAndroid Build Coastguard Worker // jar file containing header classes including static library dependencies, suitable for 475*333d2b36SAndroid Build Coastguard Worker // inserting into the bootclasspath/classpath of another compile 476*333d2b36SAndroid Build Coastguard Worker headerJarFile android.Path 477*333d2b36SAndroid Build Coastguard Worker 478*333d2b36SAndroid Build Coastguard Worker // jar file containing implementation classes including static library dependencies but no 479*333d2b36SAndroid Build Coastguard Worker // resources 480*333d2b36SAndroid Build Coastguard Worker implementationJarFile android.Path 481*333d2b36SAndroid Build Coastguard Worker 482*333d2b36SAndroid Build Coastguard Worker // args and dependencies to package source files into a srcjar 483*333d2b36SAndroid Build Coastguard Worker srcJarArgs []string 484*333d2b36SAndroid Build Coastguard Worker srcJarDeps android.Paths 485*333d2b36SAndroid Build Coastguard Worker 486*333d2b36SAndroid Build Coastguard Worker // the source files of this module and all its static dependencies 487*333d2b36SAndroid Build Coastguard Worker transitiveSrcFiles depset.DepSet[android.Path] 488*333d2b36SAndroid Build Coastguard Worker 489*333d2b36SAndroid Build Coastguard Worker // jar file containing implementation classes and resources including static library 490*333d2b36SAndroid Build Coastguard Worker // dependencies 491*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJar android.Path 492*333d2b36SAndroid Build Coastguard Worker 493*333d2b36SAndroid Build Coastguard Worker // output file containing classes.dex and resources 494*333d2b36SAndroid Build Coastguard Worker dexJarFile OptionalDexJarPath 495*333d2b36SAndroid Build Coastguard Worker 496*333d2b36SAndroid Build Coastguard Worker // output file containing uninstrumented classes that will be instrumented by jacoco 497*333d2b36SAndroid Build Coastguard Worker jacocoReportClassesFile android.Path 498*333d2b36SAndroid Build Coastguard Worker 499*333d2b36SAndroid Build Coastguard Worker // output file of the module, which may be a classes jar or a dex jar 500*333d2b36SAndroid Build Coastguard Worker outputFile android.Path 501*333d2b36SAndroid Build Coastguard Worker extraOutputFiles android.Paths 502*333d2b36SAndroid Build Coastguard Worker 503*333d2b36SAndroid Build Coastguard Worker exportAidlIncludeDirs android.Paths 504*333d2b36SAndroid Build Coastguard Worker ignoredAidlPermissionList android.Paths 505*333d2b36SAndroid Build Coastguard Worker 506*333d2b36SAndroid Build Coastguard Worker logtagsSrcs android.Paths 507*333d2b36SAndroid Build Coastguard Worker 508*333d2b36SAndroid Build Coastguard Worker // installed file for binary dependency 509*333d2b36SAndroid Build Coastguard Worker installFile android.Path 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Worker // installed file for hostdex copy 512*333d2b36SAndroid Build Coastguard Worker hostdexInstallFile android.InstallPath 513*333d2b36SAndroid Build Coastguard Worker 514*333d2b36SAndroid Build Coastguard Worker // list of unique .java and .kt source files 515*333d2b36SAndroid Build Coastguard Worker uniqueSrcFiles android.Paths 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Worker // list of srcjars that was passed to javac 518*333d2b36SAndroid Build Coastguard Worker compiledSrcJars android.Paths 519*333d2b36SAndroid Build Coastguard Worker 520*333d2b36SAndroid Build Coastguard Worker // manifest file to use instead of properties.Manifest 521*333d2b36SAndroid Build Coastguard Worker overrideManifest android.OptionalPath 522*333d2b36SAndroid Build Coastguard Worker 523*333d2b36SAndroid Build Coastguard Worker // list of plugins that this java module is exporting 524*333d2b36SAndroid Build Coastguard Worker exportedPluginJars android.Paths 525*333d2b36SAndroid Build Coastguard Worker 526*333d2b36SAndroid Build Coastguard Worker // list of plugins that this java module is exporting 527*333d2b36SAndroid Build Coastguard Worker exportedPluginClasses []string 528*333d2b36SAndroid Build Coastguard Worker 529*333d2b36SAndroid Build Coastguard Worker // if true, the exported plugins generate API and require disabling turbine. 530*333d2b36SAndroid Build Coastguard Worker exportedDisableTurbine bool 531*333d2b36SAndroid Build Coastguard Worker 532*333d2b36SAndroid Build Coastguard Worker // list of source files, collected from srcFiles with unique java and all kt files, 533*333d2b36SAndroid Build Coastguard Worker // will be used by android.IDEInfo struct 534*333d2b36SAndroid Build Coastguard Worker expandIDEInfoCompiledSrcs []string 535*333d2b36SAndroid Build Coastguard Worker 536*333d2b36SAndroid Build Coastguard Worker // expanded Jarjar_rules 537*333d2b36SAndroid Build Coastguard Worker expandJarjarRules android.Path 538*333d2b36SAndroid Build Coastguard Worker 539*333d2b36SAndroid Build Coastguard Worker // jarjar rule for inherited jarjar rules 540*333d2b36SAndroid Build Coastguard Worker repackageJarjarRules android.Path 541*333d2b36SAndroid Build Coastguard Worker 542*333d2b36SAndroid Build Coastguard Worker // Extra files generated by the module type to be added as java resources. 543*333d2b36SAndroid Build Coastguard Worker extraResources android.Paths 544*333d2b36SAndroid Build Coastguard Worker 545*333d2b36SAndroid Build Coastguard Worker hiddenAPI 546*333d2b36SAndroid Build Coastguard Worker dexer 547*333d2b36SAndroid Build Coastguard Worker dexpreopter 548*333d2b36SAndroid Build Coastguard Worker usesLibrary 549*333d2b36SAndroid Build Coastguard Worker linter 550*333d2b36SAndroid Build Coastguard Worker 551*333d2b36SAndroid Build Coastguard Worker // list of the xref extraction files 552*333d2b36SAndroid Build Coastguard Worker kytheFiles android.Paths 553*333d2b36SAndroid Build Coastguard Worker kytheKotlinFiles android.Paths 554*333d2b36SAndroid Build Coastguard Worker 555*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Worker sdkVersion android.SdkSpec 558*333d2b36SAndroid Build Coastguard Worker minSdkVersion android.ApiLevel 559*333d2b36SAndroid Build Coastguard Worker maxSdkVersion android.ApiLevel 560*333d2b36SAndroid Build Coastguard Worker 561*333d2b36SAndroid Build Coastguard Worker sourceExtensions []string 562*333d2b36SAndroid Build Coastguard Worker 563*333d2b36SAndroid Build Coastguard Worker annoSrcJars android.Paths 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Worker // output file name based on Stem property. 566*333d2b36SAndroid Build Coastguard Worker // This should be set in every ModuleWithStem's GenerateAndroidBuildActions 567*333d2b36SAndroid Build Coastguard Worker // or the module should override Stem(). 568*333d2b36SAndroid Build Coastguard Worker stem string 569*333d2b36SAndroid Build Coastguard Worker 570*333d2b36SAndroid Build Coastguard Worker // Values that will be set in the JarJarProvider data for jarjar repackaging, 571*333d2b36SAndroid Build Coastguard Worker // and merged with our dependencies' rules. 572*333d2b36SAndroid Build Coastguard Worker jarjarRenameRules map[string]string 573*333d2b36SAndroid Build Coastguard Worker 574*333d2b36SAndroid Build Coastguard Worker stubsLinkType StubsLinkType 575*333d2b36SAndroid Build Coastguard Worker 576*333d2b36SAndroid Build Coastguard Worker // Paths to the aconfig intermediate cache files that are provided by the 577*333d2b36SAndroid Build Coastguard Worker // java_aconfig_library or java_library modules that are statically linked 578*333d2b36SAndroid Build Coastguard Worker // to this module. Does not contain cache files from all transitive dependencies. 579*333d2b36SAndroid Build Coastguard Worker aconfigCacheFiles android.Paths 580*333d2b36SAndroid Build Coastguard Worker 581*333d2b36SAndroid Build Coastguard Worker // List of soong module dependencies required to compile the current module. 582*333d2b36SAndroid Build Coastguard Worker // This information is printed out to `Dependencies` field in module_bp_java_deps.json 583*333d2b36SAndroid Build Coastguard Worker compileDepNames []string 584*333d2b36SAndroid Build Coastguard Worker 585*333d2b36SAndroid Build Coastguard Worker ravenizer struct { 586*333d2b36SAndroid Build Coastguard Worker enabled bool 587*333d2b36SAndroid Build Coastguard Worker } 588*333d2b36SAndroid Build Coastguard Worker} 589*333d2b36SAndroid Build Coastguard Worker 590*333d2b36SAndroid Build Coastguard Workervar _ android.InstallableModule = (*Module)(nil) 591*333d2b36SAndroid Build Coastguard Worker 592*333d2b36SAndroid Build Coastguard Worker// To satisfy the InstallableModule interface 593*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) StaticDependencyTags() []blueprint.DependencyTag { 594*333d2b36SAndroid Build Coastguard Worker return []blueprint.DependencyTag{staticLibTag} 595*333d2b36SAndroid Build Coastguard Worker} 596*333d2b36SAndroid Build Coastguard Worker 597*333d2b36SAndroid Build Coastguard Worker// To satisfy the InstallableModule interface 598*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) DynamicDependencyTags() []blueprint.DependencyTag { 599*333d2b36SAndroid Build Coastguard Worker return []blueprint.DependencyTag{libTag, sdkLibTag, bootClasspathTag, systemModulesTag, 600*333d2b36SAndroid Build Coastguard Worker instrumentationForTag, java9LibTag} 601*333d2b36SAndroid Build Coastguard Worker} 602*333d2b36SAndroid Build Coastguard Worker 603*333d2b36SAndroid Build Coastguard Worker// Overrides android.ModuleBase.InstallInProduct() 604*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) InstallInProduct() bool { 605*333d2b36SAndroid Build Coastguard Worker return j.ProductSpecific() 606*333d2b36SAndroid Build Coastguard Worker} 607*333d2b36SAndroid Build Coastguard Worker 608*333d2b36SAndroid Build Coastguard Workervar _ android.StubsAvailableModule = (*Module)(nil) 609*333d2b36SAndroid Build Coastguard Worker 610*333d2b36SAndroid Build Coastguard Worker// To safisfy the StubsAvailableModule interface 611*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) IsStubsModule() bool { 612*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(j.properties.Is_stubs_module) 613*333d2b36SAndroid Build Coastguard Worker} 614*333d2b36SAndroid Build Coastguard Worker 615*333d2b36SAndroid Build Coastguard Workerfunc CheckStableSdkVersion(ctx android.BaseModuleContext, module android.ModuleProxy) error { 616*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 617*333d2b36SAndroid Build Coastguard Worker if info.SdkVersion.Stable() { 618*333d2b36SAndroid Build Coastguard Worker return nil 619*333d2b36SAndroid Build Coastguard Worker } 620*333d2b36SAndroid Build Coastguard Worker if info.SdkVersion.Kind == android.SdkCorePlatform { 621*333d2b36SAndroid Build Coastguard Worker if useLegacyCorePlatformApi(ctx, android.OtherModuleProviderOrDefault(ctx, module, android.CommonModuleInfoKey).BaseModuleName) { 622*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("non stable SDK %v - uses legacy core platform", info.SdkVersion) 623*333d2b36SAndroid Build Coastguard Worker } else { 624*333d2b36SAndroid Build Coastguard Worker // Treat stable core platform as stable. 625*333d2b36SAndroid Build Coastguard Worker return nil 626*333d2b36SAndroid Build Coastguard Worker } 627*333d2b36SAndroid Build Coastguard Worker } else { 628*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("non stable SDK %v", info.SdkVersion) 629*333d2b36SAndroid Build Coastguard Worker } 630*333d2b36SAndroid Build Coastguard Worker } 631*333d2b36SAndroid Build Coastguard Worker 632*333d2b36SAndroid Build Coastguard Worker return nil 633*333d2b36SAndroid Build Coastguard Worker} 634*333d2b36SAndroid Build Coastguard Worker 635*333d2b36SAndroid Build Coastguard Worker// checkSdkVersions enforces restrictions around SDK dependencies. 636*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) checkSdkVersions(ctx android.ModuleContext) { 637*333d2b36SAndroid Build Coastguard Worker if j.RequiresStableAPIs(ctx) { 638*333d2b36SAndroid Build Coastguard Worker if sc, ok := ctx.Module().(android.SdkContext); ok { 639*333d2b36SAndroid Build Coastguard Worker if !sc.SdkVersion(ctx).Specified() { 640*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", 641*333d2b36SAndroid Build Coastguard Worker "sdk_version must have a value when the module is located at vendor or product(only if PRODUCT_ENFORCE_PRODUCT_PARTITION_INTERFACE is set).") 642*333d2b36SAndroid Build Coastguard Worker } 643*333d2b36SAndroid Build Coastguard Worker } 644*333d2b36SAndroid Build Coastguard Worker } 645*333d2b36SAndroid Build Coastguard Worker 646*333d2b36SAndroid Build Coastguard Worker // Make sure this module doesn't statically link to modules with lower-ranked SDK link type. 647*333d2b36SAndroid Build Coastguard Worker // See rank() for details. 648*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 649*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 650*333d2b36SAndroid Build Coastguard Worker switch module.(type) { 651*333d2b36SAndroid Build Coastguard Worker // TODO(satayev): cover other types as well, e.g. imports 652*333d2b36SAndroid Build Coastguard Worker case *Library, *AndroidLibrary: 653*333d2b36SAndroid Build Coastguard Worker switch tag { 654*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag, sdkLibTag, libTag, staticLibTag, java9LibTag: 655*333d2b36SAndroid Build Coastguard Worker j.checkSdkLinkType(ctx, module.(moduleWithSdkDep), tag.(dependencyTag)) 656*333d2b36SAndroid Build Coastguard Worker } 657*333d2b36SAndroid Build Coastguard Worker } 658*333d2b36SAndroid Build Coastguard Worker }) 659*333d2b36SAndroid Build Coastguard Worker} 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) checkPlatformAPI(ctx android.ModuleContext) { 662*333d2b36SAndroid Build Coastguard Worker if sc, ok := ctx.Module().(android.SdkContext); ok { 663*333d2b36SAndroid Build Coastguard Worker usePlatformAPI := proptools.Bool(j.deviceProperties.Platform_apis) 664*333d2b36SAndroid Build Coastguard Worker sdkVersionSpecified := sc.SdkVersion(ctx).Specified() 665*333d2b36SAndroid Build Coastguard Worker if usePlatformAPI && sdkVersionSpecified { 666*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("platform_apis", "This module has conflicting settings. sdk_version is not empty, which means this module cannot use platform APIs. However platform_apis is set to true.") 667*333d2b36SAndroid Build Coastguard Worker } else if !usePlatformAPI && !sdkVersionSpecified { 668*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("platform_apis", "This module has conflicting settings. sdk_version is empty, which means that this module is build against platform APIs. However platform_apis is not set to true") 669*333d2b36SAndroid Build Coastguard Worker } 670*333d2b36SAndroid Build Coastguard Worker 671*333d2b36SAndroid Build Coastguard Worker } 672*333d2b36SAndroid Build Coastguard Worker} 673*333d2b36SAndroid Build Coastguard Worker 674*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) checkHeadersOnly(ctx android.ModuleContext) { 675*333d2b36SAndroid Build Coastguard Worker if _, ok := ctx.Module().(android.SdkContext); ok { 676*333d2b36SAndroid Build Coastguard Worker headersOnly := proptools.Bool(j.properties.Headers_only) 677*333d2b36SAndroid Build Coastguard Worker installable := proptools.Bool(j.properties.Installable) 678*333d2b36SAndroid Build Coastguard Worker 679*333d2b36SAndroid Build Coastguard Worker if headersOnly && installable { 680*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("headers_only", "This module has conflicting settings. headers_only is true which, which means this module doesn't generate an implementation jar. However installable is set to true.") 681*333d2b36SAndroid Build Coastguard Worker } 682*333d2b36SAndroid Build Coastguard Worker } 683*333d2b36SAndroid Build Coastguard Worker} 684*333d2b36SAndroid Build Coastguard Worker 685*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) addHostProperties() { 686*333d2b36SAndroid Build Coastguard Worker j.AddProperties( 687*333d2b36SAndroid Build Coastguard Worker &j.properties, 688*333d2b36SAndroid Build Coastguard Worker &j.overridableProperties, 689*333d2b36SAndroid Build Coastguard Worker &j.protoProperties, 690*333d2b36SAndroid Build Coastguard Worker &j.usesLibraryProperties, 691*333d2b36SAndroid Build Coastguard Worker ) 692*333d2b36SAndroid Build Coastguard Worker} 693*333d2b36SAndroid Build Coastguard Worker 694*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) addHostAndDeviceProperties() { 695*333d2b36SAndroid Build Coastguard Worker j.addHostProperties() 696*333d2b36SAndroid Build Coastguard Worker j.AddProperties( 697*333d2b36SAndroid Build Coastguard Worker &j.deviceProperties, 698*333d2b36SAndroid Build Coastguard Worker &j.dexer.dexProperties, 699*333d2b36SAndroid Build Coastguard Worker &j.dexpreoptProperties, 700*333d2b36SAndroid Build Coastguard Worker &j.linter.properties, 701*333d2b36SAndroid Build Coastguard Worker ) 702*333d2b36SAndroid Build Coastguard Worker} 703*333d2b36SAndroid Build Coastguard Worker 704*333d2b36SAndroid Build Coastguard Worker// provideHiddenAPIPropertyInfo populates a HiddenAPIPropertyInfo from hidden API properties and 705*333d2b36SAndroid Build Coastguard Worker// makes it available through the hiddenAPIPropertyInfoProvider. 706*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) provideHiddenAPIPropertyInfo(ctx android.ModuleContext) { 707*333d2b36SAndroid Build Coastguard Worker hiddenAPIInfo := newHiddenAPIPropertyInfo() 708*333d2b36SAndroid Build Coastguard Worker 709*333d2b36SAndroid Build Coastguard Worker // Populate with flag file paths from the properties. 710*333d2b36SAndroid Build Coastguard Worker hiddenAPIInfo.extractFlagFilesFromProperties(ctx, &j.deviceProperties.HiddenAPIFlagFileProperties) 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Worker // Populate with package rules from the properties. 713*333d2b36SAndroid Build Coastguard Worker hiddenAPIInfo.extractPackageRulesFromProperties(&j.deviceProperties.HiddenAPIPackageProperties) 714*333d2b36SAndroid Build Coastguard Worker 715*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, hiddenAPIPropertyInfoProvider, hiddenAPIInfo) 716*333d2b36SAndroid Build Coastguard Worker} 717*333d2b36SAndroid Build Coastguard Worker 718*333d2b36SAndroid Build Coastguard Worker// helper method for java modules to set OutputFilesProvider 719*333d2b36SAndroid Build Coastguard Workerfunc setOutputFiles(ctx android.ModuleContext, m Module) { 720*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(append(android.PathsIfNonNil(m.outputFile), m.extraOutputFiles...), "") 721*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(m.outputFile), android.DefaultDistTag) 722*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(m.implementationAndResourcesJar), ".jar") 723*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.PathsIfNonNil(m.headerJarFile), ".hjar") 724*333d2b36SAndroid Build Coastguard Worker if m.dexer.proguardDictionary.Valid() { 725*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{m.dexer.proguardDictionary.Path()}, ".proguard_map") 726*333d2b36SAndroid Build Coastguard Worker } 727*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(m.properties.Generated_srcjars, ".generated_srcjars") 728*333d2b36SAndroid Build Coastguard Worker} 729*333d2b36SAndroid Build Coastguard Worker 730*333d2b36SAndroid Build Coastguard Workerfunc InitJavaModule(module android.DefaultableModule, hod android.HostOrDeviceSupported) { 731*333d2b36SAndroid Build Coastguard Worker initJavaModule(module, hod, false) 732*333d2b36SAndroid Build Coastguard Worker} 733*333d2b36SAndroid Build Coastguard Worker 734*333d2b36SAndroid Build Coastguard Workerfunc InitJavaModuleMultiTargets(module android.DefaultableModule, hod android.HostOrDeviceSupported) { 735*333d2b36SAndroid Build Coastguard Worker initJavaModule(module, hod, true) 736*333d2b36SAndroid Build Coastguard Worker} 737*333d2b36SAndroid Build Coastguard Worker 738*333d2b36SAndroid Build Coastguard Workerfunc initJavaModule(module android.DefaultableModule, hod android.HostOrDeviceSupported, multiTargets bool) { 739*333d2b36SAndroid Build Coastguard Worker multilib := android.MultilibCommon 740*333d2b36SAndroid Build Coastguard Worker if multiTargets { 741*333d2b36SAndroid Build Coastguard Worker android.InitAndroidMultiTargetsArchModule(module, hod, multilib) 742*333d2b36SAndroid Build Coastguard Worker } else { 743*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, hod, multilib) 744*333d2b36SAndroid Build Coastguard Worker } 745*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 746*333d2b36SAndroid Build Coastguard Worker} 747*333d2b36SAndroid Build Coastguard Worker 748*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) shouldInstrument(ctx android.BaseModuleContext) bool { 749*333d2b36SAndroid Build Coastguard Worker return j.properties.Instrument && 750*333d2b36SAndroid Build Coastguard Worker ctx.Config().IsEnvTrue("EMMA_INSTRUMENT") && 751*333d2b36SAndroid Build Coastguard Worker ctx.DeviceConfig().JavaCoverageEnabledForPath(ctx.ModuleDir()) 752*333d2b36SAndroid Build Coastguard Worker} 753*333d2b36SAndroid Build Coastguard Worker 754*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) shouldApiMapper() bool { 755*333d2b36SAndroid Build Coastguard Worker return j.properties.ApiMapper 756*333d2b36SAndroid Build Coastguard Worker} 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) shouldInstrumentStatic(ctx android.BaseModuleContext) bool { 759*333d2b36SAndroid Build Coastguard Worker return j.properties.Supports_static_instrumentation && 760*333d2b36SAndroid Build Coastguard Worker j.shouldInstrument(ctx) && 761*333d2b36SAndroid Build Coastguard Worker (ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_STATIC") || 762*333d2b36SAndroid Build Coastguard Worker ctx.Config().UnbundledBuild()) 763*333d2b36SAndroid Build Coastguard Worker} 764*333d2b36SAndroid Build Coastguard Worker 765*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) shouldInstrumentInApex(ctx android.BaseModuleContext) bool { 766*333d2b36SAndroid Build Coastguard Worker // Force enable the instrumentation for java code that is built for APEXes ... 767*333d2b36SAndroid Build Coastguard Worker // except for the jacocoagent itself (because instrumenting jacocoagent using jacocoagent 768*333d2b36SAndroid Build Coastguard Worker // doesn't make sense) or framework libraries (e.g. libraries found in the InstrumentFrameworkModules list) unless EMMA_INSTRUMENT_FRAMEWORK is true. 769*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 770*333d2b36SAndroid Build Coastguard Worker isJacocoAgent := ctx.ModuleName() == "jacocoagent" 771*333d2b36SAndroid Build Coastguard Worker 772*333d2b36SAndroid Build Coastguard Worker compileDex := Bool(j.dexProperties.Compile_dex) || Bool(j.properties.Installable) 773*333d2b36SAndroid Build Coastguard Worker if compileDex && !isJacocoAgent && !apexInfo.IsForPlatform() { 774*333d2b36SAndroid Build Coastguard Worker if !inList(ctx.ModuleName(), config.InstrumentFrameworkModules) { 775*333d2b36SAndroid Build Coastguard Worker return true 776*333d2b36SAndroid Build Coastguard Worker } else if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") { 777*333d2b36SAndroid Build Coastguard Worker return true 778*333d2b36SAndroid Build Coastguard Worker } 779*333d2b36SAndroid Build Coastguard Worker } 780*333d2b36SAndroid Build Coastguard Worker return false 781*333d2b36SAndroid Build Coastguard Worker} 782*333d2b36SAndroid Build Coastguard Worker 783*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) setInstrument(value bool) { 784*333d2b36SAndroid Build Coastguard Worker j.properties.Instrument = value 785*333d2b36SAndroid Build Coastguard Worker} 786*333d2b36SAndroid Build Coastguard Worker 787*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) setApiMapper(value bool) { 788*333d2b36SAndroid Build Coastguard Worker j.properties.ApiMapper = value 789*333d2b36SAndroid Build Coastguard Worker} 790*333d2b36SAndroid Build Coastguard Worker 791*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { 792*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecFrom(ctx, String(j.deviceProperties.Sdk_version)) 793*333d2b36SAndroid Build Coastguard Worker} 794*333d2b36SAndroid Build Coastguard Worker 795*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) SystemModules() string { 796*333d2b36SAndroid Build Coastguard Worker return proptools.String(j.deviceProperties.System_modules) 797*333d2b36SAndroid Build Coastguard Worker} 798*333d2b36SAndroid Build Coastguard Worker 799*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 800*333d2b36SAndroid Build Coastguard Worker if j.overridableProperties.Min_sdk_version != nil { 801*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.overridableProperties.Min_sdk_version) 802*333d2b36SAndroid Build Coastguard Worker } 803*333d2b36SAndroid Build Coastguard Worker return j.SdkVersion(ctx).ApiLevel 804*333d2b36SAndroid Build Coastguard Worker} 805*333d2b36SAndroid Build Coastguard Worker 806*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) GetDeviceProperties() *DeviceProperties { 807*333d2b36SAndroid Build Coastguard Worker return &j.deviceProperties 808*333d2b36SAndroid Build Coastguard Worker} 809*333d2b36SAndroid Build Coastguard Worker 810*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) MaxSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 811*333d2b36SAndroid Build Coastguard Worker if j.deviceProperties.Max_sdk_version != nil { 812*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.deviceProperties.Max_sdk_version) 813*333d2b36SAndroid Build Coastguard Worker } 814*333d2b36SAndroid Build Coastguard Worker // Default is PrivateApiLevel 815*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecPrivate.ApiLevel 816*333d2b36SAndroid Build Coastguard Worker} 817*333d2b36SAndroid Build Coastguard Worker 818*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel { 819*333d2b36SAndroid Build Coastguard Worker if j.deviceProperties.Replace_max_sdk_version_placeholder != nil { 820*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.deviceProperties.Replace_max_sdk_version_placeholder) 821*333d2b36SAndroid Build Coastguard Worker } 822*333d2b36SAndroid Build Coastguard Worker // Default is PrivateApiLevel 823*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecPrivate.ApiLevel 824*333d2b36SAndroid Build Coastguard Worker} 825*333d2b36SAndroid Build Coastguard Worker 826*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) MinSdkVersionString() string { 827*333d2b36SAndroid Build Coastguard Worker return j.minSdkVersion.String() 828*333d2b36SAndroid Build Coastguard Worker} 829*333d2b36SAndroid Build Coastguard Worker 830*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 831*333d2b36SAndroid Build Coastguard Worker if j.deviceProperties.Target_sdk_version != nil { 832*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.deviceProperties.Target_sdk_version) 833*333d2b36SAndroid Build Coastguard Worker } 834*333d2b36SAndroid Build Coastguard Worker return j.SdkVersion(ctx).ApiLevel 835*333d2b36SAndroid Build Coastguard Worker} 836*333d2b36SAndroid Build Coastguard Worker 837*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) AvailableFor(what string) bool { 838*333d2b36SAndroid Build Coastguard Worker if what == android.AvailableToPlatform && Bool(j.deviceProperties.Hostdex) { 839*333d2b36SAndroid Build Coastguard Worker // Exception: for hostdex: true libraries, the platform variant is created 840*333d2b36SAndroid Build Coastguard Worker // even if it's not marked as available to platform. In that case, the platform 841*333d2b36SAndroid Build Coastguard Worker // variant is used only for the hostdex and not installed to the device. 842*333d2b36SAndroid Build Coastguard Worker return true 843*333d2b36SAndroid Build Coastguard Worker } 844*333d2b36SAndroid Build Coastguard Worker return j.ApexModuleBase.AvailableFor(what) 845*333d2b36SAndroid Build Coastguard Worker} 846*333d2b36SAndroid Build Coastguard Worker 847*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) staticLibs(ctx android.BaseModuleContext) []string { 848*333d2b36SAndroid Build Coastguard Worker return j.properties.Static_libs.GetOrDefault(ctx, nil) 849*333d2b36SAndroid Build Coastguard Worker} 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) deps(ctx android.BottomUpMutatorContext) { 852*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 853*333d2b36SAndroid Build Coastguard Worker j.linter.deps(ctx) 854*333d2b36SAndroid Build Coastguard Worker 855*333d2b36SAndroid Build Coastguard Worker sdkDeps(ctx, android.SdkContext(j), j.dexer) 856*333d2b36SAndroid Build Coastguard Worker 857*333d2b36SAndroid Build Coastguard Worker if j.deviceProperties.SyspropPublicStub != "" { 858*333d2b36SAndroid Build Coastguard Worker // This is a sysprop implementation library that has a corresponding sysprop public 859*333d2b36SAndroid Build Coastguard Worker // stubs library, and a dependency on it so that dependencies on the implementation can 860*333d2b36SAndroid Build Coastguard Worker // be forwarded to the public stubs library when necessary. 861*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, syspropPublicStubDepTag, j.deviceProperties.SyspropPublicStub) 862*333d2b36SAndroid Build Coastguard Worker } 863*333d2b36SAndroid Build Coastguard Worker } 864*333d2b36SAndroid Build Coastguard Worker 865*333d2b36SAndroid Build Coastguard Worker libDeps := ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...) 866*333d2b36SAndroid Build Coastguard Worker 867*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, j.staticLibs(ctx)...) 868*333d2b36SAndroid Build Coastguard Worker 869*333d2b36SAndroid Build Coastguard Worker // Add dependency on libraries that provide additional hidden api annotations. 870*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, hiddenApiAnnotationsTag, j.properties.Hiddenapi_additional_annotations...) 871*333d2b36SAndroid Build Coastguard Worker 872*333d2b36SAndroid Build Coastguard Worker // For library dependencies that are component libraries (like stubs), add the implementation 873*333d2b36SAndroid Build Coastguard Worker // as a dependency (dexpreopt needs to be against the implementation library, not stubs). 874*333d2b36SAndroid Build Coastguard Worker for _, dep := range libDeps { 875*333d2b36SAndroid Build Coastguard Worker if dep != nil { 876*333d2b36SAndroid Build Coastguard Worker if component, ok := dep.(SdkLibraryComponentDependency); ok { 877*333d2b36SAndroid Build Coastguard Worker if lib := component.OptionalSdkLibraryImplementation(); lib != nil { 878*333d2b36SAndroid Build Coastguard Worker // Add library as optional if it's one of the optional compatibility libs or it's 879*333d2b36SAndroid Build Coastguard Worker // explicitly listed in the optional_uses_libs property. 880*333d2b36SAndroid Build Coastguard Worker tag := usesLibReqTag 881*333d2b36SAndroid Build Coastguard Worker if android.InList(*lib, dexpreopt.OptionalCompatUsesLibs) || 882*333d2b36SAndroid Build Coastguard Worker android.InList(*lib, j.usesLibrary.usesLibraryProperties.Optional_uses_libs.GetOrDefault(ctx, nil)) { 883*333d2b36SAndroid Build Coastguard Worker tag = usesLibOptTag 884*333d2b36SAndroid Build Coastguard Worker } 885*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, tag, *lib) 886*333d2b36SAndroid Build Coastguard Worker } 887*333d2b36SAndroid Build Coastguard Worker } 888*333d2b36SAndroid Build Coastguard Worker } 889*333d2b36SAndroid Build Coastguard Worker } 890*333d2b36SAndroid Build Coastguard Worker 891*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), pluginTag, j.properties.Plugins...) 892*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag, j.properties.Kotlin_plugins...) 893*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), errorpronePluginTag, j.properties.Errorprone.Extra_check_modules...) 894*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), exportedPluginTag, j.properties.Exported_plugins...) 895*333d2b36SAndroid Build Coastguard Worker 896*333d2b36SAndroid Build Coastguard Worker android.ProtoDeps(ctx, &j.protoProperties) 897*333d2b36SAndroid Build Coastguard Worker if j.hasSrcExt(".proto") { 898*333d2b36SAndroid Build Coastguard Worker protoDeps(ctx, &j.protoProperties) 899*333d2b36SAndroid Build Coastguard Worker } 900*333d2b36SAndroid Build Coastguard Worker 901*333d2b36SAndroid Build Coastguard Worker if j.hasSrcExt(".kt") { 902*333d2b36SAndroid Build Coastguard Worker // TODO(ccross): move this to a mutator pass that can tell if generated sources contain 903*333d2b36SAndroid Build Coastguard Worker // Kotlin files 904*333d2b36SAndroid Build Coastguard Worker tag := staticLibTag 905*333d2b36SAndroid Build Coastguard Worker if !BoolDefault(j.properties.Static_kotlin_stdlib, true) { 906*333d2b36SAndroid Build Coastguard Worker tag = libTag 907*333d2b36SAndroid Build Coastguard Worker } 908*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, tag, 909*333d2b36SAndroid Build Coastguard Worker "kotlin-stdlib", "kotlin-stdlib-jdk7", "kotlin-stdlib-jdk8", "kotlin-annotations") 910*333d2b36SAndroid Build Coastguard Worker } 911*333d2b36SAndroid Build Coastguard Worker 912*333d2b36SAndroid Build Coastguard Worker // Framework libraries need special handling in static coverage builds: they should not have 913*333d2b36SAndroid Build Coastguard Worker // static dependency on jacoco, otherwise there would be multiple conflicting definitions of 914*333d2b36SAndroid Build Coastguard Worker // the same jacoco classes coming from different bootclasspath jars. 915*333d2b36SAndroid Build Coastguard Worker if inList(ctx.ModuleName(), config.InstrumentFrameworkModules) { 916*333d2b36SAndroid Build Coastguard Worker if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") { 917*333d2b36SAndroid Build Coastguard Worker j.properties.Instrument = true 918*333d2b36SAndroid Build Coastguard Worker } 919*333d2b36SAndroid Build Coastguard Worker } else if j.shouldInstrumentStatic(ctx) { 920*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, "jacocoagent") 921*333d2b36SAndroid Build Coastguard Worker } 922*333d2b36SAndroid Build Coastguard Worker 923*333d2b36SAndroid Build Coastguard Worker if j.useCompose(ctx) { 924*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag, 925*333d2b36SAndroid Build Coastguard Worker "androidx.compose.compiler_compiler-hosted-plugin") 926*333d2b36SAndroid Build Coastguard Worker } 927*333d2b36SAndroid Build Coastguard Worker} 928*333d2b36SAndroid Build Coastguard Worker 929*333d2b36SAndroid Build Coastguard Workerfunc hasSrcExt(srcs []string, ext string) bool { 930*333d2b36SAndroid Build Coastguard Worker for _, src := range srcs { 931*333d2b36SAndroid Build Coastguard Worker if filepath.Ext(src) == ext { 932*333d2b36SAndroid Build Coastguard Worker return true 933*333d2b36SAndroid Build Coastguard Worker } 934*333d2b36SAndroid Build Coastguard Worker } 935*333d2b36SAndroid Build Coastguard Worker 936*333d2b36SAndroid Build Coastguard Worker return false 937*333d2b36SAndroid Build Coastguard Worker} 938*333d2b36SAndroid Build Coastguard Worker 939*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) hasSrcExt(ext string) bool { 940*333d2b36SAndroid Build Coastguard Worker return hasSrcExt(j.properties.Srcs, ext) 941*333d2b36SAndroid Build Coastguard Worker} 942*333d2b36SAndroid Build Coastguard Worker 943*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) individualAidlFlags(ctx android.ModuleContext, aidlFile android.Path) string { 944*333d2b36SAndroid Build Coastguard Worker var flags string 945*333d2b36SAndroid Build Coastguard Worker 946*333d2b36SAndroid Build Coastguard Worker if Bool(j.deviceProperties.Aidl.Enforce_permissions) { 947*333d2b36SAndroid Build Coastguard Worker if !android.InList(aidlFile.String(), j.ignoredAidlPermissionList.Strings()) { 948*333d2b36SAndroid Build Coastguard Worker flags = "-Wmissing-permission-annotation -Werror" 949*333d2b36SAndroid Build Coastguard Worker } 950*333d2b36SAndroid Build Coastguard Worker } 951*333d2b36SAndroid Build Coastguard Worker return flags 952*333d2b36SAndroid Build Coastguard Worker} 953*333d2b36SAndroid Build Coastguard Worker 954*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath, 955*333d2b36SAndroid Build Coastguard Worker aidlIncludeDirs android.Paths, aidlSrcs android.Paths) (string, android.Paths) { 956*333d2b36SAndroid Build Coastguard Worker 957*333d2b36SAndroid Build Coastguard Worker aidlIncludes := android.PathsForModuleSrc(ctx, j.deviceProperties.Aidl.Local_include_dirs) 958*333d2b36SAndroid Build Coastguard Worker aidlIncludes = append(aidlIncludes, 959*333d2b36SAndroid Build Coastguard Worker android.PathsForModuleSrc(ctx, j.deviceProperties.Aidl.Export_include_dirs)...) 960*333d2b36SAndroid Build Coastguard Worker aidlIncludes = append(aidlIncludes, 961*333d2b36SAndroid Build Coastguard Worker android.PathsForSource(ctx, j.deviceProperties.Aidl.Include_dirs)...) 962*333d2b36SAndroid Build Coastguard Worker 963*333d2b36SAndroid Build Coastguard Worker var flags []string 964*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 965*333d2b36SAndroid Build Coastguard Worker var includeDirs android.Paths 966*333d2b36SAndroid Build Coastguard Worker 967*333d2b36SAndroid Build Coastguard Worker flags = append(flags, j.deviceProperties.Aidl.Flags...) 968*333d2b36SAndroid Build Coastguard Worker 969*333d2b36SAndroid Build Coastguard Worker if aidlPreprocess.Valid() { 970*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "-p"+aidlPreprocess.String()) 971*333d2b36SAndroid Build Coastguard Worker deps = append(deps, aidlPreprocess.Path()) 972*333d2b36SAndroid Build Coastguard Worker } else if len(aidlIncludeDirs) > 0 { 973*333d2b36SAndroid Build Coastguard Worker includeDirs = append(includeDirs, aidlIncludeDirs...) 974*333d2b36SAndroid Build Coastguard Worker } 975*333d2b36SAndroid Build Coastguard Worker 976*333d2b36SAndroid Build Coastguard Worker if len(j.exportAidlIncludeDirs) > 0 { 977*333d2b36SAndroid Build Coastguard Worker includeDirs = append(includeDirs, j.exportAidlIncludeDirs...) 978*333d2b36SAndroid Build Coastguard Worker } 979*333d2b36SAndroid Build Coastguard Worker 980*333d2b36SAndroid Build Coastguard Worker if len(aidlIncludes) > 0 { 981*333d2b36SAndroid Build Coastguard Worker includeDirs = append(includeDirs, aidlIncludes...) 982*333d2b36SAndroid Build Coastguard Worker } 983*333d2b36SAndroid Build Coastguard Worker 984*333d2b36SAndroid Build Coastguard Worker includeDirs = append(includeDirs, android.PathForModuleSrc(ctx)) 985*333d2b36SAndroid Build Coastguard Worker if src := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "src"); src.Valid() { 986*333d2b36SAndroid Build Coastguard Worker includeDirs = append(includeDirs, src.Path()) 987*333d2b36SAndroid Build Coastguard Worker } 988*333d2b36SAndroid Build Coastguard Worker flags = append(flags, android.JoinWithPrefix(includeDirs.Strings(), "-I")) 989*333d2b36SAndroid Build Coastguard Worker // add flags for dirs containing AIDL srcs that haven't been specified yet 990*333d2b36SAndroid Build Coastguard Worker flags = append(flags, genAidlIncludeFlags(ctx, aidlSrcs, includeDirs)) 991*333d2b36SAndroid Build Coastguard Worker 992*333d2b36SAndroid Build Coastguard Worker sdkVersion := (j.SdkVersion(ctx)).Kind 993*333d2b36SAndroid Build Coastguard Worker defaultTrace := ((sdkVersion == android.SdkSystemServer) || (sdkVersion == android.SdkCore) || (sdkVersion == android.SdkCorePlatform) || (sdkVersion == android.SdkModule) || (sdkVersion == android.SdkSystem)) 994*333d2b36SAndroid Build Coastguard Worker if proptools.BoolDefault(j.deviceProperties.Aidl.Generate_traces, defaultTrace) { 995*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "-t") 996*333d2b36SAndroid Build Coastguard Worker } 997*333d2b36SAndroid Build Coastguard Worker 998*333d2b36SAndroid Build Coastguard Worker if Bool(j.deviceProperties.Aidl.Generate_get_transaction_name) { 999*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "--transaction_names") 1000*333d2b36SAndroid Build Coastguard Worker } 1001*333d2b36SAndroid Build Coastguard Worker 1002*333d2b36SAndroid Build Coastguard Worker if Bool(j.deviceProperties.Aidl.Enforce_permissions) { 1003*333d2b36SAndroid Build Coastguard Worker exceptions := j.deviceProperties.Aidl.Enforce_permissions_exceptions 1004*333d2b36SAndroid Build Coastguard Worker j.ignoredAidlPermissionList = android.PathsForModuleSrcExcludes(ctx, exceptions, nil) 1005*333d2b36SAndroid Build Coastguard Worker } 1006*333d2b36SAndroid Build Coastguard Worker 1007*333d2b36SAndroid Build Coastguard Worker aidlMinSdkVersion := j.MinSdkVersion(ctx).String() 1008*333d2b36SAndroid Build Coastguard Worker flags = append(flags, "--min_sdk_version="+aidlMinSdkVersion) 1009*333d2b36SAndroid Build Coastguard Worker 1010*333d2b36SAndroid Build Coastguard Worker return strings.Join(flags, " "), deps 1011*333d2b36SAndroid Build Coastguard Worker} 1012*333d2b36SAndroid Build Coastguard Worker 1013*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) collectBuilderFlags(ctx android.ModuleContext, deps deps) javaBuilderFlags { 1014*333d2b36SAndroid Build Coastguard Worker 1015*333d2b36SAndroid Build Coastguard Worker var flags javaBuilderFlags 1016*333d2b36SAndroid Build Coastguard Worker 1017*333d2b36SAndroid Build Coastguard Worker // javaVersion flag. 1018*333d2b36SAndroid Build Coastguard Worker flags.javaVersion = getJavaVersion(ctx, String(j.properties.Java_version), android.SdkContext(j)) 1019*333d2b36SAndroid Build Coastguard Worker 1020*333d2b36SAndroid Build Coastguard Worker epEnabled := j.properties.Errorprone.Enabled 1021*333d2b36SAndroid Build Coastguard Worker if (ctx.Config().RunErrorProne() && epEnabled == nil) || Bool(epEnabled) { 1022*333d2b36SAndroid Build Coastguard Worker if config.ErrorProneClasspath == nil && !ctx.Config().RunningInsideUnitTest() { 1023*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?") 1024*333d2b36SAndroid Build Coastguard Worker } 1025*333d2b36SAndroid Build Coastguard Worker 1026*333d2b36SAndroid Build Coastguard Worker errorProneFlags := []string{ 1027*333d2b36SAndroid Build Coastguard Worker "-Xplugin:ErrorProne", 1028*333d2b36SAndroid Build Coastguard Worker "${config.ErrorProneChecks}", 1029*333d2b36SAndroid Build Coastguard Worker } 1030*333d2b36SAndroid Build Coastguard Worker errorProneFlags = append(errorProneFlags, j.properties.Errorprone.Javacflags...) 1031*333d2b36SAndroid Build Coastguard Worker 1032*333d2b36SAndroid Build Coastguard Worker flags.errorProneExtraJavacFlags = "${config.ErrorProneHeapFlags} ${config.ErrorProneFlags} " + 1033*333d2b36SAndroid Build Coastguard Worker "'" + strings.Join(errorProneFlags, " ") + "'" 1034*333d2b36SAndroid Build Coastguard Worker flags.errorProneProcessorPath = classpath(android.PathsForSource(ctx, config.ErrorProneClasspath)) 1035*333d2b36SAndroid Build Coastguard Worker } 1036*333d2b36SAndroid Build Coastguard Worker 1037*333d2b36SAndroid Build Coastguard Worker // classpath 1038*333d2b36SAndroid Build Coastguard Worker flags.bootClasspath = append(flags.bootClasspath, deps.bootClasspath...) 1039*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(flags.classpath, deps.classpath...) 1040*333d2b36SAndroid Build Coastguard Worker flags.dexClasspath = append(flags.dexClasspath, deps.dexClasspath...) 1041*333d2b36SAndroid Build Coastguard Worker flags.java9Classpath = append(flags.java9Classpath, deps.java9Classpath...) 1042*333d2b36SAndroid Build Coastguard Worker flags.processorPath = append(flags.processorPath, deps.processorPath...) 1043*333d2b36SAndroid Build Coastguard Worker flags.errorProneProcessorPath = append(flags.errorProneProcessorPath, deps.errorProneProcessorPath...) 1044*333d2b36SAndroid Build Coastguard Worker 1045*333d2b36SAndroid Build Coastguard Worker flags.processors = append(flags.processors, deps.processorClasses...) 1046*333d2b36SAndroid Build Coastguard Worker flags.processors = android.FirstUniqueStrings(flags.processors) 1047*333d2b36SAndroid Build Coastguard Worker 1048*333d2b36SAndroid Build Coastguard Worker if len(flags.bootClasspath) == 0 && ctx.Host() && !flags.javaVersion.usesJavaModules() && 1049*333d2b36SAndroid Build Coastguard Worker decodeSdkDep(ctx, android.SdkContext(j)).hasStandardLibs() { 1050*333d2b36SAndroid Build Coastguard Worker // Give host-side tools a version of OpenJDK's standard libraries 1051*333d2b36SAndroid Build Coastguard Worker // close to what they're targeting. As of Dec 2017, AOSP is only 1052*333d2b36SAndroid Build Coastguard Worker // bundling OpenJDK 8 and 9, so nothing < 8 is available. 1053*333d2b36SAndroid Build Coastguard Worker // 1054*333d2b36SAndroid Build Coastguard Worker // When building with OpenJDK 8, the following should have no 1055*333d2b36SAndroid Build Coastguard Worker // effect since those jars would be available by default. 1056*333d2b36SAndroid Build Coastguard Worker // 1057*333d2b36SAndroid Build Coastguard Worker // When building with OpenJDK 9 but targeting a version < 1.8, 1058*333d2b36SAndroid Build Coastguard Worker // putting them on the bootclasspath means that: 1059*333d2b36SAndroid Build Coastguard Worker // a) code can't (accidentally) refer to OpenJDK 9 specific APIs 1060*333d2b36SAndroid Build Coastguard Worker // b) references to existing APIs are not reinterpreted in an 1061*333d2b36SAndroid Build Coastguard Worker // OpenJDK 9-specific way, eg. calls to subclasses of 1062*333d2b36SAndroid Build Coastguard Worker // java.nio.Buffer as in http://b/70862583 1063*333d2b36SAndroid Build Coastguard Worker java8Home := ctx.Config().Getenv("ANDROID_JAVA8_HOME") 1064*333d2b36SAndroid Build Coastguard Worker flags.bootClasspath = append(flags.bootClasspath, 1065*333d2b36SAndroid Build Coastguard Worker android.PathForSource(ctx, java8Home, "jre/lib/jce.jar"), 1066*333d2b36SAndroid Build Coastguard Worker android.PathForSource(ctx, java8Home, "jre/lib/rt.jar")) 1067*333d2b36SAndroid Build Coastguard Worker if Bool(j.properties.Use_tools_jar) { 1068*333d2b36SAndroid Build Coastguard Worker flags.bootClasspath = append(flags.bootClasspath, 1069*333d2b36SAndroid Build Coastguard Worker android.PathForSource(ctx, java8Home, "lib/tools.jar")) 1070*333d2b36SAndroid Build Coastguard Worker } 1071*333d2b36SAndroid Build Coastguard Worker } 1072*333d2b36SAndroid Build Coastguard Worker 1073*333d2b36SAndroid Build Coastguard Worker // systemModules 1074*333d2b36SAndroid Build Coastguard Worker flags.systemModules = deps.systemModules 1075*333d2b36SAndroid Build Coastguard Worker 1076*333d2b36SAndroid Build Coastguard Worker return flags 1077*333d2b36SAndroid Build Coastguard Worker} 1078*333d2b36SAndroid Build Coastguard Worker 1079*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) collectJavacFlags( 1080*333d2b36SAndroid Build Coastguard Worker ctx android.ModuleContext, flags javaBuilderFlags, srcFiles android.Paths) javaBuilderFlags { 1081*333d2b36SAndroid Build Coastguard Worker // javac flags. 1082*333d2b36SAndroid Build Coastguard Worker javacFlags := j.properties.Javacflags 1083*333d2b36SAndroid Build Coastguard Worker var needsDebugInfo bool 1084*333d2b36SAndroid Build Coastguard Worker 1085*333d2b36SAndroid Build Coastguard Worker needsDebugInfo = false 1086*333d2b36SAndroid Build Coastguard Worker for _, flag := range javacFlags { 1087*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(flag, "-g") { 1088*333d2b36SAndroid Build Coastguard Worker needsDebugInfo = true 1089*333d2b36SAndroid Build Coastguard Worker } 1090*333d2b36SAndroid Build Coastguard Worker } 1091*333d2b36SAndroid Build Coastguard Worker 1092*333d2b36SAndroid Build Coastguard Worker if ctx.Config().MinimizeJavaDebugInfo() && !ctx.Host() && !needsDebugInfo { 1093*333d2b36SAndroid Build Coastguard Worker // For non-host binaries, override the -g flag passed globally to remove 1094*333d2b36SAndroid Build Coastguard Worker // local variable debug info to reduce disk and memory usage. 1095*333d2b36SAndroid Build Coastguard Worker javacFlags = append(javacFlags, "-g:source,lines") 1096*333d2b36SAndroid Build Coastguard Worker } 1097*333d2b36SAndroid Build Coastguard Worker javacFlags = append(javacFlags, "-Xlint:-dep-ann") 1098*333d2b36SAndroid Build Coastguard Worker 1099*333d2b36SAndroid Build Coastguard Worker if flags.javaVersion.usesJavaModules() { 1100*333d2b36SAndroid Build Coastguard Worker javacFlags = append(javacFlags, j.properties.Openjdk9.Javacflags...) 1101*333d2b36SAndroid Build Coastguard Worker } else if len(j.properties.Openjdk9.Javacflags) > 0 { 1102*333d2b36SAndroid Build Coastguard Worker // java version defaults higher than openjdk 9, these conditionals should no longer be necessary 1103*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("openjdk9.javacflags", "JDK version defaults to higher than 9") 1104*333d2b36SAndroid Build Coastguard Worker } 1105*333d2b36SAndroid Build Coastguard Worker 1106*333d2b36SAndroid Build Coastguard Worker if flags.javaVersion.usesJavaModules() { 1107*333d2b36SAndroid Build Coastguard Worker if j.properties.Patch_module != nil { 1108*333d2b36SAndroid Build Coastguard Worker // Manually specify build directory in case it is not under the repo root. 1109*333d2b36SAndroid Build Coastguard Worker // (javac doesn't seem to expand into symbolic links when searching for patch-module targets, so 1110*333d2b36SAndroid Build Coastguard Worker // just adding a symlink under the root doesn't help.) 1111*333d2b36SAndroid Build Coastguard Worker patchPaths := []string{".", ctx.Config().SoongOutDir()} 1112*333d2b36SAndroid Build Coastguard Worker 1113*333d2b36SAndroid Build Coastguard Worker classPath := flags.classpath.FormJavaClassPath("") 1114*333d2b36SAndroid Build Coastguard Worker if classPath != "" { 1115*333d2b36SAndroid Build Coastguard Worker patchPaths = append(patchPaths, classPath) 1116*333d2b36SAndroid Build Coastguard Worker } 1117*333d2b36SAndroid Build Coastguard Worker javacFlags = append( 1118*333d2b36SAndroid Build Coastguard Worker javacFlags, 1119*333d2b36SAndroid Build Coastguard Worker "--patch-module="+String(j.properties.Patch_module)+"="+strings.Join(patchPaths, ":")) 1120*333d2b36SAndroid Build Coastguard Worker } 1121*333d2b36SAndroid Build Coastguard Worker } 1122*333d2b36SAndroid Build Coastguard Worker 1123*333d2b36SAndroid Build Coastguard Worker if len(javacFlags) > 0 { 1124*333d2b36SAndroid Build Coastguard Worker // optimization. 1125*333d2b36SAndroid Build Coastguard Worker ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " ")) 1126*333d2b36SAndroid Build Coastguard Worker flags.javacFlags = "$javacFlags" 1127*333d2b36SAndroid Build Coastguard Worker } 1128*333d2b36SAndroid Build Coastguard Worker 1129*333d2b36SAndroid Build Coastguard Worker return flags 1130*333d2b36SAndroid Build Coastguard Worker} 1131*333d2b36SAndroid Build Coastguard Worker 1132*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) AddJSONData(d *map[string]interface{}) { 1133*333d2b36SAndroid Build Coastguard Worker (&j.ModuleBase).AddJSONData(d) 1134*333d2b36SAndroid Build Coastguard Worker (*d)["Java"] = map[string]interface{}{ 1135*333d2b36SAndroid Build Coastguard Worker "SourceExtensions": j.sourceExtensions, 1136*333d2b36SAndroid Build Coastguard Worker } 1137*333d2b36SAndroid Build Coastguard Worker 1138*333d2b36SAndroid Build Coastguard Worker} 1139*333d2b36SAndroid Build Coastguard Worker 1140*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) addGeneratedSrcJars(path android.Path) { 1141*333d2b36SAndroid Build Coastguard Worker j.properties.Generated_srcjars = append(j.properties.Generated_srcjars, path) 1142*333d2b36SAndroid Build Coastguard Worker} 1143*333d2b36SAndroid Build Coastguard Worker 1144*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) compile(ctx android.ModuleContext, extraSrcJars, extraClasspathJars, extraCombinedJars, extraDepCombinedJars android.Paths) { 1145*333d2b36SAndroid Build Coastguard Worker // Auto-propagating jarjar rules 1146*333d2b36SAndroid Build Coastguard Worker jarjarProviderData := j.collectJarJarRules(ctx) 1147*333d2b36SAndroid Build Coastguard Worker if jarjarProviderData != nil { 1148*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JarJarProvider, *jarjarProviderData) 1149*333d2b36SAndroid Build Coastguard Worker text := getJarJarRuleText(jarjarProviderData) 1150*333d2b36SAndroid Build Coastguard Worker if text != "" { 1151*333d2b36SAndroid Build Coastguard Worker ruleTextFile := android.PathForModuleOut(ctx, "repackaged-jarjar", "repackaging.txt") 1152*333d2b36SAndroid Build Coastguard Worker android.WriteFileRule(ctx, ruleTextFile, text) 1153*333d2b36SAndroid Build Coastguard Worker j.repackageJarjarRules = ruleTextFile 1154*333d2b36SAndroid Build Coastguard Worker } 1155*333d2b36SAndroid Build Coastguard Worker } 1156*333d2b36SAndroid Build Coastguard Worker 1157*333d2b36SAndroid Build Coastguard Worker j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.deviceProperties.Aidl.Export_include_dirs) 1158*333d2b36SAndroid Build Coastguard Worker 1159*333d2b36SAndroid Build Coastguard Worker // Only override the original value if explicitly set 1160*333d2b36SAndroid Build Coastguard Worker if j.properties.Ravenizer.Enabled != nil { 1161*333d2b36SAndroid Build Coastguard Worker j.ravenizer.enabled = *j.properties.Ravenizer.Enabled 1162*333d2b36SAndroid Build Coastguard Worker } 1163*333d2b36SAndroid Build Coastguard Worker 1164*333d2b36SAndroid Build Coastguard Worker deps := j.collectDeps(ctx) 1165*333d2b36SAndroid Build Coastguard Worker flags := j.collectBuilderFlags(ctx, deps) 1166*333d2b36SAndroid Build Coastguard Worker 1167*333d2b36SAndroid Build Coastguard Worker if flags.javaVersion.usesJavaModules() { 1168*333d2b36SAndroid Build Coastguard Worker j.properties.Srcs = append(j.properties.Srcs, j.properties.Openjdk9.Srcs...) 1169*333d2b36SAndroid Build Coastguard Worker } else if len(j.properties.Openjdk9.Javacflags) > 0 { 1170*333d2b36SAndroid Build Coastguard Worker // java version defaults higher than openjdk 9, these conditionals should no longer be necessary 1171*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("openjdk9.srcs", "JDK version defaults to higher than 9") 1172*333d2b36SAndroid Build Coastguard Worker } 1173*333d2b36SAndroid Build Coastguard Worker 1174*333d2b36SAndroid Build Coastguard Worker srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs) 1175*333d2b36SAndroid Build Coastguard Worker j.sourceExtensions = []string{} 1176*333d2b36SAndroid Build Coastguard Worker for _, ext := range []string{".kt", ".proto", ".aidl", ".java", ".logtags"} { 1177*333d2b36SAndroid Build Coastguard Worker if hasSrcExt(srcFiles.Strings(), ext) { 1178*333d2b36SAndroid Build Coastguard Worker j.sourceExtensions = append(j.sourceExtensions, ext) 1179*333d2b36SAndroid Build Coastguard Worker } 1180*333d2b36SAndroid Build Coastguard Worker } 1181*333d2b36SAndroid Build Coastguard Worker if hasSrcExt(srcFiles.Strings(), ".proto") { 1182*333d2b36SAndroid Build Coastguard Worker flags = protoFlags(ctx, &j.properties, &j.protoProperties, flags) 1183*333d2b36SAndroid Build Coastguard Worker } 1184*333d2b36SAndroid Build Coastguard Worker 1185*333d2b36SAndroid Build Coastguard Worker kotlinCommonSrcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Common_srcs, nil) 1186*333d2b36SAndroid Build Coastguard Worker if len(kotlinCommonSrcFiles.FilterOutByExt(".kt")) > 0 { 1187*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("common_srcs", "common_srcs must be .kt files") 1188*333d2b36SAndroid Build Coastguard Worker } 1189*333d2b36SAndroid Build Coastguard Worker 1190*333d2b36SAndroid Build Coastguard Worker aidlSrcs := srcFiles.FilterByExt(".aidl") 1191*333d2b36SAndroid Build Coastguard Worker flags.aidlFlags, flags.aidlDeps = j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs, aidlSrcs) 1192*333d2b36SAndroid Build Coastguard Worker 1193*333d2b36SAndroid Build Coastguard Worker nonGeneratedSrcJars := srcFiles.FilterByExt(".srcjar") 1194*333d2b36SAndroid Build Coastguard Worker srcFiles = j.genSources(ctx, srcFiles, flags) 1195*333d2b36SAndroid Build Coastguard Worker 1196*333d2b36SAndroid Build Coastguard Worker // Collect javac flags only after computing the full set of srcFiles to 1197*333d2b36SAndroid Build Coastguard Worker // ensure that the --patch-module lookup paths are complete. 1198*333d2b36SAndroid Build Coastguard Worker flags = j.collectJavacFlags(ctx, flags, srcFiles) 1199*333d2b36SAndroid Build Coastguard Worker 1200*333d2b36SAndroid Build Coastguard Worker srcJars := srcFiles.FilterByExt(".srcjar") 1201*333d2b36SAndroid Build Coastguard Worker srcJars = append(srcJars, deps.srcJars...) 1202*333d2b36SAndroid Build Coastguard Worker srcJars = append(srcJars, extraSrcJars...) 1203*333d2b36SAndroid Build Coastguard Worker srcJars = append(srcJars, j.properties.Generated_srcjars...) 1204*333d2b36SAndroid Build Coastguard Worker srcFiles = srcFiles.FilterOutByExt(".srcjar") 1205*333d2b36SAndroid Build Coastguard Worker 1206*333d2b36SAndroid Build Coastguard Worker if j.properties.Jarjar_rules != nil { 1207*333d2b36SAndroid Build Coastguard Worker j.expandJarjarRules = android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules) 1208*333d2b36SAndroid Build Coastguard Worker } 1209*333d2b36SAndroid Build Coastguard Worker 1210*333d2b36SAndroid Build Coastguard Worker jarName := j.Stem() + ".jar" 1211*333d2b36SAndroid Build Coastguard Worker 1212*333d2b36SAndroid Build Coastguard Worker var uniqueJavaFiles android.Paths 1213*333d2b36SAndroid Build Coastguard Worker set := make(map[string]bool) 1214*333d2b36SAndroid Build Coastguard Worker for _, v := range srcFiles.FilterByExt(".java") { 1215*333d2b36SAndroid Build Coastguard Worker if _, found := set[v.String()]; !found { 1216*333d2b36SAndroid Build Coastguard Worker set[v.String()] = true 1217*333d2b36SAndroid Build Coastguard Worker uniqueJavaFiles = append(uniqueJavaFiles, v) 1218*333d2b36SAndroid Build Coastguard Worker } 1219*333d2b36SAndroid Build Coastguard Worker } 1220*333d2b36SAndroid Build Coastguard Worker var uniqueKtFiles android.Paths 1221*333d2b36SAndroid Build Coastguard Worker for _, v := range srcFiles.FilterByExt(".kt") { 1222*333d2b36SAndroid Build Coastguard Worker if _, found := set[v.String()]; !found { 1223*333d2b36SAndroid Build Coastguard Worker set[v.String()] = true 1224*333d2b36SAndroid Build Coastguard Worker uniqueKtFiles = append(uniqueKtFiles, v) 1225*333d2b36SAndroid Build Coastguard Worker } 1226*333d2b36SAndroid Build Coastguard Worker } 1227*333d2b36SAndroid Build Coastguard Worker 1228*333d2b36SAndroid Build Coastguard Worker var uniqueSrcFiles android.Paths 1229*333d2b36SAndroid Build Coastguard Worker uniqueSrcFiles = append(uniqueSrcFiles, uniqueJavaFiles...) 1230*333d2b36SAndroid Build Coastguard Worker uniqueSrcFiles = append(uniqueSrcFiles, uniqueKtFiles...) 1231*333d2b36SAndroid Build Coastguard Worker j.uniqueSrcFiles = uniqueSrcFiles 1232*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: uniqueSrcFiles.Strings()}) 1233*333d2b36SAndroid Build Coastguard Worker 1234*333d2b36SAndroid Build Coastguard Worker // We don't currently run annotation processors in turbine, which means we can't use turbine 1235*333d2b36SAndroid Build Coastguard Worker // generated header jars when an annotation processor that generates API is enabled. One 1236*333d2b36SAndroid Build Coastguard Worker // exception (handled further below) is when kotlin sources are enabled, in which case turbine 1237*333d2b36SAndroid Build Coastguard Worker // is used to run all of the annotation processors. 1238*333d2b36SAndroid Build Coastguard Worker disableTurbine := deps.disableTurbine 1239*333d2b36SAndroid Build Coastguard Worker 1240*333d2b36SAndroid Build Coastguard Worker // Collect .java and .kt files for AIDEGen 1241*333d2b36SAndroid Build Coastguard Worker j.expandIDEInfoCompiledSrcs = append(j.expandIDEInfoCompiledSrcs, uniqueSrcFiles.Strings()...) 1242*333d2b36SAndroid Build Coastguard Worker 1243*333d2b36SAndroid Build Coastguard Worker var kotlinHeaderJars android.Paths 1244*333d2b36SAndroid Build Coastguard Worker 1245*333d2b36SAndroid Build Coastguard Worker // Prepend extraClasspathJars to classpath so that the resource processor R.jar comes before 1246*333d2b36SAndroid Build Coastguard Worker // any dependencies so that it can override any non-final R classes from dependencies with the 1247*333d2b36SAndroid Build Coastguard Worker // final R classes from the app. 1248*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(android.CopyOf(extraClasspathJars), flags.classpath...) 1249*333d2b36SAndroid Build Coastguard Worker 1250*333d2b36SAndroid Build Coastguard Worker j.aconfigCacheFiles = append(deps.aconfigProtoFiles, j.properties.Aconfig_Cache_files...) 1251*333d2b36SAndroid Build Coastguard Worker 1252*333d2b36SAndroid Build Coastguard Worker var localImplementationJars android.Paths 1253*333d2b36SAndroid Build Coastguard Worker 1254*333d2b36SAndroid Build Coastguard Worker // If compiling headers then compile them and skip the rest 1255*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(j.properties.Headers_only) { 1256*333d2b36SAndroid Build Coastguard Worker if srcFiles.HasExt(".kt") { 1257*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Compiling headers_only with .kt not supported") 1258*333d2b36SAndroid Build Coastguard Worker } 1259*333d2b36SAndroid Build Coastguard Worker if ctx.Config().IsEnvFalse("TURBINE_ENABLED") || disableTurbine { 1260*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("headers_only is enabled but Turbine is disabled.") 1261*333d2b36SAndroid Build Coastguard Worker } 1262*333d2b36SAndroid Build Coastguard Worker 1263*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars := deps.transitiveStaticLibsHeaderJars 1264*333d2b36SAndroid Build Coastguard Worker 1265*333d2b36SAndroid Build Coastguard Worker localHeaderJars, combinedHeaderJarFile := j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, 1266*333d2b36SAndroid Build Coastguard Worker extraCombinedJars) 1267*333d2b36SAndroid Build Coastguard Worker 1268*333d2b36SAndroid Build Coastguard Worker combinedHeaderJarFile, jarjared := j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine") 1269*333d2b36SAndroid Build Coastguard Worker if jarjared { 1270*333d2b36SAndroid Build Coastguard Worker localHeaderJars = android.Paths{combinedHeaderJarFile} 1271*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = nil 1272*333d2b36SAndroid Build Coastguard Worker } 1273*333d2b36SAndroid Build Coastguard Worker combinedHeaderJarFile, repackaged := j.repackageFlagsIfNecessary(ctx, combinedHeaderJarFile, jarName, "repackage-turbine") 1274*333d2b36SAndroid Build Coastguard Worker if repackaged { 1275*333d2b36SAndroid Build Coastguard Worker localHeaderJars = android.Paths{combinedHeaderJarFile} 1276*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = nil 1277*333d2b36SAndroid Build Coastguard Worker } 1278*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1279*333d2b36SAndroid Build Coastguard Worker return 1280*333d2b36SAndroid Build Coastguard Worker } 1281*333d2b36SAndroid Build Coastguard Worker j.headerJarFile = combinedHeaderJarFile 1282*333d2b36SAndroid Build Coastguard Worker 1283*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1284*333d2b36SAndroid Build Coastguard Worker if len(localHeaderJars) > 0 { 1285*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(localHeaderJars...) 1286*333d2b36SAndroid Build Coastguard Worker } else { 1287*333d2b36SAndroid Build Coastguard Worker // There are no local sources or resources in this module, so there is nothing to checkbuild. 1288*333d2b36SAndroid Build Coastguard Worker ctx.UncheckedModule() 1289*333d2b36SAndroid Build Coastguard Worker } 1290*333d2b36SAndroid Build Coastguard Worker } else { 1291*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(j.headerJarFile) 1292*333d2b36SAndroid Build Coastguard Worker } 1293*333d2b36SAndroid Build Coastguard Worker 1294*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ 1295*333d2b36SAndroid Build Coastguard Worker HeaderJars: android.PathsIfNonNil(j.headerJarFile), 1296*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars: localHeaderJars, 1297*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, localHeaderJars, transitiveStaticLibsHeaderJars), 1298*333d2b36SAndroid Build Coastguard Worker TransitiveLibsHeaderJarsForR8: j.transitiveLibsHeaderJarsForR8, 1299*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJarsForR8: j.transitiveStaticLibsHeaderJarsForR8, 1300*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs: j.exportAidlIncludeDirs, 1301*333d2b36SAndroid Build Coastguard Worker ExportedPlugins: j.exportedPluginJars, 1302*333d2b36SAndroid Build Coastguard Worker ExportedPluginClasses: j.exportedPluginClasses, 1303*333d2b36SAndroid Build Coastguard Worker ExportedPluginDisableTurbine: j.exportedDisableTurbine, 1304*333d2b36SAndroid Build Coastguard Worker StubsLinkType: j.stubsLinkType, 1305*333d2b36SAndroid Build Coastguard Worker AconfigIntermediateCacheOutputPaths: deps.aconfigProtoFiles, 1306*333d2b36SAndroid Build Coastguard Worker SdkVersion: j.SdkVersion(ctx), 1307*333d2b36SAndroid Build Coastguard Worker }) 1308*333d2b36SAndroid Build Coastguard Worker 1309*333d2b36SAndroid Build Coastguard Worker j.outputFile = j.headerJarFile 1310*333d2b36SAndroid Build Coastguard Worker return 1311*333d2b36SAndroid Build Coastguard Worker } 1312*333d2b36SAndroid Build Coastguard Worker 1313*333d2b36SAndroid Build Coastguard Worker if srcFiles.HasExt(".kt") { 1314*333d2b36SAndroid Build Coastguard Worker // When using kotlin sources turbine is used to generate annotation processor sources, 1315*333d2b36SAndroid Build Coastguard Worker // including for annotation processors that generate API, so we can use turbine for 1316*333d2b36SAndroid Build Coastguard Worker // java sources too. 1317*333d2b36SAndroid Build Coastguard Worker disableTurbine = false 1318*333d2b36SAndroid Build Coastguard Worker 1319*333d2b36SAndroid Build Coastguard Worker // user defined kotlin flags. 1320*333d2b36SAndroid Build Coastguard Worker kotlincFlags := j.properties.Kotlincflags 1321*333d2b36SAndroid Build Coastguard Worker CheckKotlincFlags(ctx, kotlincFlags) 1322*333d2b36SAndroid Build Coastguard Worker 1323*333d2b36SAndroid Build Coastguard Worker // Workaround for KT-46512 1324*333d2b36SAndroid Build Coastguard Worker kotlincFlags = append(kotlincFlags, "-Xsam-conversions=class") 1325*333d2b36SAndroid Build Coastguard Worker 1326*333d2b36SAndroid Build Coastguard Worker // If there are kotlin files, compile them first but pass all the kotlin and java files 1327*333d2b36SAndroid Build Coastguard Worker // kotlinc will use the java files to resolve types referenced by the kotlin files, but 1328*333d2b36SAndroid Build Coastguard Worker // won't emit any classes for them. 1329*333d2b36SAndroid Build Coastguard Worker kotlincFlags = append(kotlincFlags, "-no-stdlib") 1330*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 1331*333d2b36SAndroid Build Coastguard Worker kotlincFlags = append(kotlincFlags, "-no-jdk") 1332*333d2b36SAndroid Build Coastguard Worker } 1333*333d2b36SAndroid Build Coastguard Worker 1334*333d2b36SAndroid Build Coastguard Worker for _, plugin := range deps.kotlinPlugins { 1335*333d2b36SAndroid Build Coastguard Worker kotlincFlags = append(kotlincFlags, "-Xplugin="+plugin.String()) 1336*333d2b36SAndroid Build Coastguard Worker } 1337*333d2b36SAndroid Build Coastguard Worker flags.kotlincDeps = append(flags.kotlincDeps, deps.kotlinPlugins...) 1338*333d2b36SAndroid Build Coastguard Worker 1339*333d2b36SAndroid Build Coastguard Worker if len(kotlincFlags) > 0 { 1340*333d2b36SAndroid Build Coastguard Worker // optimization. 1341*333d2b36SAndroid Build Coastguard Worker ctx.Variable(pctx, "kotlincFlags", strings.Join(kotlincFlags, " ")) 1342*333d2b36SAndroid Build Coastguard Worker flags.kotlincFlags += "$kotlincFlags" 1343*333d2b36SAndroid Build Coastguard Worker } 1344*333d2b36SAndroid Build Coastguard Worker 1345*333d2b36SAndroid Build Coastguard Worker // Collect common .kt files for AIDEGen 1346*333d2b36SAndroid Build Coastguard Worker j.expandIDEInfoCompiledSrcs = append(j.expandIDEInfoCompiledSrcs, kotlinCommonSrcFiles.Strings()...) 1347*333d2b36SAndroid Build Coastguard Worker 1348*333d2b36SAndroid Build Coastguard Worker flags.kotlincClasspath = append(flags.kotlincClasspath, flags.bootClasspath...) 1349*333d2b36SAndroid Build Coastguard Worker flags.kotlincClasspath = append(flags.kotlincClasspath, flags.classpath...) 1350*333d2b36SAndroid Build Coastguard Worker 1351*333d2b36SAndroid Build Coastguard Worker if len(flags.processorPath) > 0 { 1352*333d2b36SAndroid Build Coastguard Worker // Use kapt for annotation processing 1353*333d2b36SAndroid Build Coastguard Worker kaptSrcJar := android.PathForModuleOut(ctx, "kapt", "kapt-sources.jar") 1354*333d2b36SAndroid Build Coastguard Worker kaptResJar := android.PathForModuleOut(ctx, "kapt", "kapt-res.jar") 1355*333d2b36SAndroid Build Coastguard Worker kotlinKapt(ctx, kaptSrcJar, kaptResJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags) 1356*333d2b36SAndroid Build Coastguard Worker srcJars = append(srcJars, kaptSrcJar) 1357*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, kaptResJar) 1358*333d2b36SAndroid Build Coastguard Worker // Disable annotation processing in javac, it's already been handled by kapt 1359*333d2b36SAndroid Build Coastguard Worker flags.processorPath = nil 1360*333d2b36SAndroid Build Coastguard Worker flags.processors = nil 1361*333d2b36SAndroid Build Coastguard Worker } 1362*333d2b36SAndroid Build Coastguard Worker 1363*333d2b36SAndroid Build Coastguard Worker kotlinJar := android.PathForModuleOut(ctx, "kotlin", jarName) 1364*333d2b36SAndroid Build Coastguard Worker kotlinHeaderJar := android.PathForModuleOut(ctx, "kotlin_headers", jarName) 1365*333d2b36SAndroid Build Coastguard Worker j.kotlinCompile(ctx, kotlinJar, kotlinHeaderJar, uniqueSrcFiles, kotlinCommonSrcFiles, srcJars, flags) 1366*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1367*333d2b36SAndroid Build Coastguard Worker return 1368*333d2b36SAndroid Build Coastguard Worker } 1369*333d2b36SAndroid Build Coastguard Worker 1370*333d2b36SAndroid Build Coastguard Worker kotlinJarPath, _ := j.repackageFlagsIfNecessary(ctx, kotlinJar, jarName, "kotlinc") 1371*333d2b36SAndroid Build Coastguard Worker 1372*333d2b36SAndroid Build Coastguard Worker // Make javac rule depend on the kotlinc rule 1373*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(classpath{kotlinHeaderJar}, flags.classpath...) 1374*333d2b36SAndroid Build Coastguard Worker 1375*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, kotlinJarPath) 1376*333d2b36SAndroid Build Coastguard Worker 1377*333d2b36SAndroid Build Coastguard Worker kotlinHeaderJars = append(kotlinHeaderJars, kotlinHeaderJar) 1378*333d2b36SAndroid Build Coastguard Worker } 1379*333d2b36SAndroid Build Coastguard Worker 1380*333d2b36SAndroid Build Coastguard Worker j.compiledSrcJars = srcJars 1381*333d2b36SAndroid Build Coastguard Worker 1382*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars := deps.transitiveStaticLibsHeaderJars 1383*333d2b36SAndroid Build Coastguard Worker 1384*333d2b36SAndroid Build Coastguard Worker enableSharding := false 1385*333d2b36SAndroid Build Coastguard Worker var localHeaderJars android.Paths 1386*333d2b36SAndroid Build Coastguard Worker var shardingHeaderJars android.Paths 1387*333d2b36SAndroid Build Coastguard Worker var repackagedHeaderJarFile android.Path 1388*333d2b36SAndroid Build Coastguard Worker if ctx.Device() && !ctx.Config().IsEnvFalse("TURBINE_ENABLED") && !disableTurbine { 1389*333d2b36SAndroid Build Coastguard Worker if j.properties.Javac_shard_size != nil && *(j.properties.Javac_shard_size) > 0 { 1390*333d2b36SAndroid Build Coastguard Worker enableSharding = true 1391*333d2b36SAndroid Build Coastguard Worker // Formerly, there was a check here that prevented annotation processors 1392*333d2b36SAndroid Build Coastguard Worker // from being used when sharding was enabled, as some annotation processors 1393*333d2b36SAndroid Build Coastguard Worker // do not function correctly in sharded environments. It was removed to 1394*333d2b36SAndroid Build Coastguard Worker // allow for the use of annotation processors that do function correctly 1395*333d2b36SAndroid Build Coastguard Worker // with sharding enabled. See: b/77284273. 1396*333d2b36SAndroid Build Coastguard Worker } 1397*333d2b36SAndroid Build Coastguard Worker extraJars := slices.Clone(kotlinHeaderJars) 1398*333d2b36SAndroid Build Coastguard Worker extraJars = append(extraJars, extraCombinedJars...) 1399*333d2b36SAndroid Build Coastguard Worker var combinedHeaderJarFile android.Path 1400*333d2b36SAndroid Build Coastguard Worker localHeaderJars, combinedHeaderJarFile = j.compileJavaHeader(ctx, uniqueJavaFiles, srcJars, deps, flags, jarName, extraJars) 1401*333d2b36SAndroid Build Coastguard Worker shardingHeaderJars = localHeaderJars 1402*333d2b36SAndroid Build Coastguard Worker 1403*333d2b36SAndroid Build Coastguard Worker var jarjared bool 1404*333d2b36SAndroid Build Coastguard Worker j.headerJarFile, jarjared = j.jarjarIfNecessary(ctx, combinedHeaderJarFile, jarName, "turbine") 1405*333d2b36SAndroid Build Coastguard Worker if jarjared { 1406*333d2b36SAndroid Build Coastguard Worker // jarjar modifies transitive static dependencies, use the combined header jar and drop the transitive 1407*333d2b36SAndroid Build Coastguard Worker // static libs header jars. 1408*333d2b36SAndroid Build Coastguard Worker localHeaderJars = android.Paths{j.headerJarFile} 1409*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = nil 1410*333d2b36SAndroid Build Coastguard Worker } 1411*333d2b36SAndroid Build Coastguard Worker var repackaged bool 1412*333d2b36SAndroid Build Coastguard Worker repackagedHeaderJarFile, repackaged = j.repackageFlagsIfNecessary(ctx, j.headerJarFile, jarName, "turbine") 1413*333d2b36SAndroid Build Coastguard Worker if repackaged { 1414*333d2b36SAndroid Build Coastguard Worker // repackage modifies transitive static dependencies, use the combined header jar and drop the transitive 1415*333d2b36SAndroid Build Coastguard Worker // static libs header jars. 1416*333d2b36SAndroid Build Coastguard Worker // TODO(b/356688296): this shouldn't export both the unmodified and repackaged header jars 1417*333d2b36SAndroid Build Coastguard Worker localHeaderJars = android.Paths{j.headerJarFile, repackagedHeaderJarFile} 1418*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = nil 1419*333d2b36SAndroid Build Coastguard Worker } 1420*333d2b36SAndroid Build Coastguard Worker } 1421*333d2b36SAndroid Build Coastguard Worker if len(uniqueJavaFiles) > 0 || len(srcJars) > 0 { 1422*333d2b36SAndroid Build Coastguard Worker hasErrorproneableFiles := false 1423*333d2b36SAndroid Build Coastguard Worker for _, ext := range j.sourceExtensions { 1424*333d2b36SAndroid Build Coastguard Worker if ext != ".proto" && ext != ".aidl" { 1425*333d2b36SAndroid Build Coastguard Worker // Skip running errorprone on pure proto or pure aidl modules. Some modules take a long time to 1426*333d2b36SAndroid Build Coastguard Worker // compile, and it's not useful to have warnings on these generated sources. 1427*333d2b36SAndroid Build Coastguard Worker hasErrorproneableFiles = true 1428*333d2b36SAndroid Build Coastguard Worker break 1429*333d2b36SAndroid Build Coastguard Worker } 1430*333d2b36SAndroid Build Coastguard Worker } 1431*333d2b36SAndroid Build Coastguard Worker var extraJarDeps android.Paths 1432*333d2b36SAndroid Build Coastguard Worker if Bool(j.properties.Errorprone.Enabled) { 1433*333d2b36SAndroid Build Coastguard Worker // If error-prone is enabled, enable errorprone flags on the regular 1434*333d2b36SAndroid Build Coastguard Worker // build. 1435*333d2b36SAndroid Build Coastguard Worker flags = enableErrorproneFlags(flags) 1436*333d2b36SAndroid Build Coastguard Worker } else if hasErrorproneableFiles && ctx.Config().RunErrorProne() && j.properties.Errorprone.Enabled == nil { 1437*333d2b36SAndroid Build Coastguard Worker // Otherwise, if the RUN_ERROR_PRONE environment variable is set, create 1438*333d2b36SAndroid Build Coastguard Worker // a new jar file just for compiling with the errorprone compiler to. 1439*333d2b36SAndroid Build Coastguard Worker // This is because we don't want to cause the java files to get completely 1440*333d2b36SAndroid Build Coastguard Worker // rebuilt every time the state of the RUN_ERROR_PRONE variable changes. 1441*333d2b36SAndroid Build Coastguard Worker // We also don't want to run this if errorprone is enabled by default for 1442*333d2b36SAndroid Build Coastguard Worker // this module, or else we could have duplicated errorprone messages. 1443*333d2b36SAndroid Build Coastguard Worker errorproneFlags := enableErrorproneFlags(flags) 1444*333d2b36SAndroid Build Coastguard Worker errorprone := android.PathForModuleOut(ctx, "errorprone", jarName) 1445*333d2b36SAndroid Build Coastguard Worker errorproneAnnoSrcJar := android.PathForModuleOut(ctx, "errorprone", "anno.srcjar") 1446*333d2b36SAndroid Build Coastguard Worker 1447*333d2b36SAndroid Build Coastguard Worker transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, errorproneFlags, nil, 1448*333d2b36SAndroid Build Coastguard Worker "errorprone", "errorprone") 1449*333d2b36SAndroid Build Coastguard Worker 1450*333d2b36SAndroid Build Coastguard Worker extraJarDeps = append(extraJarDeps, errorprone) 1451*333d2b36SAndroid Build Coastguard Worker } 1452*333d2b36SAndroid Build Coastguard Worker 1453*333d2b36SAndroid Build Coastguard Worker if enableSharding { 1454*333d2b36SAndroid Build Coastguard Worker if len(shardingHeaderJars) > 0 { 1455*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(classpath(slices.Clone(shardingHeaderJars)), flags.classpath...) 1456*333d2b36SAndroid Build Coastguard Worker } 1457*333d2b36SAndroid Build Coastguard Worker shardSize := int(*(j.properties.Javac_shard_size)) 1458*333d2b36SAndroid Build Coastguard Worker var shardSrcs []android.Paths 1459*333d2b36SAndroid Build Coastguard Worker if len(uniqueJavaFiles) > 0 { 1460*333d2b36SAndroid Build Coastguard Worker shardSrcs = android.ShardPaths(uniqueJavaFiles, shardSize) 1461*333d2b36SAndroid Build Coastguard Worker for idx, shardSrc := range shardSrcs { 1462*333d2b36SAndroid Build Coastguard Worker classes := j.compileJavaClasses(ctx, jarName, idx, shardSrc, 1463*333d2b36SAndroid Build Coastguard Worker nil, flags, extraJarDeps) 1464*333d2b36SAndroid Build Coastguard Worker classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(idx)) 1465*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, classes) 1466*333d2b36SAndroid Build Coastguard Worker } 1467*333d2b36SAndroid Build Coastguard Worker } 1468*333d2b36SAndroid Build Coastguard Worker // Assume approximately 5 sources per srcjar. 1469*333d2b36SAndroid Build Coastguard Worker // For framework-minus-apex in AOSP at the time this was written, there are 266 srcjars, with a mean 1470*333d2b36SAndroid Build Coastguard Worker // of 5.8 sources per srcjar, but a median of 1, a standard deviation of 10, and a max of 48 source files. 1471*333d2b36SAndroid Build Coastguard Worker if len(srcJars) > 0 { 1472*333d2b36SAndroid Build Coastguard Worker startIdx := len(shardSrcs) 1473*333d2b36SAndroid Build Coastguard Worker shardSrcJarsList := android.ShardPaths(srcJars, shardSize/5) 1474*333d2b36SAndroid Build Coastguard Worker for idx, shardSrcJars := range shardSrcJarsList { 1475*333d2b36SAndroid Build Coastguard Worker classes := j.compileJavaClasses(ctx, jarName, startIdx+idx, 1476*333d2b36SAndroid Build Coastguard Worker nil, shardSrcJars, flags, extraJarDeps) 1477*333d2b36SAndroid Build Coastguard Worker classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac-"+strconv.Itoa(startIdx+idx)) 1478*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, classes) 1479*333d2b36SAndroid Build Coastguard Worker } 1480*333d2b36SAndroid Build Coastguard Worker } 1481*333d2b36SAndroid Build Coastguard Worker } else { 1482*333d2b36SAndroid Build Coastguard Worker classes := j.compileJavaClasses(ctx, jarName, -1, uniqueJavaFiles, srcJars, flags, extraJarDeps) 1483*333d2b36SAndroid Build Coastguard Worker classes, _ = j.repackageFlagsIfNecessary(ctx, classes, jarName, "javac") 1484*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, classes) 1485*333d2b36SAndroid Build Coastguard Worker } 1486*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1487*333d2b36SAndroid Build Coastguard Worker return 1488*333d2b36SAndroid Build Coastguard Worker } 1489*333d2b36SAndroid Build Coastguard Worker } 1490*333d2b36SAndroid Build Coastguard Worker 1491*333d2b36SAndroid Build Coastguard Worker localImplementationJars = append(localImplementationJars, extraCombinedJars...) 1492*333d2b36SAndroid Build Coastguard Worker 1493*333d2b36SAndroid Build Coastguard Worker j.srcJarArgs, j.srcJarDeps = resourcePathsToJarArgs(srcFiles), srcFiles 1494*333d2b36SAndroid Build Coastguard Worker 1495*333d2b36SAndroid Build Coastguard Worker var includeSrcJar android.WritablePath 1496*333d2b36SAndroid Build Coastguard Worker if Bool(j.properties.Include_srcs) { 1497*333d2b36SAndroid Build Coastguard Worker includeSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+".srcjar") 1498*333d2b36SAndroid Build Coastguard Worker TransformResourcesToJar(ctx, includeSrcJar, j.srcJarArgs, j.srcJarDeps) 1499*333d2b36SAndroid Build Coastguard Worker } 1500*333d2b36SAndroid Build Coastguard Worker 1501*333d2b36SAndroid Build Coastguard Worker dirArgs, dirDeps := ResourceDirsToJarArgs(ctx, j.properties.Java_resource_dirs, 1502*333d2b36SAndroid Build Coastguard Worker j.properties.Exclude_java_resource_dirs, j.properties.Exclude_java_resources) 1503*333d2b36SAndroid Build Coastguard Worker fileArgs, fileDeps := ResourceFilesToJarArgs(ctx, j.properties.Java_resources.GetOrDefault(ctx, nil), j.properties.Exclude_java_resources) 1504*333d2b36SAndroid Build Coastguard Worker fileArgs2, fileDeps2 := ResourceFilesToJarArgs(ctx, j.properties.Device_common_java_resources.GetOrDefault(ctx, nil), nil) 1505*333d2b36SAndroid Build Coastguard Worker fileArgs3, fileDeps3 := ResourceFilesToJarArgs(ctx, j.properties.Device_first_java_resources.GetOrDefault(ctx, nil), nil) 1506*333d2b36SAndroid Build Coastguard Worker fileArgs = slices.Concat(fileArgs, fileArgs2, fileArgs3) 1507*333d2b36SAndroid Build Coastguard Worker fileDeps = slices.Concat(fileDeps, fileDeps2, fileDeps3) 1508*333d2b36SAndroid Build Coastguard Worker extraArgs, extraDeps := resourcePathsToJarArgs(j.extraResources), j.extraResources 1509*333d2b36SAndroid Build Coastguard Worker 1510*333d2b36SAndroid Build Coastguard Worker var resArgs []string 1511*333d2b36SAndroid Build Coastguard Worker var resDeps android.Paths 1512*333d2b36SAndroid Build Coastguard Worker 1513*333d2b36SAndroid Build Coastguard Worker resArgs = append(resArgs, dirArgs...) 1514*333d2b36SAndroid Build Coastguard Worker resDeps = append(resDeps, dirDeps...) 1515*333d2b36SAndroid Build Coastguard Worker 1516*333d2b36SAndroid Build Coastguard Worker resArgs = append(resArgs, fileArgs...) 1517*333d2b36SAndroid Build Coastguard Worker resDeps = append(resDeps, fileDeps...) 1518*333d2b36SAndroid Build Coastguard Worker 1519*333d2b36SAndroid Build Coastguard Worker resArgs = append(resArgs, extraArgs...) 1520*333d2b36SAndroid Build Coastguard Worker resDeps = append(resDeps, extraDeps...) 1521*333d2b36SAndroid Build Coastguard Worker 1522*333d2b36SAndroid Build Coastguard Worker var localResourceJars android.Paths 1523*333d2b36SAndroid Build Coastguard Worker if len(resArgs) > 0 { 1524*333d2b36SAndroid Build Coastguard Worker resourceJar := android.PathForModuleOut(ctx, "res", jarName) 1525*333d2b36SAndroid Build Coastguard Worker TransformResourcesToJar(ctx, resourceJar, resArgs, resDeps) 1526*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1527*333d2b36SAndroid Build Coastguard Worker return 1528*333d2b36SAndroid Build Coastguard Worker } 1529*333d2b36SAndroid Build Coastguard Worker localResourceJars = append(localResourceJars, resourceJar) 1530*333d2b36SAndroid Build Coastguard Worker } 1531*333d2b36SAndroid Build Coastguard Worker 1532*333d2b36SAndroid Build Coastguard Worker if Bool(j.properties.Include_srcs) { 1533*333d2b36SAndroid Build Coastguard Worker localResourceJars = append(localResourceJars, includeSrcJar) 1534*333d2b36SAndroid Build Coastguard Worker } 1535*333d2b36SAndroid Build Coastguard Worker 1536*333d2b36SAndroid Build Coastguard Worker services := android.PathsForModuleSrc(ctx, j.properties.Services) 1537*333d2b36SAndroid Build Coastguard Worker if len(services) > 0 { 1538*333d2b36SAndroid Build Coastguard Worker servicesJar := android.PathForModuleOut(ctx, "services", jarName) 1539*333d2b36SAndroid Build Coastguard Worker var zipargs []string 1540*333d2b36SAndroid Build Coastguard Worker for _, file := range services { 1541*333d2b36SAndroid Build Coastguard Worker serviceFile := file.String() 1542*333d2b36SAndroid Build Coastguard Worker zipargs = append(zipargs, "-C", filepath.Dir(serviceFile), "-f", serviceFile) 1543*333d2b36SAndroid Build Coastguard Worker } 1544*333d2b36SAndroid Build Coastguard Worker rule := zip 1545*333d2b36SAndroid Build Coastguard Worker args := map[string]string{ 1546*333d2b36SAndroid Build Coastguard Worker "jarArgs": "-P META-INF/services/ " + strings.Join(proptools.NinjaAndShellEscapeList(zipargs), " "), 1547*333d2b36SAndroid Build Coastguard Worker } 1548*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_ZIP") { 1549*333d2b36SAndroid Build Coastguard Worker rule = zipRE 1550*333d2b36SAndroid Build Coastguard Worker args["implicits"] = strings.Join(services.Strings(), ",") 1551*333d2b36SAndroid Build Coastguard Worker } 1552*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1553*333d2b36SAndroid Build Coastguard Worker Rule: rule, 1554*333d2b36SAndroid Build Coastguard Worker Output: servicesJar, 1555*333d2b36SAndroid Build Coastguard Worker Implicits: services, 1556*333d2b36SAndroid Build Coastguard Worker Args: args, 1557*333d2b36SAndroid Build Coastguard Worker }) 1558*333d2b36SAndroid Build Coastguard Worker localResourceJars = append(localResourceJars, servicesJar) 1559*333d2b36SAndroid Build Coastguard Worker } 1560*333d2b36SAndroid Build Coastguard Worker 1561*333d2b36SAndroid Build Coastguard Worker completeStaticLibsResourceJars := depset.New(depset.PREORDER, localResourceJars, deps.transitiveStaticLibsResourceJars) 1562*333d2b36SAndroid Build Coastguard Worker 1563*333d2b36SAndroid Build Coastguard Worker var combinedResourceJar android.Path 1564*333d2b36SAndroid Build Coastguard Worker var resourceJars android.Paths 1565*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1566*333d2b36SAndroid Build Coastguard Worker resourceJars = completeStaticLibsResourceJars.ToList() 1567*333d2b36SAndroid Build Coastguard Worker } else { 1568*333d2b36SAndroid Build Coastguard Worker resourceJars = append(slices.Clone(localResourceJars), deps.staticResourceJars...) 1569*333d2b36SAndroid Build Coastguard Worker } 1570*333d2b36SAndroid Build Coastguard Worker if len(resourceJars) == 1 { 1571*333d2b36SAndroid Build Coastguard Worker combinedResourceJar = resourceJars[0] 1572*333d2b36SAndroid Build Coastguard Worker } else if len(resourceJars) > 0 { 1573*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName) 1574*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", resourceJars, android.OptionalPath{}, 1575*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1576*333d2b36SAndroid Build Coastguard Worker combinedResourceJar = combinedJar 1577*333d2b36SAndroid Build Coastguard Worker } 1578*333d2b36SAndroid Build Coastguard Worker 1579*333d2b36SAndroid Build Coastguard Worker manifest := j.overrideManifest 1580*333d2b36SAndroid Build Coastguard Worker if !manifest.Valid() && j.properties.Manifest != nil { 1581*333d2b36SAndroid Build Coastguard Worker manifest = android.OptionalPathForPath(android.PathForModuleSrc(ctx, *j.properties.Manifest)) 1582*333d2b36SAndroid Build Coastguard Worker } 1583*333d2b36SAndroid Build Coastguard Worker 1584*333d2b36SAndroid Build Coastguard Worker // Combine the classes built from sources, any manifests, and any static libraries into 1585*333d2b36SAndroid Build Coastguard Worker // classes.jar. If there is only one input jar this step will be skipped. 1586*333d2b36SAndroid Build Coastguard Worker var outputFile android.Path 1587*333d2b36SAndroid Build Coastguard Worker 1588*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars := depset.New(depset.PREORDER, localImplementationJars, deps.transitiveStaticLibsImplementationJars) 1589*333d2b36SAndroid Build Coastguard Worker 1590*333d2b36SAndroid Build Coastguard Worker var jars android.Paths 1591*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1592*333d2b36SAndroid Build Coastguard Worker jars = completeStaticLibsImplementationJars.ToList() 1593*333d2b36SAndroid Build Coastguard Worker } else { 1594*333d2b36SAndroid Build Coastguard Worker jars = append(slices.Clone(localImplementationJars), deps.staticJars...) 1595*333d2b36SAndroid Build Coastguard Worker } 1596*333d2b36SAndroid Build Coastguard Worker 1597*333d2b36SAndroid Build Coastguard Worker jars = append(jars, extraDepCombinedJars...) 1598*333d2b36SAndroid Build Coastguard Worker 1599*333d2b36SAndroid Build Coastguard Worker if len(jars) == 1 && !manifest.Valid() { 1600*333d2b36SAndroid Build Coastguard Worker // Optimization: skip the combine step as there is nothing to do 1601*333d2b36SAndroid Build Coastguard Worker // TODO(ccross): this leaves any module-info.class files, but those should only come from 1602*333d2b36SAndroid Build Coastguard Worker // prebuilt dependencies until we support modules in the platform build, so there shouldn't be 1603*333d2b36SAndroid Build Coastguard Worker // any if len(extraJars) == 0. 1604*333d2b36SAndroid Build Coastguard Worker 1605*333d2b36SAndroid Build Coastguard Worker // moduleStubLinkType determines if the module is the TopLevelStubLibrary generated 1606*333d2b36SAndroid Build Coastguard Worker // from sdk_library. The TopLevelStubLibrary contains only one static lib, 1607*333d2b36SAndroid Build Coastguard Worker // either with .from-source or .from-text suffix. 1608*333d2b36SAndroid Build Coastguard Worker // outputFile should be agnostic to the build configuration, 1609*333d2b36SAndroid Build Coastguard Worker // thus copy the single input static lib in order to prevent the static lib from being exposed 1610*333d2b36SAndroid Build Coastguard Worker // to the copy rules. 1611*333d2b36SAndroid Build Coastguard Worker if stub, _ := moduleStubLinkType(j); stub { 1612*333d2b36SAndroid Build Coastguard Worker copiedJar := android.PathForModuleOut(ctx, "combined", jarName) 1613*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1614*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 1615*333d2b36SAndroid Build Coastguard Worker Input: jars[0], 1616*333d2b36SAndroid Build Coastguard Worker Output: copiedJar, 1617*333d2b36SAndroid Build Coastguard Worker }) 1618*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, android.Paths{copiedJar}, nil) 1619*333d2b36SAndroid Build Coastguard Worker outputFile = copiedJar 1620*333d2b36SAndroid Build Coastguard Worker } else { 1621*333d2b36SAndroid Build Coastguard Worker outputFile = jars[0] 1622*333d2b36SAndroid Build Coastguard Worker } 1623*333d2b36SAndroid Build Coastguard Worker } else { 1624*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "combined", jarName) 1625*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for javac", jars, manifest, 1626*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1627*333d2b36SAndroid Build Coastguard Worker outputFile = combinedJar 1628*333d2b36SAndroid Build Coastguard Worker } 1629*333d2b36SAndroid Build Coastguard Worker 1630*333d2b36SAndroid Build Coastguard Worker // jarjar implementation jar if necessary 1631*333d2b36SAndroid Build Coastguard Worker jarjarFile, jarjarred := j.jarjarIfNecessary(ctx, outputFile, jarName, "") 1632*333d2b36SAndroid Build Coastguard Worker if jarjarred { 1633*333d2b36SAndroid Build Coastguard Worker localImplementationJars = android.Paths{jarjarFile} 1634*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, localImplementationJars, nil) 1635*333d2b36SAndroid Build Coastguard Worker } 1636*333d2b36SAndroid Build Coastguard Worker outputFile = jarjarFile 1637*333d2b36SAndroid Build Coastguard Worker 1638*333d2b36SAndroid Build Coastguard Worker // jarjar resource jar if necessary 1639*333d2b36SAndroid Build Coastguard Worker if combinedResourceJar != nil { 1640*333d2b36SAndroid Build Coastguard Worker resourceJarJarFile, jarjarred := j.jarjarIfNecessary(ctx, combinedResourceJar, jarName, "resource") 1641*333d2b36SAndroid Build Coastguard Worker combinedResourceJar = resourceJarJarFile 1642*333d2b36SAndroid Build Coastguard Worker if jarjarred { 1643*333d2b36SAndroid Build Coastguard Worker localResourceJars = android.Paths{resourceJarJarFile} 1644*333d2b36SAndroid Build Coastguard Worker completeStaticLibsResourceJars = depset.New(depset.PREORDER, localResourceJars, nil) 1645*333d2b36SAndroid Build Coastguard Worker } 1646*333d2b36SAndroid Build Coastguard Worker } 1647*333d2b36SAndroid Build Coastguard Worker 1648*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1649*333d2b36SAndroid Build Coastguard Worker return 1650*333d2b36SAndroid Build Coastguard Worker } 1651*333d2b36SAndroid Build Coastguard Worker 1652*333d2b36SAndroid Build Coastguard Worker if j.ravenizer.enabled { 1653*333d2b36SAndroid Build Coastguard Worker ravenizerInput := outputFile 1654*333d2b36SAndroid Build Coastguard Worker ravenizerOutput := android.PathForModuleOut(ctx, "ravenizer", "", jarName) 1655*333d2b36SAndroid Build Coastguard Worker ravenizerArgs := "" 1656*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(j.properties.Ravenizer.Strip_mockito) { 1657*333d2b36SAndroid Build Coastguard Worker ravenizerArgs = "--strip-mockito" 1658*333d2b36SAndroid Build Coastguard Worker } 1659*333d2b36SAndroid Build Coastguard Worker TransformRavenizer(ctx, ravenizerOutput, ravenizerInput, ravenizerArgs) 1660*333d2b36SAndroid Build Coastguard Worker outputFile = ravenizerOutput 1661*333d2b36SAndroid Build Coastguard Worker localImplementationJars = android.Paths{ravenizerOutput} 1662*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, localImplementationJars, nil) 1663*333d2b36SAndroid Build Coastguard Worker if combinedResourceJar != nil { 1664*333d2b36SAndroid Build Coastguard Worker ravenizerInput = combinedResourceJar 1665*333d2b36SAndroid Build Coastguard Worker ravenizerOutput = android.PathForModuleOut(ctx, "ravenizer", "resources", jarName) 1666*333d2b36SAndroid Build Coastguard Worker TransformRavenizer(ctx, ravenizerOutput, ravenizerInput, ravenizerArgs) 1667*333d2b36SAndroid Build Coastguard Worker combinedResourceJar = ravenizerOutput 1668*333d2b36SAndroid Build Coastguard Worker localResourceJars = android.Paths{ravenizerOutput} 1669*333d2b36SAndroid Build Coastguard Worker completeStaticLibsResourceJars = depset.New(depset.PREORDER, localResourceJars, nil) 1670*333d2b36SAndroid Build Coastguard Worker } 1671*333d2b36SAndroid Build Coastguard Worker } 1672*333d2b36SAndroid Build Coastguard Worker 1673*333d2b36SAndroid Build Coastguard Worker if j.shouldApiMapper() { 1674*333d2b36SAndroid Build Coastguard Worker inputFile := outputFile 1675*333d2b36SAndroid Build Coastguard Worker apiMapperFile := android.PathForModuleOut(ctx, "apimapper", jarName) 1676*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1677*333d2b36SAndroid Build Coastguard Worker Rule: apimapper, 1678*333d2b36SAndroid Build Coastguard Worker Description: "apimapper", 1679*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1680*333d2b36SAndroid Build Coastguard Worker Output: apiMapperFile, 1681*333d2b36SAndroid Build Coastguard Worker }) 1682*333d2b36SAndroid Build Coastguard Worker outputFile = apiMapperFile 1683*333d2b36SAndroid Build Coastguard Worker localImplementationJars = android.Paths{apiMapperFile} 1684*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, localImplementationJars, nil) 1685*333d2b36SAndroid Build Coastguard Worker } 1686*333d2b36SAndroid Build Coastguard Worker 1687*333d2b36SAndroid Build Coastguard Worker // Check package restrictions if necessary. 1688*333d2b36SAndroid Build Coastguard Worker if len(j.properties.Permitted_packages) > 0 { 1689*333d2b36SAndroid Build Coastguard Worker // Time stamp file created by the package check rule. 1690*333d2b36SAndroid Build Coastguard Worker pkgckFile := android.PathForModuleOut(ctx, "package-check.stamp") 1691*333d2b36SAndroid Build Coastguard Worker 1692*333d2b36SAndroid Build Coastguard Worker // Create a rule to copy the output jar to another path and add a validate dependency that 1693*333d2b36SAndroid Build Coastguard Worker // will check that the jar only contains the permitted packages. The new location will become 1694*333d2b36SAndroid Build Coastguard Worker // the output file of this module. 1695*333d2b36SAndroid Build Coastguard Worker inputFile := outputFile 1696*333d2b36SAndroid Build Coastguard Worker packageCheckOutputFile := android.PathForModuleOut(ctx, "package-check", jarName) 1697*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1698*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 1699*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 1700*333d2b36SAndroid Build Coastguard Worker Output: packageCheckOutputFile, 1701*333d2b36SAndroid Build Coastguard Worker // Make sure that any dependency on the output file will cause ninja to run the package check 1702*333d2b36SAndroid Build Coastguard Worker // rule. 1703*333d2b36SAndroid Build Coastguard Worker Validation: pkgckFile, 1704*333d2b36SAndroid Build Coastguard Worker }) 1705*333d2b36SAndroid Build Coastguard Worker outputFile = packageCheckOutputFile 1706*333d2b36SAndroid Build Coastguard Worker localImplementationJars = android.Paths{packageCheckOutputFile} 1707*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, localImplementationJars, nil) 1708*333d2b36SAndroid Build Coastguard Worker 1709*333d2b36SAndroid Build Coastguard Worker // Check packages and create a timestamp file when complete. 1710*333d2b36SAndroid Build Coastguard Worker CheckJarPackages(ctx, pkgckFile, outputFile, j.properties.Permitted_packages) 1711*333d2b36SAndroid Build Coastguard Worker 1712*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1713*333d2b36SAndroid Build Coastguard Worker return 1714*333d2b36SAndroid Build Coastguard Worker } 1715*333d2b36SAndroid Build Coastguard Worker } 1716*333d2b36SAndroid Build Coastguard Worker 1717*333d2b36SAndroid Build Coastguard Worker j.implementationJarFile = outputFile 1718*333d2b36SAndroid Build Coastguard Worker if j.headerJarFile == nil { 1719*333d2b36SAndroid Build Coastguard Worker // If this module couldn't generate a header jar (for example due to api generating annotation processors) 1720*333d2b36SAndroid Build Coastguard Worker // then use the implementation jar. Run it through zip2zip first to remove any files in META-INF/services 1721*333d2b36SAndroid Build Coastguard Worker // so that javac on modules that depend on this module don't pick up annotation processors (which may be 1722*333d2b36SAndroid Build Coastguard Worker // missing their implementations) from META-INF/services/javax.annotation.processing.Processor. 1723*333d2b36SAndroid Build Coastguard Worker headerJarFile := android.PathForModuleOut(ctx, "javac-header", jarName) 1724*333d2b36SAndroid Build Coastguard Worker convertImplementationJarToHeaderJar(ctx, j.implementationJarFile, headerJarFile) 1725*333d2b36SAndroid Build Coastguard Worker j.headerJarFile = headerJarFile 1726*333d2b36SAndroid Build Coastguard Worker if len(localImplementationJars) == 1 && ctx.Config().UseTransitiveJarsInClasspath() { 1727*333d2b36SAndroid Build Coastguard Worker localHeaderJarFile := android.PathForModuleOut(ctx, "local-javac-header", jarName) 1728*333d2b36SAndroid Build Coastguard Worker convertImplementationJarToHeaderJar(ctx, localImplementationJars[0], localHeaderJarFile) 1729*333d2b36SAndroid Build Coastguard Worker localHeaderJars = append(localHeaderJars, localHeaderJarFile) 1730*333d2b36SAndroid Build Coastguard Worker } else { 1731*333d2b36SAndroid Build Coastguard Worker localHeaderJars = append(localHeaderJars, headerJarFile) 1732*333d2b36SAndroid Build Coastguard Worker } 1733*333d2b36SAndroid Build Coastguard Worker } 1734*333d2b36SAndroid Build Coastguard Worker 1735*333d2b36SAndroid Build Coastguard Worker // enforce syntax check to jacoco filters for any build (http://b/183622051) 1736*333d2b36SAndroid Build Coastguard Worker specs := j.jacocoModuleToZipCommand(ctx) 1737*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1738*333d2b36SAndroid Build Coastguard Worker return 1739*333d2b36SAndroid Build Coastguard Worker } 1740*333d2b36SAndroid Build Coastguard Worker 1741*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJarsToCombine := completeStaticLibsImplementationJars 1742*333d2b36SAndroid Build Coastguard Worker 1743*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 1744*333d2b36SAndroid Build Coastguard Worker 1745*333d2b36SAndroid Build Coastguard Worker // Enable dex compilation for the APEX variants, unless it is disabled explicitly 1746*333d2b36SAndroid Build Coastguard Worker compileDex := Bool(j.dexProperties.Compile_dex) || Bool(j.properties.Installable) 1747*333d2b36SAndroid Build Coastguard Worker 1748*333d2b36SAndroid Build Coastguard Worker if j.shouldInstrument(ctx) && (!ctx.Device() || compileDex) { 1749*333d2b36SAndroid Build Coastguard Worker instrumentedOutputFile := j.instrument(ctx, flags, outputFile, jarName, specs) 1750*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJarsToCombine = depset.New(depset.PREORDER, android.Paths{instrumentedOutputFile}, nil) 1751*333d2b36SAndroid Build Coastguard Worker outputFile = instrumentedOutputFile 1752*333d2b36SAndroid Build Coastguard Worker } 1753*333d2b36SAndroid Build Coastguard Worker 1754*333d2b36SAndroid Build Coastguard Worker // merge implementation jar with resources if necessary 1755*333d2b36SAndroid Build Coastguard Worker var implementationAndResourcesJarsToCombine android.Paths 1756*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1757*333d2b36SAndroid Build Coastguard Worker resourceJars := completeStaticLibsResourceJars.ToList() 1758*333d2b36SAndroid Build Coastguard Worker if len(resourceJars) > 0 { 1759*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJarsToCombine = append(resourceJars, completeStaticLibsImplementationJarsToCombine.ToList()...) 1760*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJarsToCombine = append(implementationAndResourcesJarsToCombine, extraDepCombinedJars...) 1761*333d2b36SAndroid Build Coastguard Worker } 1762*333d2b36SAndroid Build Coastguard Worker } else { 1763*333d2b36SAndroid Build Coastguard Worker if combinedResourceJar != nil { 1764*333d2b36SAndroid Build Coastguard Worker implementationAndResourcesJarsToCombine = android.Paths{combinedResourceJar, outputFile} 1765*333d2b36SAndroid Build Coastguard Worker } 1766*333d2b36SAndroid Build Coastguard Worker } 1767*333d2b36SAndroid Build Coastguard Worker 1768*333d2b36SAndroid Build Coastguard Worker if len(implementationAndResourcesJarsToCombine) > 0 { 1769*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "withres", jarName) 1770*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", implementationAndResourcesJarsToCombine, manifest, 1771*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1772*333d2b36SAndroid Build Coastguard Worker outputFile = combinedJar 1773*333d2b36SAndroid Build Coastguard Worker } 1774*333d2b36SAndroid Build Coastguard Worker 1775*333d2b36SAndroid Build Coastguard Worker j.implementationAndResourcesJar = outputFile 1776*333d2b36SAndroid Build Coastguard Worker 1777*333d2b36SAndroid Build Coastguard Worker if ctx.Device() && compileDex { 1778*333d2b36SAndroid Build Coastguard Worker if j.hasCode(ctx) { 1779*333d2b36SAndroid Build Coastguard Worker if j.shouldInstrumentStatic(ctx) { 1780*333d2b36SAndroid Build Coastguard Worker j.dexer.extraProguardFlagsFiles = append(j.dexer.extraProguardFlagsFiles, 1781*333d2b36SAndroid Build Coastguard Worker android.PathForSource(ctx, "build/make/core/proguard.jacoco.flags")) 1782*333d2b36SAndroid Build Coastguard Worker } 1783*333d2b36SAndroid Build Coastguard Worker // Dex compilation 1784*333d2b36SAndroid Build Coastguard Worker var dexOutputFile android.Path 1785*333d2b36SAndroid Build Coastguard Worker params := &compileDexParams{ 1786*333d2b36SAndroid Build Coastguard Worker flags: flags, 1787*333d2b36SAndroid Build Coastguard Worker sdkVersion: j.SdkVersion(ctx), 1788*333d2b36SAndroid Build Coastguard Worker minSdkVersion: j.MinSdkVersion(ctx), 1789*333d2b36SAndroid Build Coastguard Worker classesJar: outputFile, 1790*333d2b36SAndroid Build Coastguard Worker jarName: jarName, 1791*333d2b36SAndroid Build Coastguard Worker } 1792*333d2b36SAndroid Build Coastguard Worker if j.GetProfileGuided(ctx) && j.optimizeOrObfuscateEnabled() && !j.EnableProfileRewriting(ctx) { 1793*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("enable_profile_rewriting", 1794*333d2b36SAndroid Build Coastguard Worker "Enable_profile_rewriting must be true when profile_guided dexpreopt and R8 optimization/obfuscation is turned on. The attached profile should be sourced from an unoptimized/unobfuscated APK.", 1795*333d2b36SAndroid Build Coastguard Worker ) 1796*333d2b36SAndroid Build Coastguard Worker } 1797*333d2b36SAndroid Build Coastguard Worker if j.EnableProfileRewriting(ctx) { 1798*333d2b36SAndroid Build Coastguard Worker profile := j.GetProfile(ctx) 1799*333d2b36SAndroid Build Coastguard Worker if profile == "" || !j.GetProfileGuided(ctx) { 1800*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("enable_profile_rewriting", "Profile and Profile_guided must be set when enable_profile_rewriting is true") 1801*333d2b36SAndroid Build Coastguard Worker } 1802*333d2b36SAndroid Build Coastguard Worker params.artProfileInput = &profile 1803*333d2b36SAndroid Build Coastguard Worker } 1804*333d2b36SAndroid Build Coastguard Worker dexOutputFile, dexArtProfileOutput := j.dexer.compileDex(ctx, params) 1805*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1806*333d2b36SAndroid Build Coastguard Worker return 1807*333d2b36SAndroid Build Coastguard Worker } 1808*333d2b36SAndroid Build Coastguard Worker 1809*333d2b36SAndroid Build Coastguard Worker // If r8/d8 provides a profile that matches the optimized dex, use that for dexpreopt. 1810*333d2b36SAndroid Build Coastguard Worker if dexArtProfileOutput != nil { 1811*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.SetRewrittenProfile(dexArtProfileOutput) 1812*333d2b36SAndroid Build Coastguard Worker } 1813*333d2b36SAndroid Build Coastguard Worker 1814*333d2b36SAndroid Build Coastguard Worker // merge dex jar with resources if necessary 1815*333d2b36SAndroid Build Coastguard Worker var dexAndResourceJarsToCombine android.Paths 1816*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1817*333d2b36SAndroid Build Coastguard Worker resourceJars := completeStaticLibsResourceJars.ToList() 1818*333d2b36SAndroid Build Coastguard Worker if len(resourceJars) > 0 { 1819*333d2b36SAndroid Build Coastguard Worker dexAndResourceJarsToCombine = append(android.Paths{dexOutputFile}, resourceJars...) 1820*333d2b36SAndroid Build Coastguard Worker } 1821*333d2b36SAndroid Build Coastguard Worker } else { 1822*333d2b36SAndroid Build Coastguard Worker if combinedResourceJar != nil { 1823*333d2b36SAndroid Build Coastguard Worker dexAndResourceJarsToCombine = android.Paths{dexOutputFile, combinedResourceJar} 1824*333d2b36SAndroid Build Coastguard Worker } 1825*333d2b36SAndroid Build Coastguard Worker } 1826*333d2b36SAndroid Build Coastguard Worker if len(dexAndResourceJarsToCombine) > 0 { 1827*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "dex-withres", jarName) 1828*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for dex resources", dexAndResourceJarsToCombine, android.OptionalPath{}, 1829*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 1830*333d2b36SAndroid Build Coastguard Worker if *j.dexProperties.Uncompress_dex { 1831*333d2b36SAndroid Build Coastguard Worker combinedAlignedJar := android.PathForModuleOut(ctx, "dex-withres-aligned", jarName) 1832*333d2b36SAndroid Build Coastguard Worker TransformZipAlign(ctx, combinedAlignedJar, combinedJar, nil) 1833*333d2b36SAndroid Build Coastguard Worker dexOutputFile = combinedAlignedJar 1834*333d2b36SAndroid Build Coastguard Worker } else { 1835*333d2b36SAndroid Build Coastguard Worker dexOutputFile = combinedJar 1836*333d2b36SAndroid Build Coastguard Worker } 1837*333d2b36SAndroid Build Coastguard Worker } 1838*333d2b36SAndroid Build Coastguard Worker 1839*333d2b36SAndroid Build Coastguard Worker // Initialize the hiddenapi structure. 1840*333d2b36SAndroid Build Coastguard Worker 1841*333d2b36SAndroid Build Coastguard Worker j.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), j.implementationJarFile, j.dexProperties.Uncompress_dex) 1842*333d2b36SAndroid Build Coastguard Worker 1843*333d2b36SAndroid Build Coastguard Worker // Encode hidden API flags in dex file, if needed. 1844*333d2b36SAndroid Build Coastguard Worker dexOutputFile = j.hiddenAPIEncodeDex(ctx, dexOutputFile) 1845*333d2b36SAndroid Build Coastguard Worker 1846*333d2b36SAndroid Build Coastguard Worker j.dexJarFile = makeDexJarPathFromPath(dexOutputFile) 1847*333d2b36SAndroid Build Coastguard Worker 1848*333d2b36SAndroid Build Coastguard Worker // Dexpreopting 1849*333d2b36SAndroid Build Coastguard Worker libName := android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()) 1850*333d2b36SAndroid Build Coastguard Worker if j.SdkLibraryName() != nil && strings.HasSuffix(ctx.ModuleName(), ".impl") { 1851*333d2b36SAndroid Build Coastguard Worker libName = strings.TrimSuffix(libName, ".impl") 1852*333d2b36SAndroid Build Coastguard Worker } 1853*333d2b36SAndroid Build Coastguard Worker j.dexpreopt(ctx, libName, dexOutputFile) 1854*333d2b36SAndroid Build Coastguard Worker 1855*333d2b36SAndroid Build Coastguard Worker outputFile = dexOutputFile 1856*333d2b36SAndroid Build Coastguard Worker 1857*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(dexOutputFile) 1858*333d2b36SAndroid Build Coastguard Worker } else { 1859*333d2b36SAndroid Build Coastguard Worker // There is no code to compile into a dex jar, make sure the resources are propagated 1860*333d2b36SAndroid Build Coastguard Worker // to the APK if this is an app. 1861*333d2b36SAndroid Build Coastguard Worker j.dexJarFile = makeDexJarPathFromPath(combinedResourceJar) 1862*333d2b36SAndroid Build Coastguard Worker } 1863*333d2b36SAndroid Build Coastguard Worker 1864*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 1865*333d2b36SAndroid Build Coastguard Worker return 1866*333d2b36SAndroid Build Coastguard Worker } 1867*333d2b36SAndroid Build Coastguard Worker } 1868*333d2b36SAndroid Build Coastguard Worker 1869*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 1870*333d2b36SAndroid Build Coastguard Worker lintSDKVersion := func(apiLevel android.ApiLevel) android.ApiLevel { 1871*333d2b36SAndroid Build Coastguard Worker if !apiLevel.IsPreview() { 1872*333d2b36SAndroid Build Coastguard Worker return apiLevel 1873*333d2b36SAndroid Build Coastguard Worker } else { 1874*333d2b36SAndroid Build Coastguard Worker return ctx.Config().DefaultAppTargetSdk(ctx) 1875*333d2b36SAndroid Build Coastguard Worker } 1876*333d2b36SAndroid Build Coastguard Worker } 1877*333d2b36SAndroid Build Coastguard Worker 1878*333d2b36SAndroid Build Coastguard Worker j.linter.name = ctx.ModuleName() 1879*333d2b36SAndroid Build Coastguard Worker j.linter.srcs = append(srcFiles, nonGeneratedSrcJars...) 1880*333d2b36SAndroid Build Coastguard Worker j.linter.srcJars, _ = android.FilterPathList(srcJars, nonGeneratedSrcJars) 1881*333d2b36SAndroid Build Coastguard Worker j.linter.classpath = append(append(android.Paths(nil), flags.bootClasspath...), flags.classpath...) 1882*333d2b36SAndroid Build Coastguard Worker j.linter.classes = j.implementationJarFile 1883*333d2b36SAndroid Build Coastguard Worker j.linter.minSdkVersion = lintSDKVersion(j.MinSdkVersion(ctx)) 1884*333d2b36SAndroid Build Coastguard Worker j.linter.targetSdkVersion = lintSDKVersion(j.TargetSdkVersion(ctx)) 1885*333d2b36SAndroid Build Coastguard Worker j.linter.compileSdkVersion = lintSDKVersion(j.SdkVersion(ctx).ApiLevel) 1886*333d2b36SAndroid Build Coastguard Worker j.linter.compileSdkKind = j.SdkVersion(ctx).Kind 1887*333d2b36SAndroid Build Coastguard Worker j.linter.javaLanguageLevel = flags.javaVersion.String() 1888*333d2b36SAndroid Build Coastguard Worker j.linter.kotlinLanguageLevel = "1.3" 1889*333d2b36SAndroid Build Coastguard Worker j.linter.compile_data = android.PathsForModuleSrc(ctx, j.properties.Compile_data) 1890*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() && ctx.Config().UnbundledBuildApps() { 1891*333d2b36SAndroid Build Coastguard Worker j.linter.buildModuleReportZip = true 1892*333d2b36SAndroid Build Coastguard Worker } 1893*333d2b36SAndroid Build Coastguard Worker j.linter.lint(ctx) 1894*333d2b36SAndroid Build Coastguard Worker } 1895*333d2b36SAndroid Build Coastguard Worker 1896*333d2b36SAndroid Build Coastguard Worker j.collectTransitiveSrcFiles(ctx, srcFiles) 1897*333d2b36SAndroid Build Coastguard Worker 1898*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 1899*333d2b36SAndroid Build Coastguard Worker if len(localImplementationJars) > 0 || len(localResourceJars) > 0 || len(localHeaderJars) > 0 { 1900*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(localImplementationJars...) 1901*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(localResourceJars...) 1902*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(localHeaderJars...) 1903*333d2b36SAndroid Build Coastguard Worker } else { 1904*333d2b36SAndroid Build Coastguard Worker // There are no local sources or resources in this module, so there is nothing to checkbuild. 1905*333d2b36SAndroid Build Coastguard Worker ctx.UncheckedModule() 1906*333d2b36SAndroid Build Coastguard Worker } 1907*333d2b36SAndroid Build Coastguard Worker } else { 1908*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(j.implementationJarFile) 1909*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(j.headerJarFile) 1910*333d2b36SAndroid Build Coastguard Worker } 1911*333d2b36SAndroid Build Coastguard Worker 1912*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ 1913*333d2b36SAndroid Build Coastguard Worker HeaderJars: android.PathsIfNonNil(j.headerJarFile), 1914*333d2b36SAndroid Build Coastguard Worker RepackagedHeaderJars: android.PathsIfNonNil(repackagedHeaderJarFile), 1915*333d2b36SAndroid Build Coastguard Worker 1916*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars: localHeaderJars, 1917*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, localHeaderJars, transitiveStaticLibsHeaderJars), 1918*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsImplementationJars: completeStaticLibsImplementationJars, 1919*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsResourceJars: completeStaticLibsResourceJars, 1920*333d2b36SAndroid Build Coastguard Worker 1921*333d2b36SAndroid Build Coastguard Worker TransitiveLibsHeaderJarsForR8: j.transitiveLibsHeaderJarsForR8, 1922*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJarsForR8: j.transitiveStaticLibsHeaderJarsForR8, 1923*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars: android.PathsIfNonNil(j.implementationAndResourcesJar), 1924*333d2b36SAndroid Build Coastguard Worker ImplementationJars: android.PathsIfNonNil(j.implementationJarFile), 1925*333d2b36SAndroid Build Coastguard Worker ResourceJars: android.PathsIfNonNil(combinedResourceJar), 1926*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs: j.exportAidlIncludeDirs, 1927*333d2b36SAndroid Build Coastguard Worker SrcJarArgs: j.srcJarArgs, 1928*333d2b36SAndroid Build Coastguard Worker SrcJarDeps: j.srcJarDeps, 1929*333d2b36SAndroid Build Coastguard Worker TransitiveSrcFiles: j.transitiveSrcFiles, 1930*333d2b36SAndroid Build Coastguard Worker ExportedPlugins: j.exportedPluginJars, 1931*333d2b36SAndroid Build Coastguard Worker ExportedPluginClasses: j.exportedPluginClasses, 1932*333d2b36SAndroid Build Coastguard Worker ExportedPluginDisableTurbine: j.exportedDisableTurbine, 1933*333d2b36SAndroid Build Coastguard Worker JacocoReportClassesFile: j.jacocoReportClassesFile, 1934*333d2b36SAndroid Build Coastguard Worker StubsLinkType: j.stubsLinkType, 1935*333d2b36SAndroid Build Coastguard Worker AconfigIntermediateCacheOutputPaths: j.aconfigCacheFiles, 1936*333d2b36SAndroid Build Coastguard Worker SdkVersion: j.SdkVersion(ctx), 1937*333d2b36SAndroid Build Coastguard Worker }) 1938*333d2b36SAndroid Build Coastguard Worker 1939*333d2b36SAndroid Build Coastguard Worker // Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource 1940*333d2b36SAndroid Build Coastguard Worker j.outputFile = outputFile.WithoutRel() 1941*333d2b36SAndroid Build Coastguard Worker} 1942*333d2b36SAndroid Build Coastguard Worker 1943*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) useCompose(ctx android.BaseModuleContext) bool { 1944*333d2b36SAndroid Build Coastguard Worker return android.InList("androidx.compose.runtime_runtime", j.staticLibs(ctx)) 1945*333d2b36SAndroid Build Coastguard Worker} 1946*333d2b36SAndroid Build Coastguard Worker 1947*333d2b36SAndroid Build Coastguard Workerfunc collectDepProguardSpecInfo(ctx android.ModuleContext) (transitiveProguardFlags, transitiveUnconditionalExportedFlags []depset.DepSet[android.Path]) { 1948*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(m android.Module) { 1949*333d2b36SAndroid Build Coastguard Worker depProguardInfo, _ := android.OtherModuleProvider(ctx, m, ProguardSpecInfoProvider) 1950*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(m) 1951*333d2b36SAndroid Build Coastguard Worker 1952*333d2b36SAndroid Build Coastguard Worker transitiveUnconditionalExportedFlags = append(transitiveUnconditionalExportedFlags, depProguardInfo.UnconditionallyExportedProguardFlags) 1953*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags = append(transitiveProguardFlags, depProguardInfo.UnconditionallyExportedProguardFlags) 1954*333d2b36SAndroid Build Coastguard Worker 1955*333d2b36SAndroid Build Coastguard Worker if depTag == staticLibTag { 1956*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags = append(transitiveProguardFlags, depProguardInfo.ProguardFlagsFiles) 1957*333d2b36SAndroid Build Coastguard Worker } 1958*333d2b36SAndroid Build Coastguard Worker }) 1959*333d2b36SAndroid Build Coastguard Worker 1960*333d2b36SAndroid Build Coastguard Worker return transitiveProguardFlags, transitiveUnconditionalExportedFlags 1961*333d2b36SAndroid Build Coastguard Worker} 1962*333d2b36SAndroid Build Coastguard Worker 1963*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo { 1964*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) 1965*333d2b36SAndroid Build Coastguard Worker 1966*333d2b36SAndroid Build Coastguard Worker directUnconditionalExportedFlags := android.Paths{} 1967*333d2b36SAndroid Build Coastguard Worker proguardFlagsForThisModule := android.PathsForModuleSrc(ctx, j.dexProperties.Optimize.Proguard_flags_files) 1968*333d2b36SAndroid Build Coastguard Worker exportUnconditionally := proptools.Bool(j.dexProperties.Optimize.Export_proguard_flags_files) 1969*333d2b36SAndroid Build Coastguard Worker if exportUnconditionally { 1970*333d2b36SAndroid Build Coastguard Worker // if we explicitly export, then our unconditional exports are the same as our transitive flags 1971*333d2b36SAndroid Build Coastguard Worker transitiveUnconditionalExportedFlags = transitiveProguardFlags 1972*333d2b36SAndroid Build Coastguard Worker directUnconditionalExportedFlags = proguardFlagsForThisModule 1973*333d2b36SAndroid Build Coastguard Worker } 1974*333d2b36SAndroid Build Coastguard Worker 1975*333d2b36SAndroid Build Coastguard Worker return ProguardSpecInfo{ 1976*333d2b36SAndroid Build Coastguard Worker Export_proguard_flags_files: exportUnconditionally, 1977*333d2b36SAndroid Build Coastguard Worker ProguardFlagsFiles: depset.New[android.Path]( 1978*333d2b36SAndroid Build Coastguard Worker depset.POSTORDER, 1979*333d2b36SAndroid Build Coastguard Worker proguardFlagsForThisModule, 1980*333d2b36SAndroid Build Coastguard Worker transitiveProguardFlags, 1981*333d2b36SAndroid Build Coastguard Worker ), 1982*333d2b36SAndroid Build Coastguard Worker UnconditionallyExportedProguardFlags: depset.New[android.Path]( 1983*333d2b36SAndroid Build Coastguard Worker depset.POSTORDER, 1984*333d2b36SAndroid Build Coastguard Worker directUnconditionalExportedFlags, 1985*333d2b36SAndroid Build Coastguard Worker transitiveUnconditionalExportedFlags, 1986*333d2b36SAndroid Build Coastguard Worker ), 1987*333d2b36SAndroid Build Coastguard Worker } 1988*333d2b36SAndroid Build Coastguard Worker 1989*333d2b36SAndroid Build Coastguard Worker} 1990*333d2b36SAndroid Build Coastguard Worker 1991*333d2b36SAndroid Build Coastguard Worker// Returns a copy of the supplied flags, but with all the errorprone-related 1992*333d2b36SAndroid Build Coastguard Worker// fields copied to the regular build's fields. 1993*333d2b36SAndroid Build Coastguard Workerfunc enableErrorproneFlags(flags javaBuilderFlags) javaBuilderFlags { 1994*333d2b36SAndroid Build Coastguard Worker flags.processorPath = append(flags.errorProneProcessorPath, flags.processorPath...) 1995*333d2b36SAndroid Build Coastguard Worker 1996*333d2b36SAndroid Build Coastguard Worker if len(flags.errorProneExtraJavacFlags) > 0 { 1997*333d2b36SAndroid Build Coastguard Worker if len(flags.javacFlags) > 0 { 1998*333d2b36SAndroid Build Coastguard Worker flags.javacFlags += " " + flags.errorProneExtraJavacFlags 1999*333d2b36SAndroid Build Coastguard Worker } else { 2000*333d2b36SAndroid Build Coastguard Worker flags.javacFlags = flags.errorProneExtraJavacFlags 2001*333d2b36SAndroid Build Coastguard Worker } 2002*333d2b36SAndroid Build Coastguard Worker } 2003*333d2b36SAndroid Build Coastguard Worker return flags 2004*333d2b36SAndroid Build Coastguard Worker} 2005*333d2b36SAndroid Build Coastguard Worker 2006*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, idx int, 2007*333d2b36SAndroid Build Coastguard Worker srcFiles, srcJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths) android.Path { 2008*333d2b36SAndroid Build Coastguard Worker 2009*333d2b36SAndroid Build Coastguard Worker kzipName := pathtools.ReplaceExtension(jarName, "kzip") 2010*333d2b36SAndroid Build Coastguard Worker annoSrcJar := android.PathForModuleOut(ctx, "javac", "anno.srcjar") 2011*333d2b36SAndroid Build Coastguard Worker if idx >= 0 { 2012*333d2b36SAndroid Build Coastguard Worker kzipName = strings.TrimSuffix(jarName, filepath.Ext(jarName)) + strconv.Itoa(idx) + ".kzip" 2013*333d2b36SAndroid Build Coastguard Worker annoSrcJar = android.PathForModuleOut(ctx, "javac", "anno-"+strconv.Itoa(idx)+".srcjar") 2014*333d2b36SAndroid Build Coastguard Worker jarName += strconv.Itoa(idx) 2015*333d2b36SAndroid Build Coastguard Worker } 2016*333d2b36SAndroid Build Coastguard Worker 2017*333d2b36SAndroid Build Coastguard Worker classes := android.PathForModuleOut(ctx, "javac", jarName) 2018*333d2b36SAndroid Build Coastguard Worker TransformJavaToClasses(ctx, classes, idx, srcFiles, srcJars, annoSrcJar, flags, extraJarDeps) 2019*333d2b36SAndroid Build Coastguard Worker 2020*333d2b36SAndroid Build Coastguard Worker if ctx.Config().EmitXrefRules() && ctx.Module() == ctx.PrimaryModule() { 2021*333d2b36SAndroid Build Coastguard Worker extractionFile := android.PathForModuleOut(ctx, kzipName) 2022*333d2b36SAndroid Build Coastguard Worker emitXrefRule(ctx, extractionFile, idx, srcFiles, srcJars, flags, extraJarDeps) 2023*333d2b36SAndroid Build Coastguard Worker j.kytheFiles = append(j.kytheFiles, extractionFile) 2024*333d2b36SAndroid Build Coastguard Worker } 2025*333d2b36SAndroid Build Coastguard Worker 2026*333d2b36SAndroid Build Coastguard Worker if len(flags.processorPath) > 0 { 2027*333d2b36SAndroid Build Coastguard Worker j.annoSrcJars = append(j.annoSrcJars, annoSrcJar) 2028*333d2b36SAndroid Build Coastguard Worker } 2029*333d2b36SAndroid Build Coastguard Worker 2030*333d2b36SAndroid Build Coastguard Worker return classes 2031*333d2b36SAndroid Build Coastguard Worker} 2032*333d2b36SAndroid Build Coastguard Worker 2033*333d2b36SAndroid Build Coastguard Worker// Check for invalid kotlinc flags. Only use this for flags explicitly passed by the user, 2034*333d2b36SAndroid Build Coastguard Worker// since some of these flags may be used internally. 2035*333d2b36SAndroid Build Coastguard Workerfunc CheckKotlincFlags(ctx android.ModuleContext, flags []string) { 2036*333d2b36SAndroid Build Coastguard Worker for _, flag := range flags { 2037*333d2b36SAndroid Build Coastguard Worker flag = strings.TrimSpace(flag) 2038*333d2b36SAndroid Build Coastguard Worker 2039*333d2b36SAndroid Build Coastguard Worker if !strings.HasPrefix(flag, "-") { 2040*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlincflags", "Flag `%s` must start with `-`", flag) 2041*333d2b36SAndroid Build Coastguard Worker } else if strings.HasPrefix(flag, "-Xintellij-plugin-root") { 2042*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlincflags", 2043*333d2b36SAndroid Build Coastguard Worker "Bad flag: `%s`, only use internal compiler for consistency.", flag) 2044*333d2b36SAndroid Build Coastguard Worker } else if inList(flag, config.KotlincIllegalFlags) { 2045*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlincflags", "Flag `%s` already used by build system", flag) 2046*333d2b36SAndroid Build Coastguard Worker } else if flag == "-include-runtime" { 2047*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlincflags", "Bad flag: `%s`, do not include runtime.", flag) 2048*333d2b36SAndroid Build Coastguard Worker } else { 2049*333d2b36SAndroid Build Coastguard Worker args := strings.Split(flag, " ") 2050*333d2b36SAndroid Build Coastguard Worker if args[0] == "-kotlin-home" { 2051*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlincflags", 2052*333d2b36SAndroid Build Coastguard Worker "Bad flag: `%s`, kotlin home already set to default (path to kotlinc in the repo).", flag) 2053*333d2b36SAndroid Build Coastguard Worker } 2054*333d2b36SAndroid Build Coastguard Worker } 2055*333d2b36SAndroid Build Coastguard Worker } 2056*333d2b36SAndroid Build Coastguard Worker} 2057*333d2b36SAndroid Build Coastguard Worker 2058*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) compileJavaHeader(ctx android.ModuleContext, srcFiles, srcJars android.Paths, 2059*333d2b36SAndroid Build Coastguard Worker deps deps, flags javaBuilderFlags, jarName string, 2060*333d2b36SAndroid Build Coastguard Worker extraJars android.Paths) (localHeaderJars android.Paths, combinedHeaderJar android.Path) { 2061*333d2b36SAndroid Build Coastguard Worker 2062*333d2b36SAndroid Build Coastguard Worker if len(srcFiles) > 0 || len(srcJars) > 0 { 2063*333d2b36SAndroid Build Coastguard Worker // Compile java sources into turbine.jar. 2064*333d2b36SAndroid Build Coastguard Worker turbineJar := android.PathForModuleOut(ctx, "turbine", jarName) 2065*333d2b36SAndroid Build Coastguard Worker TransformJavaToHeaderClasses(ctx, turbineJar, srcFiles, srcJars, flags) 2066*333d2b36SAndroid Build Coastguard Worker localHeaderJars = append(localHeaderJars, turbineJar) 2067*333d2b36SAndroid Build Coastguard Worker } 2068*333d2b36SAndroid Build Coastguard Worker 2069*333d2b36SAndroid Build Coastguard Worker localHeaderJars = append(localHeaderJars, extraJars...) 2070*333d2b36SAndroid Build Coastguard Worker 2071*333d2b36SAndroid Build Coastguard Worker // Combine any static header libraries into classes-header.jar. If there is only 2072*333d2b36SAndroid Build Coastguard Worker // one input jar this step will be skipped. 2073*333d2b36SAndroid Build Coastguard Worker var jars android.Paths 2074*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 2075*333d2b36SAndroid Build Coastguard Worker depSet := depset.New(depset.PREORDER, localHeaderJars, deps.transitiveStaticLibsHeaderJars) 2076*333d2b36SAndroid Build Coastguard Worker jars = depSet.ToList() 2077*333d2b36SAndroid Build Coastguard Worker } else { 2078*333d2b36SAndroid Build Coastguard Worker jars = append(slices.Clone(localHeaderJars), deps.staticHeaderJars...) 2079*333d2b36SAndroid Build Coastguard Worker } 2080*333d2b36SAndroid Build Coastguard Worker 2081*333d2b36SAndroid Build Coastguard Worker // we cannot skip the combine step for now if there is only one jar 2082*333d2b36SAndroid Build Coastguard Worker // since we have to strip META-INF/TRANSITIVE dir from turbine.jar 2083*333d2b36SAndroid Build Coastguard Worker combinedHeaderJarOutputPath := android.PathForModuleOut(ctx, "turbine-combined", jarName) 2084*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedHeaderJarOutputPath, "for turbine", jars, android.OptionalPath{}, 2085*333d2b36SAndroid Build Coastguard Worker false, nil, []string{"META-INF/TRANSITIVE"}) 2086*333d2b36SAndroid Build Coastguard Worker 2087*333d2b36SAndroid Build Coastguard Worker return localHeaderJars, combinedHeaderJarOutputPath 2088*333d2b36SAndroid Build Coastguard Worker} 2089*333d2b36SAndroid Build Coastguard Worker 2090*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags, 2091*333d2b36SAndroid Build Coastguard Worker classesJar android.Path, jarName string, specs string) android.Path { 2092*333d2b36SAndroid Build Coastguard Worker 2093*333d2b36SAndroid Build Coastguard Worker jacocoReportClassesFile := android.PathForModuleOut(ctx, "jacoco-report-classes", jarName) 2094*333d2b36SAndroid Build Coastguard Worker instrumentedJar := android.PathForModuleOut(ctx, "jacoco", jarName) 2095*333d2b36SAndroid Build Coastguard Worker 2096*333d2b36SAndroid Build Coastguard Worker jacocoInstrumentJar(ctx, instrumentedJar, jacocoReportClassesFile, classesJar, specs) 2097*333d2b36SAndroid Build Coastguard Worker 2098*333d2b36SAndroid Build Coastguard Worker j.jacocoReportClassesFile = jacocoReportClassesFile 2099*333d2b36SAndroid Build Coastguard Worker 2100*333d2b36SAndroid Build Coastguard Worker return instrumentedJar 2101*333d2b36SAndroid Build Coastguard Worker} 2102*333d2b36SAndroid Build Coastguard Worker 2103*333d2b36SAndroid Build Coastguard Workertype providesTransitiveHeaderJarsForR8 struct { 2104*333d2b36SAndroid Build Coastguard Worker // set of header jars for all transitive libs deps 2105*333d2b36SAndroid Build Coastguard Worker transitiveLibsHeaderJarsForR8 depset.DepSet[android.Path] 2106*333d2b36SAndroid Build Coastguard Worker // set of header jars for all transitive static libs deps 2107*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJarsForR8 depset.DepSet[android.Path] 2108*333d2b36SAndroid Build Coastguard Worker} 2109*333d2b36SAndroid Build Coastguard Worker 2110*333d2b36SAndroid Build Coastguard Worker// collectTransitiveHeaderJarsForR8 visits direct dependencies and collects all transitive libs and static_libs 2111*333d2b36SAndroid Build Coastguard Worker// header jars. The semantics of the collected jars are odd (it collects combined jars that contain the static 2112*333d2b36SAndroid Build Coastguard Worker// libs, but also the static libs, and it collects transitive libs dependencies of static_libs), so these 2113*333d2b36SAndroid Build Coastguard Worker// are only used to expand the --lib arguments to R8. 2114*333d2b36SAndroid Build Coastguard Workerfunc (j *providesTransitiveHeaderJarsForR8) collectTransitiveHeaderJarsForR8(ctx android.ModuleContext) { 2115*333d2b36SAndroid Build Coastguard Worker directLibs := android.Paths{} 2116*333d2b36SAndroid Build Coastguard Worker directStaticLibs := android.Paths{} 2117*333d2b36SAndroid Build Coastguard Worker transitiveLibs := []depset.DepSet[android.Path]{} 2118*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibs := []depset.DepSet[android.Path]{} 2119*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 2120*333d2b36SAndroid Build Coastguard Worker // don't add deps of the prebuilt version of the same library 2121*333d2b36SAndroid Build Coastguard Worker if ctx.ModuleName() == android.RemoveOptionalPrebuiltPrefix(module.Name()) { 2122*333d2b36SAndroid Build Coastguard Worker return 2123*333d2b36SAndroid Build Coastguard Worker } 2124*333d2b36SAndroid Build Coastguard Worker 2125*333d2b36SAndroid Build Coastguard Worker if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 2126*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 2127*333d2b36SAndroid Build Coastguard Worker _, isUsesLibDep := tag.(usesLibraryDependencyTag) 2128*333d2b36SAndroid Build Coastguard Worker if tag == libTag || tag == r8LibraryJarTag || isUsesLibDep { 2129*333d2b36SAndroid Build Coastguard Worker directLibs = append(directLibs, dep.HeaderJars...) 2130*333d2b36SAndroid Build Coastguard Worker } else if tag == staticLibTag { 2131*333d2b36SAndroid Build Coastguard Worker directStaticLibs = append(directStaticLibs, dep.HeaderJars...) 2132*333d2b36SAndroid Build Coastguard Worker } else { 2133*333d2b36SAndroid Build Coastguard Worker // Don't propagate transitive libs for other kinds of dependencies. 2134*333d2b36SAndroid Build Coastguard Worker return 2135*333d2b36SAndroid Build Coastguard Worker } 2136*333d2b36SAndroid Build Coastguard Worker 2137*333d2b36SAndroid Build Coastguard Worker transitiveLibs = append(transitiveLibs, dep.TransitiveLibsHeaderJarsForR8) 2138*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibs = append(transitiveStaticLibs, dep.TransitiveStaticLibsHeaderJarsForR8) 2139*333d2b36SAndroid Build Coastguard Worker } 2140*333d2b36SAndroid Build Coastguard Worker }) 2141*333d2b36SAndroid Build Coastguard Worker j.transitiveLibsHeaderJarsForR8 = depset.New(depset.POSTORDER, directLibs, transitiveLibs) 2142*333d2b36SAndroid Build Coastguard Worker j.transitiveStaticLibsHeaderJarsForR8 = depset.New(depset.POSTORDER, directStaticLibs, transitiveStaticLibs) 2143*333d2b36SAndroid Build Coastguard Worker} 2144*333d2b36SAndroid Build Coastguard Worker 2145*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) HeaderJars() android.Paths { 2146*333d2b36SAndroid Build Coastguard Worker if j.headerJarFile == nil { 2147*333d2b36SAndroid Build Coastguard Worker return nil 2148*333d2b36SAndroid Build Coastguard Worker } 2149*333d2b36SAndroid Build Coastguard Worker return android.Paths{j.headerJarFile} 2150*333d2b36SAndroid Build Coastguard Worker} 2151*333d2b36SAndroid Build Coastguard Worker 2152*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ImplementationJars() android.Paths { 2153*333d2b36SAndroid Build Coastguard Worker if j.implementationJarFile == nil { 2154*333d2b36SAndroid Build Coastguard Worker return nil 2155*333d2b36SAndroid Build Coastguard Worker } 2156*333d2b36SAndroid Build Coastguard Worker return android.Paths{j.implementationJarFile} 2157*333d2b36SAndroid Build Coastguard Worker} 2158*333d2b36SAndroid Build Coastguard Worker 2159*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { 2160*333d2b36SAndroid Build Coastguard Worker return j.dexJarFile 2161*333d2b36SAndroid Build Coastguard Worker} 2162*333d2b36SAndroid Build Coastguard Worker 2163*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) DexJarInstallPath() android.Path { 2164*333d2b36SAndroid Build Coastguard Worker return j.installFile 2165*333d2b36SAndroid Build Coastguard Worker} 2166*333d2b36SAndroid Build Coastguard Worker 2167*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ImplementationAndResourcesJars() android.Paths { 2168*333d2b36SAndroid Build Coastguard Worker if j.implementationAndResourcesJar == nil { 2169*333d2b36SAndroid Build Coastguard Worker return nil 2170*333d2b36SAndroid Build Coastguard Worker } 2171*333d2b36SAndroid Build Coastguard Worker return android.Paths{j.implementationAndResourcesJar} 2172*333d2b36SAndroid Build Coastguard Worker} 2173*333d2b36SAndroid Build Coastguard Worker 2174*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) AidlIncludeDirs() android.Paths { 2175*333d2b36SAndroid Build Coastguard Worker // exportAidlIncludeDirs is type android.Paths already 2176*333d2b36SAndroid Build Coastguard Worker return j.exportAidlIncludeDirs 2177*333d2b36SAndroid Build Coastguard Worker} 2178*333d2b36SAndroid Build Coastguard Worker 2179*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { 2180*333d2b36SAndroid Build Coastguard Worker return j.classLoaderContexts 2181*333d2b36SAndroid Build Coastguard Worker} 2182*333d2b36SAndroid Build Coastguard Worker 2183*333d2b36SAndroid Build Coastguard Worker// Collect information for opening IDE project files in java/jdeps.go. 2184*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) { 2185*333d2b36SAndroid Build Coastguard Worker if j.expandJarjarRules != nil { 2186*333d2b36SAndroid Build Coastguard Worker dpInfo.Jarjar_rules = append(dpInfo.Jarjar_rules, j.expandJarjarRules.String()) 2187*333d2b36SAndroid Build Coastguard Worker // Add the header jar so that the rdeps can be resolved to the repackaged classes. 2188*333d2b36SAndroid Build Coastguard Worker dpInfo.Jars = append(dpInfo.Jars, j.headerJarFile.String()) 2189*333d2b36SAndroid Build Coastguard Worker } 2190*333d2b36SAndroid Build Coastguard Worker dpInfo.Srcs = append(dpInfo.Srcs, j.expandIDEInfoCompiledSrcs...) 2191*333d2b36SAndroid Build Coastguard Worker dpInfo.SrcJars = append(dpInfo.SrcJars, j.compiledSrcJars.Strings()...) 2192*333d2b36SAndroid Build Coastguard Worker dpInfo.SrcJars = append(dpInfo.SrcJars, j.annoSrcJars.Strings()...) 2193*333d2b36SAndroid Build Coastguard Worker dpInfo.Deps = append(dpInfo.Deps, j.CompilerDeps()...) 2194*333d2b36SAndroid Build Coastguard Worker dpInfo.Aidl_include_dirs = append(dpInfo.Aidl_include_dirs, j.deviceProperties.Aidl.Include_dirs...) 2195*333d2b36SAndroid Build Coastguard Worker dpInfo.Static_libs = append(dpInfo.Static_libs, j.staticLibs(ctx)...) 2196*333d2b36SAndroid Build Coastguard Worker dpInfo.Libs = append(dpInfo.Libs, j.properties.Libs...) 2197*333d2b36SAndroid Build Coastguard Worker} 2198*333d2b36SAndroid Build Coastguard Worker 2199*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) CompilerDeps() []string { 2200*333d2b36SAndroid Build Coastguard Worker return j.compileDepNames 2201*333d2b36SAndroid Build Coastguard Worker} 2202*333d2b36SAndroid Build Coastguard Worker 2203*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) hasCode(ctx android.ModuleContext) bool { 2204*333d2b36SAndroid Build Coastguard Worker srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs) 2205*333d2b36SAndroid Build Coastguard Worker return len(srcFiles) > 0 || len(ctx.GetDirectDepsWithTag(staticLibTag)) > 0 2206*333d2b36SAndroid Build Coastguard Worker} 2207*333d2b36SAndroid Build Coastguard Worker 2208*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 2209*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 2210*333d2b36SAndroid Build Coastguard Worker return j.depIsInSameApex(ctx, dep) 2211*333d2b36SAndroid Build Coastguard Worker} 2212*333d2b36SAndroid Build Coastguard Worker 2213*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 2214*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error { 2215*333d2b36SAndroid Build Coastguard Worker sdkVersionSpec := j.SdkVersion(ctx) 2216*333d2b36SAndroid Build Coastguard Worker minSdkVersion := j.MinSdkVersion(ctx) 2217*333d2b36SAndroid Build Coastguard Worker if !minSdkVersion.Specified() { 2218*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("min_sdk_version is not specified") 2219*333d2b36SAndroid Build Coastguard Worker } 2220*333d2b36SAndroid Build Coastguard Worker // If the module is compiling against core (via sdk_version), skip comparison check. 2221*333d2b36SAndroid Build Coastguard Worker if sdkVersionSpec.Kind == android.SdkCore { 2222*333d2b36SAndroid Build Coastguard Worker return nil 2223*333d2b36SAndroid Build Coastguard Worker } 2224*333d2b36SAndroid Build Coastguard Worker if minSdkVersion.GreaterThan(sdkVersion) { 2225*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("newer SDK(%v)", minSdkVersion) 2226*333d2b36SAndroid Build Coastguard Worker } 2227*333d2b36SAndroid Build Coastguard Worker return nil 2228*333d2b36SAndroid Build Coastguard Worker} 2229*333d2b36SAndroid Build Coastguard Worker 2230*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) Stem() string { 2231*333d2b36SAndroid Build Coastguard Worker if j.stem == "" { 2232*333d2b36SAndroid Build Coastguard Worker panic("Stem() called before stem property was set") 2233*333d2b36SAndroid Build Coastguard Worker } 2234*333d2b36SAndroid Build Coastguard Worker return j.stem 2235*333d2b36SAndroid Build Coastguard Worker} 2236*333d2b36SAndroid Build Coastguard Worker 2237*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) JacocoReportClassesFile() android.Path { 2238*333d2b36SAndroid Build Coastguard Worker return j.jacocoReportClassesFile 2239*333d2b36SAndroid Build Coastguard Worker} 2240*333d2b36SAndroid Build Coastguard Worker 2241*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) collectTransitiveSrcFiles(ctx android.ModuleContext, mine android.Paths) { 2242*333d2b36SAndroid Build Coastguard Worker var fromDeps []depset.DepSet[android.Path] 2243*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 2244*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 2245*333d2b36SAndroid Build Coastguard Worker if tag == staticLibTag { 2246*333d2b36SAndroid Build Coastguard Worker if depInfo, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 2247*333d2b36SAndroid Build Coastguard Worker fromDeps = append(fromDeps, depInfo.TransitiveSrcFiles) 2248*333d2b36SAndroid Build Coastguard Worker } 2249*333d2b36SAndroid Build Coastguard Worker } 2250*333d2b36SAndroid Build Coastguard Worker }) 2251*333d2b36SAndroid Build Coastguard Worker 2252*333d2b36SAndroid Build Coastguard Worker j.transitiveSrcFiles = depset.New(depset.POSTORDER, mine, fromDeps) 2253*333d2b36SAndroid Build Coastguard Worker} 2254*333d2b36SAndroid Build Coastguard Worker 2255*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) IsInstallable() bool { 2256*333d2b36SAndroid Build Coastguard Worker return Bool(j.properties.Installable) 2257*333d2b36SAndroid Build Coastguard Worker} 2258*333d2b36SAndroid Build Coastguard Worker 2259*333d2b36SAndroid Build Coastguard Workertype sdkLinkType int 2260*333d2b36SAndroid Build Coastguard Worker 2261*333d2b36SAndroid Build Coastguard Workerconst ( 2262*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong) rename these for better readability. Make the allowed 2263*333d2b36SAndroid Build Coastguard Worker // and disallowed link types explicit 2264*333d2b36SAndroid Build Coastguard Worker // order is important here. See rank() 2265*333d2b36SAndroid Build Coastguard Worker javaCore sdkLinkType = iota 2266*333d2b36SAndroid Build Coastguard Worker javaSdk 2267*333d2b36SAndroid Build Coastguard Worker javaSystem 2268*333d2b36SAndroid Build Coastguard Worker javaModule 2269*333d2b36SAndroid Build Coastguard Worker javaSystemServer 2270*333d2b36SAndroid Build Coastguard Worker javaPlatform 2271*333d2b36SAndroid Build Coastguard Worker) 2272*333d2b36SAndroid Build Coastguard Worker 2273*333d2b36SAndroid Build Coastguard Workerfunc (lt sdkLinkType) String() string { 2274*333d2b36SAndroid Build Coastguard Worker switch lt { 2275*333d2b36SAndroid Build Coastguard Worker case javaCore: 2276*333d2b36SAndroid Build Coastguard Worker return "core Java API" 2277*333d2b36SAndroid Build Coastguard Worker case javaSdk: 2278*333d2b36SAndroid Build Coastguard Worker return "Android API" 2279*333d2b36SAndroid Build Coastguard Worker case javaSystem: 2280*333d2b36SAndroid Build Coastguard Worker return "system API" 2281*333d2b36SAndroid Build Coastguard Worker case javaModule: 2282*333d2b36SAndroid Build Coastguard Worker return "module API" 2283*333d2b36SAndroid Build Coastguard Worker case javaSystemServer: 2284*333d2b36SAndroid Build Coastguard Worker return "system server API" 2285*333d2b36SAndroid Build Coastguard Worker case javaPlatform: 2286*333d2b36SAndroid Build Coastguard Worker return "private API" 2287*333d2b36SAndroid Build Coastguard Worker default: 2288*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("unrecognized linktype: %d", lt)) 2289*333d2b36SAndroid Build Coastguard Worker } 2290*333d2b36SAndroid Build Coastguard Worker} 2291*333d2b36SAndroid Build Coastguard Worker 2292*333d2b36SAndroid Build Coastguard Worker// rank determines the total order among sdkLinkType. An SDK link type of rank A can link to 2293*333d2b36SAndroid Build Coastguard Worker// another SDK link type of rank B only when B <= A. For example, a module linking to Android SDK 2294*333d2b36SAndroid Build Coastguard Worker// can't statically depend on modules that use Platform API. 2295*333d2b36SAndroid Build Coastguard Workerfunc (lt sdkLinkType) rank() int { 2296*333d2b36SAndroid Build Coastguard Worker return int(lt) 2297*333d2b36SAndroid Build Coastguard Worker} 2298*333d2b36SAndroid Build Coastguard Worker 2299*333d2b36SAndroid Build Coastguard Workertype moduleWithSdkDep interface { 2300*333d2b36SAndroid Build Coastguard Worker android.Module 2301*333d2b36SAndroid Build Coastguard Worker getSdkLinkType(ctx android.BaseModuleContext, name string) (ret sdkLinkType, stubs bool) 2302*333d2b36SAndroid Build Coastguard Worker} 2303*333d2b36SAndroid Build Coastguard Worker 2304*333d2b36SAndroid Build Coastguard Workerfunc sdkLinkTypeFromSdkKind(k android.SdkKind) sdkLinkType { 2305*333d2b36SAndroid Build Coastguard Worker switch k { 2306*333d2b36SAndroid Build Coastguard Worker case android.SdkCore: 2307*333d2b36SAndroid Build Coastguard Worker return javaCore 2308*333d2b36SAndroid Build Coastguard Worker case android.SdkSystem: 2309*333d2b36SAndroid Build Coastguard Worker return javaSystem 2310*333d2b36SAndroid Build Coastguard Worker case android.SdkPublic: 2311*333d2b36SAndroid Build Coastguard Worker return javaSdk 2312*333d2b36SAndroid Build Coastguard Worker case android.SdkModule: 2313*333d2b36SAndroid Build Coastguard Worker return javaModule 2314*333d2b36SAndroid Build Coastguard Worker case android.SdkSystemServer: 2315*333d2b36SAndroid Build Coastguard Worker return javaSystemServer 2316*333d2b36SAndroid Build Coastguard Worker case android.SdkPrivate, android.SdkNone, android.SdkCorePlatform, android.SdkTest: 2317*333d2b36SAndroid Build Coastguard Worker return javaPlatform 2318*333d2b36SAndroid Build Coastguard Worker default: 2319*333d2b36SAndroid Build Coastguard Worker return javaSdk 2320*333d2b36SAndroid Build Coastguard Worker } 2321*333d2b36SAndroid Build Coastguard Worker} 2322*333d2b36SAndroid Build Coastguard Worker 2323*333d2b36SAndroid Build Coastguard Workerfunc (m *Module) getSdkLinkType(ctx android.BaseModuleContext, name string) (ret sdkLinkType, stubs bool) { 2324*333d2b36SAndroid Build Coastguard Worker switch name { 2325*333d2b36SAndroid Build Coastguard Worker case android.SdkCore.DefaultJavaLibraryName(), 2326*333d2b36SAndroid Build Coastguard Worker "legacy.core.platform.api.stubs", 2327*333d2b36SAndroid Build Coastguard Worker "stable.core.platform.api.stubs", 2328*333d2b36SAndroid Build Coastguard Worker "stub-annotations", "private-stub-annotations-jar", 2329*333d2b36SAndroid Build Coastguard Worker "core-lambda-stubs", 2330*333d2b36SAndroid Build Coastguard Worker "core-generated-annotation-stubs", 2331*333d2b36SAndroid Build Coastguard Worker // jacocoagent only uses core APIs, but has to specify a non-core sdk_version so it can use 2332*333d2b36SAndroid Build Coastguard Worker // a prebuilt SDK to avoid circular dependencies when it statically included in the bootclasspath. 2333*333d2b36SAndroid Build Coastguard Worker "jacocoagent": 2334*333d2b36SAndroid Build Coastguard Worker return javaCore, true 2335*333d2b36SAndroid Build Coastguard Worker case android.SdkPublic.DefaultJavaLibraryName(): 2336*333d2b36SAndroid Build Coastguard Worker return javaSdk, true 2337*333d2b36SAndroid Build Coastguard Worker case android.SdkSystem.DefaultJavaLibraryName(): 2338*333d2b36SAndroid Build Coastguard Worker return javaSystem, true 2339*333d2b36SAndroid Build Coastguard Worker case android.SdkModule.DefaultJavaLibraryName(): 2340*333d2b36SAndroid Build Coastguard Worker return javaModule, true 2341*333d2b36SAndroid Build Coastguard Worker case android.SdkSystemServer.DefaultJavaLibraryName(): 2342*333d2b36SAndroid Build Coastguard Worker return javaSystemServer, true 2343*333d2b36SAndroid Build Coastguard Worker case android.SdkTest.DefaultJavaLibraryName(): 2344*333d2b36SAndroid Build Coastguard Worker return javaSystem, true 2345*333d2b36SAndroid Build Coastguard Worker } 2346*333d2b36SAndroid Build Coastguard Worker 2347*333d2b36SAndroid Build Coastguard Worker if stub, linkType := moduleStubLinkType(m); stub { 2348*333d2b36SAndroid Build Coastguard Worker return linkType, true 2349*333d2b36SAndroid Build Coastguard Worker } 2350*333d2b36SAndroid Build Coastguard Worker 2351*333d2b36SAndroid Build Coastguard Worker ver := m.SdkVersion(ctx) 2352*333d2b36SAndroid Build Coastguard Worker if !ver.Valid() { 2353*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("sdk_version is invalid. got %q", ver.Raw)) 2354*333d2b36SAndroid Build Coastguard Worker } 2355*333d2b36SAndroid Build Coastguard Worker 2356*333d2b36SAndroid Build Coastguard Worker return sdkLinkTypeFromSdkKind(ver.Kind), false 2357*333d2b36SAndroid Build Coastguard Worker} 2358*333d2b36SAndroid Build Coastguard Worker 2359*333d2b36SAndroid Build Coastguard Worker// checkSdkLinkType make sures the given dependency doesn't have a lower SDK link type rank than 2360*333d2b36SAndroid Build Coastguard Worker// this module's. See the comment on rank() for details and an example. 2361*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) checkSdkLinkType( 2362*333d2b36SAndroid Build Coastguard Worker ctx android.ModuleContext, dep moduleWithSdkDep, tag dependencyTag) { 2363*333d2b36SAndroid Build Coastguard Worker if ctx.Host() { 2364*333d2b36SAndroid Build Coastguard Worker return 2365*333d2b36SAndroid Build Coastguard Worker } 2366*333d2b36SAndroid Build Coastguard Worker 2367*333d2b36SAndroid Build Coastguard Worker myLinkType, stubs := j.getSdkLinkType(ctx, ctx.ModuleName()) 2368*333d2b36SAndroid Build Coastguard Worker if stubs { 2369*333d2b36SAndroid Build Coastguard Worker return 2370*333d2b36SAndroid Build Coastguard Worker } 2371*333d2b36SAndroid Build Coastguard Worker depLinkType, _ := dep.getSdkLinkType(ctx, ctx.OtherModuleName(dep)) 2372*333d2b36SAndroid Build Coastguard Worker 2373*333d2b36SAndroid Build Coastguard Worker if myLinkType.rank() < depLinkType.rank() { 2374*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("compiles against %v, but dependency %q is compiling against %v. "+ 2375*333d2b36SAndroid Build Coastguard Worker "In order to fix this, consider adjusting sdk_version: OR platform_apis: "+ 2376*333d2b36SAndroid Build Coastguard Worker "property of the source or target module so that target module is built "+ 2377*333d2b36SAndroid Build Coastguard Worker "with the same or smaller API set when compared to the source.", 2378*333d2b36SAndroid Build Coastguard Worker myLinkType, ctx.OtherModuleName(dep), depLinkType) 2379*333d2b36SAndroid Build Coastguard Worker } 2380*333d2b36SAndroid Build Coastguard Worker} 2381*333d2b36SAndroid Build Coastguard Worker 2382*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) collectDeps(ctx android.ModuleContext) deps { 2383*333d2b36SAndroid Build Coastguard Worker var deps deps 2384*333d2b36SAndroid Build Coastguard Worker 2385*333d2b36SAndroid Build Coastguard Worker sdkLinkType, _ := j.getSdkLinkType(ctx, ctx.ModuleName()) 2386*333d2b36SAndroid Build Coastguard Worker 2387*333d2b36SAndroid Build Coastguard Worker j.collectTransitiveHeaderJarsForR8(ctx) 2388*333d2b36SAndroid Build Coastguard Worker 2389*333d2b36SAndroid Build Coastguard Worker var transitiveBootClasspathHeaderJars []depset.DepSet[android.Path] 2390*333d2b36SAndroid Build Coastguard Worker var transitiveClasspathHeaderJars []depset.DepSet[android.Path] 2391*333d2b36SAndroid Build Coastguard Worker var transitiveJava9ClasspathHeaderJars []depset.DepSet[android.Path] 2392*333d2b36SAndroid Build Coastguard Worker var transitiveStaticJarsHeaderLibs []depset.DepSet[android.Path] 2393*333d2b36SAndroid Build Coastguard Worker var transitiveStaticJarsImplementationLibs []depset.DepSet[android.Path] 2394*333d2b36SAndroid Build Coastguard Worker var transitiveStaticJarsResourceLibs []depset.DepSet[android.Path] 2395*333d2b36SAndroid Build Coastguard Worker 2396*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 2397*333d2b36SAndroid Build Coastguard Worker otherName := ctx.OtherModuleName(module) 2398*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 2399*333d2b36SAndroid Build Coastguard Worker 2400*333d2b36SAndroid Build Coastguard Worker if IsJniDepTag(tag) { 2401*333d2b36SAndroid Build Coastguard Worker // Handled by AndroidApp.collectAppDeps 2402*333d2b36SAndroid Build Coastguard Worker return 2403*333d2b36SAndroid Build Coastguard Worker } 2404*333d2b36SAndroid Build Coastguard Worker if tag == certificateTag { 2405*333d2b36SAndroid Build Coastguard Worker // Handled by AndroidApp.collectAppDeps 2406*333d2b36SAndroid Build Coastguard Worker return 2407*333d2b36SAndroid Build Coastguard Worker } 2408*333d2b36SAndroid Build Coastguard Worker 2409*333d2b36SAndroid Build Coastguard Worker if sdkInfo, ok := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider); ok { 2410*333d2b36SAndroid Build Coastguard Worker switch tag { 2411*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag, staticLibTag: 2412*333d2b36SAndroid Build Coastguard Worker generatingLibsString := android.PrettyConcat( 2413*333d2b36SAndroid Build Coastguard Worker getGeneratingLibs(ctx, j.SdkVersion(ctx), module.Name(), sdkInfo), true, "or") 2414*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("cannot depend directly on java_sdk_library %q; try depending on %s instead", module.Name(), generatingLibsString) 2415*333d2b36SAndroid Build Coastguard Worker } 2416*333d2b36SAndroid Build Coastguard Worker } else if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 2417*333d2b36SAndroid Build Coastguard Worker if sdkLinkType != javaPlatform { 2418*333d2b36SAndroid Build Coastguard Worker if syspropDep, ok := android.OtherModuleProvider(ctx, module, SyspropPublicStubInfoProvider); ok { 2419*333d2b36SAndroid Build Coastguard Worker // dep is a sysprop implementation library, but this module is not linking against 2420*333d2b36SAndroid Build Coastguard Worker // the platform, so it gets the sysprop public stubs library instead. Replace 2421*333d2b36SAndroid Build Coastguard Worker // dep with the JavaInfo from the SyspropPublicStubInfoProvider. 2422*333d2b36SAndroid Build Coastguard Worker dep = syspropDep.JavaInfo 2423*333d2b36SAndroid Build Coastguard Worker } 2424*333d2b36SAndroid Build Coastguard Worker } 2425*333d2b36SAndroid Build Coastguard Worker switch tag { 2426*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2427*333d2b36SAndroid Build Coastguard Worker deps.bootClasspath = append(deps.bootClasspath, dep.HeaderJars...) 2428*333d2b36SAndroid Build Coastguard Worker transitiveBootClasspathHeaderJars = append(transitiveBootClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2429*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag, instrumentationForTag: 2430*333d2b36SAndroid Build Coastguard Worker if _, ok := module.(*Plugin); ok { 2431*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("a java_plugin (%s) cannot be used as a libs dependency", otherName) 2432*333d2b36SAndroid Build Coastguard Worker } 2433*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(deps.classpath, dep.HeaderJars...) 2434*333d2b36SAndroid Build Coastguard Worker deps.dexClasspath = append(deps.dexClasspath, dep.HeaderJars...) 2435*333d2b36SAndroid Build Coastguard Worker if len(dep.RepackagedHeaderJars) == 1 && !slices.Contains(dep.HeaderJars, dep.RepackagedHeaderJars[0]) { 2436*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(deps.classpath, dep.RepackagedHeaderJars...) 2437*333d2b36SAndroid Build Coastguard Worker deps.dexClasspath = append(deps.dexClasspath, dep.RepackagedHeaderJars...) 2438*333d2b36SAndroid Build Coastguard Worker } 2439*333d2b36SAndroid Build Coastguard Worker deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...) 2440*333d2b36SAndroid Build Coastguard Worker addPlugins(&deps, dep.ExportedPlugins, dep.ExportedPluginClasses...) 2441*333d2b36SAndroid Build Coastguard Worker deps.disableTurbine = deps.disableTurbine || dep.ExportedPluginDisableTurbine 2442*333d2b36SAndroid Build Coastguard Worker 2443*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2444*333d2b36SAndroid Build Coastguard Worker case java9LibTag: 2445*333d2b36SAndroid Build Coastguard Worker deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars...) 2446*333d2b36SAndroid Build Coastguard Worker transitiveJava9ClasspathHeaderJars = append(transitiveJava9ClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2447*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2448*333d2b36SAndroid Build Coastguard Worker if _, ok := module.(*Plugin); ok { 2449*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("a java_plugin (%s) cannot be used as a static_libs dependency", otherName) 2450*333d2b36SAndroid Build Coastguard Worker } 2451*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(deps.classpath, dep.HeaderJars...) 2452*333d2b36SAndroid Build Coastguard Worker deps.staticJars = append(deps.staticJars, dep.ImplementationJars...) 2453*333d2b36SAndroid Build Coastguard Worker deps.staticHeaderJars = append(deps.staticHeaderJars, dep.HeaderJars...) 2454*333d2b36SAndroid Build Coastguard Worker deps.staticResourceJars = append(deps.staticResourceJars, dep.ResourceJars...) 2455*333d2b36SAndroid Build Coastguard Worker deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs...) 2456*333d2b36SAndroid Build Coastguard Worker addPlugins(&deps, dep.ExportedPlugins, dep.ExportedPluginClasses...) 2457*333d2b36SAndroid Build Coastguard Worker // Turbine doesn't run annotation processors, so any module that uses an 2458*333d2b36SAndroid Build Coastguard Worker // annotation processor that generates API is incompatible with the turbine 2459*333d2b36SAndroid Build Coastguard Worker // optimization. 2460*333d2b36SAndroid Build Coastguard Worker deps.disableTurbine = deps.disableTurbine || dep.ExportedPluginDisableTurbine 2461*333d2b36SAndroid Build Coastguard Worker deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.AconfigIntermediateCacheOutputPaths...) 2462*333d2b36SAndroid Build Coastguard Worker 2463*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2464*333d2b36SAndroid Build Coastguard Worker transitiveStaticJarsHeaderLibs = append(transitiveStaticJarsHeaderLibs, dep.TransitiveStaticLibsHeaderJars) 2465*333d2b36SAndroid Build Coastguard Worker transitiveStaticJarsImplementationLibs = append(transitiveStaticJarsImplementationLibs, dep.TransitiveStaticLibsImplementationJars) 2466*333d2b36SAndroid Build Coastguard Worker transitiveStaticJarsResourceLibs = append(transitiveStaticJarsResourceLibs, dep.TransitiveStaticLibsResourceJars) 2467*333d2b36SAndroid Build Coastguard Worker case pluginTag: 2468*333d2b36SAndroid Build Coastguard Worker if plugin, ok := module.(*Plugin); ok { 2469*333d2b36SAndroid Build Coastguard Worker if plugin.pluginProperties.Processor_class != nil { 2470*333d2b36SAndroid Build Coastguard Worker addPlugins(&deps, dep.ImplementationAndResourcesJars, *plugin.pluginProperties.Processor_class) 2471*333d2b36SAndroid Build Coastguard Worker } else { 2472*333d2b36SAndroid Build Coastguard Worker addPlugins(&deps, dep.ImplementationAndResourcesJars) 2473*333d2b36SAndroid Build Coastguard Worker } 2474*333d2b36SAndroid Build Coastguard Worker // Turbine doesn't run annotation processors, so any module that uses an 2475*333d2b36SAndroid Build Coastguard Worker // annotation processor that generates API is incompatible with the turbine 2476*333d2b36SAndroid Build Coastguard Worker // optimization. 2477*333d2b36SAndroid Build Coastguard Worker deps.disableTurbine = deps.disableTurbine || Bool(plugin.pluginProperties.Generates_api) 2478*333d2b36SAndroid Build Coastguard Worker } else { 2479*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("plugins", "%q is not a java_plugin module", otherName) 2480*333d2b36SAndroid Build Coastguard Worker } 2481*333d2b36SAndroid Build Coastguard Worker case errorpronePluginTag: 2482*333d2b36SAndroid Build Coastguard Worker if _, ok := module.(*Plugin); ok { 2483*333d2b36SAndroid Build Coastguard Worker deps.errorProneProcessorPath = append(deps.errorProneProcessorPath, dep.ImplementationAndResourcesJars...) 2484*333d2b36SAndroid Build Coastguard Worker } else { 2485*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("plugins", "%q is not a java_plugin module", otherName) 2486*333d2b36SAndroid Build Coastguard Worker } 2487*333d2b36SAndroid Build Coastguard Worker case exportedPluginTag: 2488*333d2b36SAndroid Build Coastguard Worker if plugin, ok := module.(*Plugin); ok { 2489*333d2b36SAndroid Build Coastguard Worker j.exportedPluginJars = append(j.exportedPluginJars, dep.ImplementationAndResourcesJars...) 2490*333d2b36SAndroid Build Coastguard Worker if plugin.pluginProperties.Processor_class != nil { 2491*333d2b36SAndroid Build Coastguard Worker j.exportedPluginClasses = append(j.exportedPluginClasses, *plugin.pluginProperties.Processor_class) 2492*333d2b36SAndroid Build Coastguard Worker } 2493*333d2b36SAndroid Build Coastguard Worker // Turbine doesn't run annotation processors, so any module that uses an 2494*333d2b36SAndroid Build Coastguard Worker // annotation processor that generates API is incompatible with the turbine 2495*333d2b36SAndroid Build Coastguard Worker // optimization. 2496*333d2b36SAndroid Build Coastguard Worker j.exportedDisableTurbine = Bool(plugin.pluginProperties.Generates_api) 2497*333d2b36SAndroid Build Coastguard Worker } else { 2498*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("exported_plugins", "%q is not a java_plugin module", otherName) 2499*333d2b36SAndroid Build Coastguard Worker } 2500*333d2b36SAndroid Build Coastguard Worker case kotlinPluginTag: 2501*333d2b36SAndroid Build Coastguard Worker if _, ok := module.(*KotlinPlugin); ok { 2502*333d2b36SAndroid Build Coastguard Worker deps.kotlinPlugins = append(deps.kotlinPlugins, dep.ImplementationAndResourcesJars...) 2503*333d2b36SAndroid Build Coastguard Worker } else { 2504*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("kotlin_plugins", "%q is not a kotlin_plugin module", otherName) 2505*333d2b36SAndroid Build Coastguard Worker } 2506*333d2b36SAndroid Build Coastguard Worker case syspropPublicStubDepTag: 2507*333d2b36SAndroid Build Coastguard Worker // This is a sysprop implementation library, forward the JavaInfoProvider from 2508*333d2b36SAndroid Build Coastguard Worker // the corresponding sysprop public stub library as SyspropPublicStubInfoProvider. 2509*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, SyspropPublicStubInfoProvider, SyspropPublicStubInfo{ 2510*333d2b36SAndroid Build Coastguard Worker JavaInfo: dep, 2511*333d2b36SAndroid Build Coastguard Worker }) 2512*333d2b36SAndroid Build Coastguard Worker } 2513*333d2b36SAndroid Build Coastguard Worker } else if dep, ok := module.(android.SourceFileProducer); ok { 2514*333d2b36SAndroid Build Coastguard Worker switch tag { 2515*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag: 2516*333d2b36SAndroid Build Coastguard Worker checkProducesJars(ctx, dep) 2517*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(deps.classpath, dep.Srcs()...) 2518*333d2b36SAndroid Build Coastguard Worker deps.dexClasspath = append(deps.classpath, dep.Srcs()...) 2519*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, 2520*333d2b36SAndroid Build Coastguard Worker depset.New(depset.PREORDER, dep.Srcs(), nil)) 2521*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2522*333d2b36SAndroid Build Coastguard Worker checkProducesJars(ctx, dep) 2523*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(deps.classpath, dep.Srcs()...) 2524*333d2b36SAndroid Build Coastguard Worker deps.staticJars = append(deps.staticJars, dep.Srcs()...) 2525*333d2b36SAndroid Build Coastguard Worker deps.staticHeaderJars = append(deps.staticHeaderJars, dep.Srcs()...) 2526*333d2b36SAndroid Build Coastguard Worker 2527*333d2b36SAndroid Build Coastguard Worker depHeaderJars := depset.New(depset.PREORDER, dep.Srcs(), nil) 2528*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, depHeaderJars) 2529*333d2b36SAndroid Build Coastguard Worker transitiveStaticJarsHeaderLibs = append(transitiveStaticJarsHeaderLibs, depHeaderJars) 2530*333d2b36SAndroid Build Coastguard Worker transitiveStaticJarsImplementationLibs = append(transitiveStaticJarsImplementationLibs, depHeaderJars) 2531*333d2b36SAndroid Build Coastguard Worker } 2532*333d2b36SAndroid Build Coastguard Worker } else if dep, ok := android.OtherModuleProvider(ctx, module, android.CodegenInfoProvider); ok { 2533*333d2b36SAndroid Build Coastguard Worker switch tag { 2534*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2535*333d2b36SAndroid Build Coastguard Worker deps.aconfigProtoFiles = append(deps.aconfigProtoFiles, dep.IntermediateCacheOutputPaths...) 2536*333d2b36SAndroid Build Coastguard Worker } 2537*333d2b36SAndroid Build Coastguard Worker } else { 2538*333d2b36SAndroid Build Coastguard Worker switch tag { 2539*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2540*333d2b36SAndroid Build Coastguard Worker // If a system modules dependency has been added to the bootclasspath 2541*333d2b36SAndroid Build Coastguard Worker // then add its libs to the bootclasspath. 2542*333d2b36SAndroid Build Coastguard Worker if sm, ok := android.OtherModuleProvider(ctx, module, SystemModulesProvider); ok { 2543*333d2b36SAndroid Build Coastguard Worker deps.bootClasspath = append(deps.bootClasspath, sm.HeaderJars...) 2544*333d2b36SAndroid Build Coastguard Worker transitiveBootClasspathHeaderJars = append(transitiveBootClasspathHeaderJars, 2545*333d2b36SAndroid Build Coastguard Worker sm.TransitiveStaticLibsHeaderJars) 2546*333d2b36SAndroid Build Coastguard Worker } else { 2547*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("boot classpath dependency %q does not provide SystemModulesProvider", 2548*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(module)) 2549*333d2b36SAndroid Build Coastguard Worker } 2550*333d2b36SAndroid Build Coastguard Worker 2551*333d2b36SAndroid Build Coastguard Worker case systemModulesTag: 2552*333d2b36SAndroid Build Coastguard Worker if deps.systemModules != nil { 2553*333d2b36SAndroid Build Coastguard Worker panic("Found two system module dependencies") 2554*333d2b36SAndroid Build Coastguard Worker } 2555*333d2b36SAndroid Build Coastguard Worker if sm, ok := android.OtherModuleProvider(ctx, module, SystemModulesProvider); ok { 2556*333d2b36SAndroid Build Coastguard Worker deps.systemModules = &systemModules{sm.OutputDir, sm.OutputDirDeps} 2557*333d2b36SAndroid Build Coastguard Worker } else { 2558*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("system modules dependency %q does not provide SystemModulesProvider", 2559*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(module)) 2560*333d2b36SAndroid Build Coastguard Worker } 2561*333d2b36SAndroid Build Coastguard Worker 2562*333d2b36SAndroid Build Coastguard Worker case instrumentationForTag: 2563*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("instrumentation_for", "dependency %q of type %q does not provide JavaInfo so is unsuitable for use with this property", ctx.OtherModuleName(module), ctx.OtherModuleType(module)) 2564*333d2b36SAndroid Build Coastguard Worker } 2565*333d2b36SAndroid Build Coastguard Worker } 2566*333d2b36SAndroid Build Coastguard Worker 2567*333d2b36SAndroid Build Coastguard Worker if android.InList(tag, compileDependencyTags) { 2568*333d2b36SAndroid Build Coastguard Worker // Add the dependency name to compileDepNames so that it can be recorded in module_bp_java_deps.json 2569*333d2b36SAndroid Build Coastguard Worker j.compileDepNames = append(j.compileDepNames, otherName) 2570*333d2b36SAndroid Build Coastguard Worker } 2571*333d2b36SAndroid Build Coastguard Worker 2572*333d2b36SAndroid Build Coastguard Worker addCLCFromDep(ctx, module, j.classLoaderContexts) 2573*333d2b36SAndroid Build Coastguard Worker addMissingOptionalUsesLibsFromDep(ctx, module, &j.usesLibrary) 2574*333d2b36SAndroid Build Coastguard Worker }) 2575*333d2b36SAndroid Build Coastguard Worker 2576*333d2b36SAndroid Build Coastguard Worker deps.transitiveStaticLibsHeaderJars = transitiveStaticJarsHeaderLibs 2577*333d2b36SAndroid Build Coastguard Worker deps.transitiveStaticLibsImplementationJars = transitiveStaticJarsImplementationLibs 2578*333d2b36SAndroid Build Coastguard Worker deps.transitiveStaticLibsResourceJars = transitiveStaticJarsResourceLibs 2579*333d2b36SAndroid Build Coastguard Worker 2580*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 2581*333d2b36SAndroid Build Coastguard Worker depSet := depset.New(depset.PREORDER, nil, transitiveClasspathHeaderJars) 2582*333d2b36SAndroid Build Coastguard Worker deps.classpath = depSet.ToList() 2583*333d2b36SAndroid Build Coastguard Worker depSet = depset.New(depset.PREORDER, nil, transitiveBootClasspathHeaderJars) 2584*333d2b36SAndroid Build Coastguard Worker deps.bootClasspath = depSet.ToList() 2585*333d2b36SAndroid Build Coastguard Worker depSet = depset.New(depset.PREORDER, nil, transitiveJava9ClasspathHeaderJars) 2586*333d2b36SAndroid Build Coastguard Worker deps.java9Classpath = depSet.ToList() 2587*333d2b36SAndroid Build Coastguard Worker } 2588*333d2b36SAndroid Build Coastguard Worker 2589*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 2590*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, android.SdkContext(j)) 2591*333d2b36SAndroid Build Coastguard Worker if sdkDep.invalidVersion { 2592*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies(sdkDep.bootclasspath) 2593*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies(sdkDep.java9Classpath) 2594*333d2b36SAndroid Build Coastguard Worker } else if sdkDep.useFiles { 2595*333d2b36SAndroid Build Coastguard Worker // sdkDep.jar is actually equivalent to turbine header.jar. 2596*333d2b36SAndroid Build Coastguard Worker deps.classpath = append(slices.Clone(classpath(sdkDep.jars)), deps.classpath...) 2597*333d2b36SAndroid Build Coastguard Worker deps.dexClasspath = append(slices.Clone(classpath(sdkDep.jars)), deps.dexClasspath...) 2598*333d2b36SAndroid Build Coastguard Worker deps.aidlPreprocess = sdkDep.aidl 2599*333d2b36SAndroid Build Coastguard Worker // Add the sdk module dependency to `compileDepNames`. 2600*333d2b36SAndroid Build Coastguard Worker // This ensures that the dependency is reported in `module_bp_java_deps.json` 2601*333d2b36SAndroid Build Coastguard Worker // TODO (b/358608607): Move this to decodeSdkDep 2602*333d2b36SAndroid Build Coastguard Worker sdkSpec := android.SdkContext(j).SdkVersion(ctx) 2603*333d2b36SAndroid Build Coastguard Worker j.compileDepNames = append(j.compileDepNames, fmt.Sprintf("sdk_%s_%s_android", sdkSpec.Kind.String(), sdkSpec.ApiLevel.String())) 2604*333d2b36SAndroid Build Coastguard Worker } else { 2605*333d2b36SAndroid Build Coastguard Worker deps.aidlPreprocess = sdkDep.aidl 2606*333d2b36SAndroid Build Coastguard Worker } 2607*333d2b36SAndroid Build Coastguard Worker } 2608*333d2b36SAndroid Build Coastguard Worker 2609*333d2b36SAndroid Build Coastguard Worker return deps 2610*333d2b36SAndroid Build Coastguard Worker} 2611*333d2b36SAndroid Build Coastguard Worker 2612*333d2b36SAndroid Build Coastguard Worker// Provider for jarjar renaming rules. 2613*333d2b36SAndroid Build Coastguard Worker// 2614*333d2b36SAndroid Build Coastguard Worker// Modules can set their jarjar renaming rules with addJarJarRenameRule, and those renamings will be 2615*333d2b36SAndroid Build Coastguard Worker// passed to all rdeps. The typical way that these renamings will NOT be inherited is when a module 2616*333d2b36SAndroid Build Coastguard Worker// links against stubs -- these are not passed through stubs. The classes will remain unrenamed on 2617*333d2b36SAndroid Build Coastguard Worker// classes until a module with jarjar_prefix is reached, and all as yet unrenamed classes will then 2618*333d2b36SAndroid Build Coastguard Worker// be renamed from that module. 2619*333d2b36SAndroid Build Coastguard Worker// TODO: Add another property to suppress the forwarding of 2620*333d2b36SAndroid Build Coastguard Workertype DependencyUse int 2621*333d2b36SAndroid Build Coastguard Worker 2622*333d2b36SAndroid Build Coastguard Workerconst ( 2623*333d2b36SAndroid Build Coastguard Worker RenameUseInvalid DependencyUse = iota 2624*333d2b36SAndroid Build Coastguard Worker RenameUseInclude 2625*333d2b36SAndroid Build Coastguard Worker RenameUseExclude 2626*333d2b36SAndroid Build Coastguard Worker) 2627*333d2b36SAndroid Build Coastguard Worker 2628*333d2b36SAndroid Build Coastguard Workertype RenameUseElement struct { 2629*333d2b36SAndroid Build Coastguard Worker DepName string 2630*333d2b36SAndroid Build Coastguard Worker RenameUse DependencyUse 2631*333d2b36SAndroid Build Coastguard Worker Why string // token for determining where in the logic the decision was made. 2632*333d2b36SAndroid Build Coastguard Worker} 2633*333d2b36SAndroid Build Coastguard Worker 2634*333d2b36SAndroid Build Coastguard Workertype JarJarProviderData struct { 2635*333d2b36SAndroid Build Coastguard Worker // Mapping of class names: original --> renamed. If the value is "", the class will be 2636*333d2b36SAndroid Build Coastguard Worker // renamed by the next rdep that has the jarjar_prefix attribute (or this module if it has 2637*333d2b36SAndroid Build Coastguard Worker // attribute). Rdeps of that module will inherit the renaming. 2638*333d2b36SAndroid Build Coastguard Worker Rename map[string]string 2639*333d2b36SAndroid Build Coastguard Worker RenameUse []RenameUseElement 2640*333d2b36SAndroid Build Coastguard Worker} 2641*333d2b36SAndroid Build Coastguard Worker 2642*333d2b36SAndroid Build Coastguard Workerfunc (this JarJarProviderData) GetDebugString() string { 2643*333d2b36SAndroid Build Coastguard Worker result := "" 2644*333d2b36SAndroid Build Coastguard Worker for _, k := range android.SortedKeys(this.Rename) { 2645*333d2b36SAndroid Build Coastguard Worker v := this.Rename[k] 2646*333d2b36SAndroid Build Coastguard Worker if strings.Contains(k, "android.companion.virtual.flags.FakeFeatureFlagsImpl") { 2647*333d2b36SAndroid Build Coastguard Worker result += k + "-->" + v + ";" 2648*333d2b36SAndroid Build Coastguard Worker } 2649*333d2b36SAndroid Build Coastguard Worker } 2650*333d2b36SAndroid Build Coastguard Worker return result 2651*333d2b36SAndroid Build Coastguard Worker} 2652*333d2b36SAndroid Build Coastguard Worker 2653*333d2b36SAndroid Build Coastguard Workervar JarJarProvider = blueprint.NewProvider[JarJarProviderData]() 2654*333d2b36SAndroid Build Coastguard Worker 2655*333d2b36SAndroid Build Coastguard Workervar overridableJarJarPrefix = "com.android.internal.hidden_from_bootclasspath" 2656*333d2b36SAndroid Build Coastguard Worker 2657*333d2b36SAndroid Build Coastguard Workerfunc init() { 2658*333d2b36SAndroid Build Coastguard Worker android.SetJarJarPrefixHandler(mergeJarJarPrefixes) 2659*333d2b36SAndroid Build Coastguard Worker 2660*333d2b36SAndroid Build Coastguard Worker gob.Register(BaseJarJarProviderData{}) 2661*333d2b36SAndroid Build Coastguard Worker} 2662*333d2b36SAndroid Build Coastguard Worker 2663*333d2b36SAndroid Build Coastguard Worker// BaseJarJarProviderData contains information that will propagate across dependencies regardless of 2664*333d2b36SAndroid Build Coastguard Worker// whether they are java modules or not. 2665*333d2b36SAndroid Build Coastguard Workertype BaseJarJarProviderData struct { 2666*333d2b36SAndroid Build Coastguard Worker JarJarProviderData JarJarProviderData 2667*333d2b36SAndroid Build Coastguard Worker} 2668*333d2b36SAndroid Build Coastguard Worker 2669*333d2b36SAndroid Build Coastguard Workerfunc (this BaseJarJarProviderData) GetDebugString() string { 2670*333d2b36SAndroid Build Coastguard Worker return this.JarJarProviderData.GetDebugString() 2671*333d2b36SAndroid Build Coastguard Worker} 2672*333d2b36SAndroid Build Coastguard Worker 2673*333d2b36SAndroid Build Coastguard Workervar BaseJarJarProvider = blueprint.NewProvider[BaseJarJarProviderData]() 2674*333d2b36SAndroid Build Coastguard Worker 2675*333d2b36SAndroid Build Coastguard Worker// mergeJarJarPrefixes is called immediately before module.GenerateAndroidBuildActions is called. 2676*333d2b36SAndroid Build Coastguard Worker// Since there won't be a JarJarProvider, we create the BaseJarJarProvider if any of our deps have 2677*333d2b36SAndroid Build Coastguard Worker// either JarJarProvider or BaseJarJarProvider. 2678*333d2b36SAndroid Build Coastguard Workerfunc mergeJarJarPrefixes(ctx android.ModuleContext) { 2679*333d2b36SAndroid Build Coastguard Worker mod := ctx.Module() 2680*333d2b36SAndroid Build Coastguard Worker // Explicitly avoid propagating into some module types. 2681*333d2b36SAndroid Build Coastguard Worker switch reflect.TypeOf(mod).String() { 2682*333d2b36SAndroid Build Coastguard Worker case "*java.Droidstubs": 2683*333d2b36SAndroid Build Coastguard Worker return 2684*333d2b36SAndroid Build Coastguard Worker } 2685*333d2b36SAndroid Build Coastguard Worker jarJarData := collectDirectDepsProviders(ctx) 2686*333d2b36SAndroid Build Coastguard Worker if jarJarData != nil { 2687*333d2b36SAndroid Build Coastguard Worker providerData := BaseJarJarProviderData{ 2688*333d2b36SAndroid Build Coastguard Worker JarJarProviderData: *jarJarData, 2689*333d2b36SAndroid Build Coastguard Worker } 2690*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, BaseJarJarProvider, providerData) 2691*333d2b36SAndroid Build Coastguard Worker } 2692*333d2b36SAndroid Build Coastguard Worker 2693*333d2b36SAndroid Build Coastguard Worker} 2694*333d2b36SAndroid Build Coastguard Worker 2695*333d2b36SAndroid Build Coastguard Worker// Add a jarjar renaming rule to this module, to be inherited to all dependent modules. 2696*333d2b36SAndroid Build Coastguard Workerfunc (module *Module) addJarJarRenameRule(original string, renamed string) { 2697*333d2b36SAndroid Build Coastguard Worker if module.jarjarRenameRules == nil { 2698*333d2b36SAndroid Build Coastguard Worker module.jarjarRenameRules = make(map[string]string) 2699*333d2b36SAndroid Build Coastguard Worker } 2700*333d2b36SAndroid Build Coastguard Worker module.jarjarRenameRules[original] = renamed 2701*333d2b36SAndroid Build Coastguard Worker} 2702*333d2b36SAndroid Build Coastguard Worker 2703*333d2b36SAndroid Build Coastguard Workerfunc collectDirectDepsProviders(ctx android.ModuleContext) (result *JarJarProviderData) { 2704*333d2b36SAndroid Build Coastguard Worker // Gather repackage information from deps 2705*333d2b36SAndroid Build Coastguard Worker // If the dep jas a JarJarProvider, it is used. Otherwise, any BaseJarJarProvider is used. 2706*333d2b36SAndroid Build Coastguard Worker 2707*333d2b36SAndroid Build Coastguard Worker module := ctx.Module() 2708*333d2b36SAndroid Build Coastguard Worker moduleName := module.Name() 2709*333d2b36SAndroid Build Coastguard Worker 2710*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(m android.Module) { 2711*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(m) 2712*333d2b36SAndroid Build Coastguard Worker // This logic mirrors that in (*Module).collectDeps above. There are several places 2713*333d2b36SAndroid Build Coastguard Worker // where we explicitly return RenameUseExclude, even though it is the default, to 2714*333d2b36SAndroid Build Coastguard Worker // indicate that it has been verified to be the case. 2715*333d2b36SAndroid Build Coastguard Worker // 2716*333d2b36SAndroid Build Coastguard Worker // Note well: there are probably cases that are getting to the unconditional return 2717*333d2b36SAndroid Build Coastguard Worker // and are therefore wrong. 2718*333d2b36SAndroid Build Coastguard Worker shouldIncludeRenames := func() (DependencyUse, string) { 2719*333d2b36SAndroid Build Coastguard Worker if moduleName == m.Name() { 2720*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "name" // If we have the same module name, include the renames. 2721*333d2b36SAndroid Build Coastguard Worker } 2722*333d2b36SAndroid Build Coastguard Worker if sc, ok := module.(android.SdkContext); ok { 2723*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 2724*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, sc) 2725*333d2b36SAndroid Build Coastguard Worker if !sdkDep.invalidVersion && sdkDep.useFiles { 2726*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "useFiles" 2727*333d2b36SAndroid Build Coastguard Worker } 2728*333d2b36SAndroid Build Coastguard Worker } 2729*333d2b36SAndroid Build Coastguard Worker } 2730*333d2b36SAndroid Build Coastguard Worker if IsJniDepTag(tag) || tag == certificateTag || tag == proguardRaiseTag { 2731*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "tags" 2732*333d2b36SAndroid Build Coastguard Worker } 2733*333d2b36SAndroid Build Coastguard Worker if _, ok := android.OtherModuleProvider(ctx, m, SdkLibraryInfoProvider); ok { 2734*333d2b36SAndroid Build Coastguard Worker switch tag { 2735*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag: 2736*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "sdklibdep" // matches collectDeps() 2737*333d2b36SAndroid Build Coastguard Worker } 2738*333d2b36SAndroid Build Coastguard Worker return RenameUseInvalid, "sdklibdep" // dep is not used in collectDeps() 2739*333d2b36SAndroid Build Coastguard Worker } else if ji, ok := android.OtherModuleProvider(ctx, m, JavaInfoProvider); ok { 2740*333d2b36SAndroid Build Coastguard Worker switch ji.StubsLinkType { 2741*333d2b36SAndroid Build Coastguard Worker case Stubs: 2742*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "info" 2743*333d2b36SAndroid Build Coastguard Worker case Implementation: 2744*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "info" 2745*333d2b36SAndroid Build Coastguard Worker default: 2746*333d2b36SAndroid Build Coastguard Worker //fmt.Printf("collectDirectDepsProviders: %v -> %v StubsLinkType unknown\n", module, m) 2747*333d2b36SAndroid Build Coastguard Worker // Fall through to the heuristic logic. 2748*333d2b36SAndroid Build Coastguard Worker } 2749*333d2b36SAndroid Build Coastguard Worker switch reflect.TypeOf(m).String() { 2750*333d2b36SAndroid Build Coastguard Worker case "*java.GeneratedJavaLibraryModule": 2751*333d2b36SAndroid Build Coastguard Worker // Probably a java_aconfig_library module. 2752*333d2b36SAndroid Build Coastguard Worker // TODO: make this check better. 2753*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "reflect" 2754*333d2b36SAndroid Build Coastguard Worker } 2755*333d2b36SAndroid Build Coastguard Worker switch tag { 2756*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2757*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "tagswitch" 2758*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag, instrumentationForTag: 2759*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2760*333d2b36SAndroid Build Coastguard Worker case java9LibTag: 2761*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "tagswitch" 2762*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2763*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2764*333d2b36SAndroid Build Coastguard Worker case pluginTag: 2765*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2766*333d2b36SAndroid Build Coastguard Worker case errorpronePluginTag: 2767*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2768*333d2b36SAndroid Build Coastguard Worker case exportedPluginTag: 2769*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2770*333d2b36SAndroid Build Coastguard Worker case kotlinPluginTag: 2771*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "tagswitch" 2772*333d2b36SAndroid Build Coastguard Worker default: 2773*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "tagswitch" 2774*333d2b36SAndroid Build Coastguard Worker } 2775*333d2b36SAndroid Build Coastguard Worker } else if _, ok := m.(android.SourceFileProducer); ok { 2776*333d2b36SAndroid Build Coastguard Worker switch tag { 2777*333d2b36SAndroid Build Coastguard Worker case sdkLibTag, libTag, staticLibTag: 2778*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "srcfile" 2779*333d2b36SAndroid Build Coastguard Worker default: 2780*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "srcfile" 2781*333d2b36SAndroid Build Coastguard Worker } 2782*333d2b36SAndroid Build Coastguard Worker } else if _, ok := android.OtherModuleProvider(ctx, m, android.CodegenInfoProvider); ok { 2783*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "aconfig_declarations_group" 2784*333d2b36SAndroid Build Coastguard Worker } else { 2785*333d2b36SAndroid Build Coastguard Worker switch tag { 2786*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2787*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "else" 2788*333d2b36SAndroid Build Coastguard Worker case systemModulesTag: 2789*333d2b36SAndroid Build Coastguard Worker return RenameUseInclude, "else" 2790*333d2b36SAndroid Build Coastguard Worker } 2791*333d2b36SAndroid Build Coastguard Worker } 2792*333d2b36SAndroid Build Coastguard Worker // If we got here, choose the safer option, which may lead to a build failure, rather 2793*333d2b36SAndroid Build Coastguard Worker // than runtime failures on the device. 2794*333d2b36SAndroid Build Coastguard Worker return RenameUseExclude, "end" 2795*333d2b36SAndroid Build Coastguard Worker } 2796*333d2b36SAndroid Build Coastguard Worker 2797*333d2b36SAndroid Build Coastguard Worker if result == nil { 2798*333d2b36SAndroid Build Coastguard Worker result = &JarJarProviderData{ 2799*333d2b36SAndroid Build Coastguard Worker Rename: make(map[string]string), 2800*333d2b36SAndroid Build Coastguard Worker RenameUse: make([]RenameUseElement, 0), 2801*333d2b36SAndroid Build Coastguard Worker } 2802*333d2b36SAndroid Build Coastguard Worker } 2803*333d2b36SAndroid Build Coastguard Worker how, why := shouldIncludeRenames() 2804*333d2b36SAndroid Build Coastguard Worker result.RenameUse = append(result.RenameUse, RenameUseElement{DepName: m.Name(), RenameUse: how, Why: why}) 2805*333d2b36SAndroid Build Coastguard Worker if how != RenameUseInclude { 2806*333d2b36SAndroid Build Coastguard Worker // Nothing to merge. 2807*333d2b36SAndroid Build Coastguard Worker return 2808*333d2b36SAndroid Build Coastguard Worker } 2809*333d2b36SAndroid Build Coastguard Worker 2810*333d2b36SAndroid Build Coastguard Worker merge := func(theirs *JarJarProviderData) { 2811*333d2b36SAndroid Build Coastguard Worker for orig, renamed := range theirs.Rename { 2812*333d2b36SAndroid Build Coastguard Worker if preexisting, exists := (*result).Rename[orig]; !exists || preexisting == "" { 2813*333d2b36SAndroid Build Coastguard Worker result.Rename[orig] = renamed 2814*333d2b36SAndroid Build Coastguard Worker } else if preexisting != "" && renamed != "" && preexisting != renamed { 2815*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(preexisting, overridableJarJarPrefix) { 2816*333d2b36SAndroid Build Coastguard Worker result.Rename[orig] = renamed 2817*333d2b36SAndroid Build Coastguard Worker } else if !strings.HasPrefix(renamed, overridableJarJarPrefix) { 2818*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("1. Conflicting jarjar rules inherited for class: %s (%s and %s)", orig, renamed, preexisting, ctx.ModuleName(), m.Name()) 2819*333d2b36SAndroid Build Coastguard Worker continue 2820*333d2b36SAndroid Build Coastguard Worker } 2821*333d2b36SAndroid Build Coastguard Worker } 2822*333d2b36SAndroid Build Coastguard Worker } 2823*333d2b36SAndroid Build Coastguard Worker } 2824*333d2b36SAndroid Build Coastguard Worker if theirs, ok := android.OtherModuleProvider(ctx, m, JarJarProvider); ok { 2825*333d2b36SAndroid Build Coastguard Worker merge(&theirs) 2826*333d2b36SAndroid Build Coastguard Worker } else if theirs, ok := android.OtherModuleProvider(ctx, m, BaseJarJarProvider); ok { 2827*333d2b36SAndroid Build Coastguard Worker // TODO: if every java.Module should have a JarJarProvider, and we find only the 2828*333d2b36SAndroid Build Coastguard Worker // BaseJarJarProvider, then there is a bug. Consider seeing if m can be cast 2829*333d2b36SAndroid Build Coastguard Worker // to java.Module. 2830*333d2b36SAndroid Build Coastguard Worker merge(&theirs.JarJarProviderData) 2831*333d2b36SAndroid Build Coastguard Worker } 2832*333d2b36SAndroid Build Coastguard Worker }) 2833*333d2b36SAndroid Build Coastguard Worker return 2834*333d2b36SAndroid Build Coastguard Worker} 2835*333d2b36SAndroid Build Coastguard Worker 2836*333d2b36SAndroid Build Coastguard Workerfunc (this Module) GetDebugString() string { 2837*333d2b36SAndroid Build Coastguard Worker return "sdk_version=" + proptools.String(this.deviceProperties.Sdk_version) 2838*333d2b36SAndroid Build Coastguard Worker} 2839*333d2b36SAndroid Build Coastguard Worker 2840*333d2b36SAndroid Build Coastguard Worker// Merge the jarjar rules we inherit from our dependencies, any that have been added directly to 2841*333d2b36SAndroid Build Coastguard Worker// us, and if it's been set, apply the jarjar_prefix property to rename them. 2842*333d2b36SAndroid Build Coastguard Workerfunc (module *Module) collectJarJarRules(ctx android.ModuleContext) *JarJarProviderData { 2843*333d2b36SAndroid Build Coastguard Worker // Gather repackage information from deps 2844*333d2b36SAndroid Build Coastguard Worker result := collectDirectDepsProviders(ctx) 2845*333d2b36SAndroid Build Coastguard Worker 2846*333d2b36SAndroid Build Coastguard Worker add := func(orig string, renamed string) { 2847*333d2b36SAndroid Build Coastguard Worker if result == nil { 2848*333d2b36SAndroid Build Coastguard Worker result = &JarJarProviderData{ 2849*333d2b36SAndroid Build Coastguard Worker Rename: make(map[string]string), 2850*333d2b36SAndroid Build Coastguard Worker } 2851*333d2b36SAndroid Build Coastguard Worker } 2852*333d2b36SAndroid Build Coastguard Worker if renamed != "" { 2853*333d2b36SAndroid Build Coastguard Worker if preexisting, exists := (*result).Rename[orig]; exists && preexisting != renamed { 2854*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Conflicting jarjar rules inherited for class: %s (%s and %s)", orig, renamed, preexisting) 2855*333d2b36SAndroid Build Coastguard Worker return 2856*333d2b36SAndroid Build Coastguard Worker } 2857*333d2b36SAndroid Build Coastguard Worker } 2858*333d2b36SAndroid Build Coastguard Worker (*result).Rename[orig] = renamed 2859*333d2b36SAndroid Build Coastguard Worker } 2860*333d2b36SAndroid Build Coastguard Worker 2861*333d2b36SAndroid Build Coastguard Worker // Update that with entries we've stored for ourself 2862*333d2b36SAndroid Build Coastguard Worker for orig, renamed := range module.jarjarRenameRules { 2863*333d2b36SAndroid Build Coastguard Worker add(orig, renamed) 2864*333d2b36SAndroid Build Coastguard Worker } 2865*333d2b36SAndroid Build Coastguard Worker 2866*333d2b36SAndroid Build Coastguard Worker // Update that with entries given in the jarjar_rename property. 2867*333d2b36SAndroid Build Coastguard Worker for _, orig := range module.properties.Jarjar_rename { 2868*333d2b36SAndroid Build Coastguard Worker add(orig, "") 2869*333d2b36SAndroid Build Coastguard Worker } 2870*333d2b36SAndroid Build Coastguard Worker 2871*333d2b36SAndroid Build Coastguard Worker // If there are no renamings, then jarjar_prefix does nothing, so skip the extra work. 2872*333d2b36SAndroid Build Coastguard Worker if result == nil { 2873*333d2b36SAndroid Build Coastguard Worker return nil 2874*333d2b36SAndroid Build Coastguard Worker } 2875*333d2b36SAndroid Build Coastguard Worker 2876*333d2b36SAndroid Build Coastguard Worker // If they've given us a jarjar_prefix property, then we will use that to rename any classes 2877*333d2b36SAndroid Build Coastguard Worker // that have not yet been renamed. 2878*333d2b36SAndroid Build Coastguard Worker prefix := proptools.String(module.properties.Jarjar_prefix) 2879*333d2b36SAndroid Build Coastguard Worker if prefix != "" { 2880*333d2b36SAndroid Build Coastguard Worker if prefix[0] == '.' { 2881*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("jarjar_prefix", "jarjar_prefix can not start with '.'") 2882*333d2b36SAndroid Build Coastguard Worker return nil 2883*333d2b36SAndroid Build Coastguard Worker } 2884*333d2b36SAndroid Build Coastguard Worker if prefix[len(prefix)-1] == '.' { 2885*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("jarjar_prefix", "jarjar_prefix can not end with '.'") 2886*333d2b36SAndroid Build Coastguard Worker return nil 2887*333d2b36SAndroid Build Coastguard Worker } 2888*333d2b36SAndroid Build Coastguard Worker 2889*333d2b36SAndroid Build Coastguard Worker var updated map[string]string 2890*333d2b36SAndroid Build Coastguard Worker for orig, renamed := range (*result).Rename { 2891*333d2b36SAndroid Build Coastguard Worker if renamed == "" { 2892*333d2b36SAndroid Build Coastguard Worker if updated == nil { 2893*333d2b36SAndroid Build Coastguard Worker updated = make(map[string]string) 2894*333d2b36SAndroid Build Coastguard Worker } 2895*333d2b36SAndroid Build Coastguard Worker updated[orig] = prefix + "." + orig 2896*333d2b36SAndroid Build Coastguard Worker } 2897*333d2b36SAndroid Build Coastguard Worker } 2898*333d2b36SAndroid Build Coastguard Worker for orig, renamed := range updated { 2899*333d2b36SAndroid Build Coastguard Worker (*result).Rename[orig] = renamed 2900*333d2b36SAndroid Build Coastguard Worker } 2901*333d2b36SAndroid Build Coastguard Worker } 2902*333d2b36SAndroid Build Coastguard Worker 2903*333d2b36SAndroid Build Coastguard Worker return result 2904*333d2b36SAndroid Build Coastguard Worker} 2905*333d2b36SAndroid Build Coastguard Worker 2906*333d2b36SAndroid Build Coastguard Worker// Get the jarjar rule text for a given provider for the fully resolved rules. Classes that map 2907*333d2b36SAndroid Build Coastguard Worker// to "" won't be in this list because they shouldn't be renamed yet. 2908*333d2b36SAndroid Build Coastguard Workerfunc getJarJarRuleText(provider *JarJarProviderData) string { 2909*333d2b36SAndroid Build Coastguard Worker result := "" 2910*333d2b36SAndroid Build Coastguard Worker for _, orig := range android.SortedKeys(provider.Rename) { 2911*333d2b36SAndroid Build Coastguard Worker renamed := provider.Rename[orig] 2912*333d2b36SAndroid Build Coastguard Worker if renamed != "" { 2913*333d2b36SAndroid Build Coastguard Worker result += "rule " + orig + " " + renamed + "\n" 2914*333d2b36SAndroid Build Coastguard Worker } 2915*333d2b36SAndroid Build Coastguard Worker } 2916*333d2b36SAndroid Build Coastguard Worker return result 2917*333d2b36SAndroid Build Coastguard Worker} 2918*333d2b36SAndroid Build Coastguard Worker 2919*333d2b36SAndroid Build Coastguard Worker// Repackage the flags if the jarjar rule txt for the flags is generated 2920*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) repackageFlagsIfNecessary(ctx android.ModuleContext, infile android.Path, jarName, info string) (android.Path, bool) { 2921*333d2b36SAndroid Build Coastguard Worker if j.repackageJarjarRules == nil { 2922*333d2b36SAndroid Build Coastguard Worker return infile, false 2923*333d2b36SAndroid Build Coastguard Worker } 2924*333d2b36SAndroid Build Coastguard Worker repackagedJarjarFile := android.PathForModuleOut(ctx, "repackaged-jarjar", info, jarName) 2925*333d2b36SAndroid Build Coastguard Worker TransformJarJar(ctx, repackagedJarjarFile, infile, j.repackageJarjarRules) 2926*333d2b36SAndroid Build Coastguard Worker return repackagedJarjarFile, true 2927*333d2b36SAndroid Build Coastguard Worker} 2928*333d2b36SAndroid Build Coastguard Worker 2929*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) jarjarIfNecessary(ctx android.ModuleContext, infile android.Path, jarName, info string) (android.Path, bool) { 2930*333d2b36SAndroid Build Coastguard Worker if j.expandJarjarRules == nil { 2931*333d2b36SAndroid Build Coastguard Worker return infile, false 2932*333d2b36SAndroid Build Coastguard Worker } 2933*333d2b36SAndroid Build Coastguard Worker jarjarFile := android.PathForModuleOut(ctx, "jarjar", info, jarName) 2934*333d2b36SAndroid Build Coastguard Worker TransformJarJar(ctx, jarjarFile, infile, j.expandJarjarRules) 2935*333d2b36SAndroid Build Coastguard Worker return jarjarFile, true 2936*333d2b36SAndroid Build Coastguard Worker 2937*333d2b36SAndroid Build Coastguard Worker} 2938*333d2b36SAndroid Build Coastguard Worker 2939*333d2b36SAndroid Build Coastguard Workerfunc addPlugins(deps *deps, pluginJars android.Paths, pluginClasses ...string) { 2940*333d2b36SAndroid Build Coastguard Worker deps.processorPath = append(deps.processorPath, pluginJars...) 2941*333d2b36SAndroid Build Coastguard Worker deps.processorClasses = append(deps.processorClasses, pluginClasses...) 2942*333d2b36SAndroid Build Coastguard Worker} 2943*333d2b36SAndroid Build Coastguard Worker 2944*333d2b36SAndroid Build Coastguard Worker// TODO(b/132357300) Generalize SdkLibrarComponentDependency to non-SDK libraries and merge with 2945*333d2b36SAndroid Build Coastguard Worker// this interface. 2946*333d2b36SAndroid Build Coastguard Workertype ProvidesUsesLib interface { 2947*333d2b36SAndroid Build Coastguard Worker ProvidesUsesLib() *string 2948*333d2b36SAndroid Build Coastguard Worker} 2949*333d2b36SAndroid Build Coastguard Worker 2950*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) ProvidesUsesLib() *string { 2951*333d2b36SAndroid Build Coastguard Worker return j.usesLibraryProperties.Provides_uses_lib 2952*333d2b36SAndroid Build Coastguard Worker} 2953*333d2b36SAndroid Build Coastguard Worker 2954*333d2b36SAndroid Build Coastguard Workertype ModuleWithStem interface { 2955*333d2b36SAndroid Build Coastguard Worker Stem() string 2956*333d2b36SAndroid Build Coastguard Worker} 2957*333d2b36SAndroid Build Coastguard Worker 2958*333d2b36SAndroid Build Coastguard Workervar _ ModuleWithStem = (*Module)(nil) 2959*333d2b36SAndroid Build Coastguard Worker 2960*333d2b36SAndroid Build Coastguard Workertype ModuleWithUsesLibrary interface { 2961*333d2b36SAndroid Build Coastguard Worker UsesLibrary() *usesLibrary 2962*333d2b36SAndroid Build Coastguard Worker} 2963*333d2b36SAndroid Build Coastguard Worker 2964*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) UsesLibrary() *usesLibrary { 2965*333d2b36SAndroid Build Coastguard Worker return &j.usesLibrary 2966*333d2b36SAndroid Build Coastguard Worker} 2967*333d2b36SAndroid Build Coastguard Worker 2968*333d2b36SAndroid Build Coastguard Workervar _ ModuleWithUsesLibrary = (*Module)(nil) 2969