1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 Worker// This file contains the module types for compiling Java for Android, and converts the properties 18*333d2b36SAndroid Build Coastguard Worker// into the flags and filenames necessary to pass to the Module. The final creation of the rules 19*333d2b36SAndroid Build Coastguard Worker// is handled in builder.go 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Workerimport ( 22*333d2b36SAndroid Build Coastguard Worker "fmt" 23*333d2b36SAndroid Build Coastguard Worker "path/filepath" 24*333d2b36SAndroid Build Coastguard Worker "slices" 25*333d2b36SAndroid Build Coastguard Worker "sort" 26*333d2b36SAndroid Build Coastguard Worker "strings" 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Worker "android/soong/remoteexec" 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 31*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/depset" 32*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 35*333d2b36SAndroid Build Coastguard Worker "android/soong/cc" 36*333d2b36SAndroid Build Coastguard Worker "android/soong/dexpreopt" 37*333d2b36SAndroid Build Coastguard Worker "android/soong/java/config" 38*333d2b36SAndroid Build Coastguard Worker "android/soong/tradefed" 39*333d2b36SAndroid Build Coastguard Worker) 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc init() { 42*333d2b36SAndroid Build Coastguard Worker registerJavaBuildComponents(android.InitRegistrationContext) 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker RegisterJavaSdkMemberTypes() 45*333d2b36SAndroid Build Coastguard Worker} 46*333d2b36SAndroid Build Coastguard Worker 47*333d2b36SAndroid Build Coastguard Workerfunc registerJavaBuildComponents(ctx android.RegistrationContext) { 48*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_defaults", DefaultsFactory) 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_library", LibraryFactory) 51*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_library_static", LibraryStaticFactory) 52*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_library_host", LibraryHostFactory) 53*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_binary", BinaryFactory) 54*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_binary_host", BinaryHostFactory) 55*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_test", TestFactory) 56*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_test_helper_library", TestHelperLibraryFactory) 57*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_test_host", TestHostFactory) 58*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_test_import", JavaTestImportFactory) 59*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_import", ImportFactory) 60*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_import_host", ImportFactoryHost) 61*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_device_for_host", DeviceForHostFactory) 62*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_host_for_device", HostForDeviceFactory) 63*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("dex_import", DexImportFactory) 64*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_api_library", ApiLibraryFactory) 65*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_api_contribution", ApiContributionFactory) 66*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("java_api_contribution_import", ApiContributionImportFactory) 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker // This mutator registers dependencies on dex2oat for modules that should be 69*333d2b36SAndroid Build Coastguard Worker // dexpreopted. This is done late when the final variants have been 70*333d2b36SAndroid Build Coastguard Worker // established, to not get the dependencies split into the wrong variants and 71*333d2b36SAndroid Build Coastguard Worker // to support the checks in dexpreoptDisabled(). 72*333d2b36SAndroid Build Coastguard Worker ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { 73*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("dexpreopt_tool_deps", dexpreoptToolDepsMutator) 74*333d2b36SAndroid Build Coastguard Worker // needs access to ApexInfoProvider which is available after variant creation 75*333d2b36SAndroid Build Coastguard Worker ctx.BottomUp("jacoco_deps", jacocoDepsMutator) 76*333d2b36SAndroid Build Coastguard Worker }) 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Worker ctx.RegisterParallelSingletonType("kythe_java_extract", kytheExtractJavaFactory) 79*333d2b36SAndroid Build Coastguard Worker} 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Workerfunc RegisterJavaSdkMemberTypes() { 82*333d2b36SAndroid Build Coastguard Worker // Register sdk member types. 83*333d2b36SAndroid Build Coastguard Worker android.RegisterSdkMemberType(javaHeaderLibsSdkMemberType) 84*333d2b36SAndroid Build Coastguard Worker android.RegisterSdkMemberType(javaLibsSdkMemberType) 85*333d2b36SAndroid Build Coastguard Worker android.RegisterSdkMemberType(JavaBootLibsSdkMemberType) 86*333d2b36SAndroid Build Coastguard Worker android.RegisterSdkMemberType(JavaSystemserverLibsSdkMemberType) 87*333d2b36SAndroid Build Coastguard Worker android.RegisterSdkMemberType(javaTestSdkMemberType) 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workertype StubsLinkType int 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Workerconst ( 93*333d2b36SAndroid Build Coastguard Worker Unknown StubsLinkType = iota 94*333d2b36SAndroid Build Coastguard Worker Stubs 95*333d2b36SAndroid Build Coastguard Worker Implementation 96*333d2b36SAndroid Build Coastguard Worker) 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workervar ( 99*333d2b36SAndroid Build Coastguard Worker // Supports adding java header libraries to module_exports and sdk. 100*333d2b36SAndroid Build Coastguard Worker javaHeaderLibsSdkMemberType = &librarySdkMemberType{ 101*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase{ 102*333d2b36SAndroid Build Coastguard Worker PropertyName: "java_header_libs", 103*333d2b36SAndroid Build Coastguard Worker SupportsSdk: true, 104*333d2b36SAndroid Build Coastguard Worker }, 105*333d2b36SAndroid Build Coastguard Worker func(_ android.SdkMemberContext, j *Library) android.Path { 106*333d2b36SAndroid Build Coastguard Worker headerJars := j.HeaderJars() 107*333d2b36SAndroid Build Coastguard Worker if len(headerJars) != 1 { 108*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("there must be only one header jar from %q", j.Name())) 109*333d2b36SAndroid Build Coastguard Worker } 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker return headerJars[0] 112*333d2b36SAndroid Build Coastguard Worker }, 113*333d2b36SAndroid Build Coastguard Worker sdkSnapshotFilePathForJar, 114*333d2b36SAndroid Build Coastguard Worker copyEverythingToSnapshot, 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker // Export implementation classes jar as part of the sdk. 118*333d2b36SAndroid Build Coastguard Worker exportImplementationClassesJar = func(_ android.SdkMemberContext, j *Library) android.Path { 119*333d2b36SAndroid Build Coastguard Worker implementationJars := j.ImplementationAndResourcesJars() 120*333d2b36SAndroid Build Coastguard Worker if len(implementationJars) != 1 { 121*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("there must be only one implementation jar from %q", j.Name())) 122*333d2b36SAndroid Build Coastguard Worker } 123*333d2b36SAndroid Build Coastguard Worker return implementationJars[0] 124*333d2b36SAndroid Build Coastguard Worker } 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker // Supports adding java implementation libraries to module_exports but not sdk. 127*333d2b36SAndroid Build Coastguard Worker javaLibsSdkMemberType = &librarySdkMemberType{ 128*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase{ 129*333d2b36SAndroid Build Coastguard Worker PropertyName: "java_libs", 130*333d2b36SAndroid Build Coastguard Worker }, 131*333d2b36SAndroid Build Coastguard Worker exportImplementationClassesJar, 132*333d2b36SAndroid Build Coastguard Worker sdkSnapshotFilePathForJar, 133*333d2b36SAndroid Build Coastguard Worker copyEverythingToSnapshot, 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker snapshotRequiresImplementationJar = func(ctx android.SdkMemberContext) bool { 137*333d2b36SAndroid Build Coastguard Worker // In the S build the build will break if updatable-media does not provide a full implementation 138*333d2b36SAndroid Build Coastguard Worker // jar. That issue was fixed in Tiramisu by b/229932396. 139*333d2b36SAndroid Build Coastguard Worker if ctx.IsTargetBuildBeforeTiramisu() && ctx.Name() == "updatable-media" { 140*333d2b36SAndroid Build Coastguard Worker return true 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker return false 144*333d2b36SAndroid Build Coastguard Worker } 145*333d2b36SAndroid Build Coastguard Worker 146*333d2b36SAndroid Build Coastguard Worker // Supports adding java boot libraries to module_exports and sdk. 147*333d2b36SAndroid Build Coastguard Worker // 148*333d2b36SAndroid Build Coastguard Worker // The build has some implicit dependencies (via the boot jars configuration) on a number of 149*333d2b36SAndroid Build Coastguard Worker // modules, e.g. core-oj, apache-xml, that are part of the java boot class path and which are 150*333d2b36SAndroid Build Coastguard Worker // provided by mainline modules (e.g. art, conscrypt, runtime-i18n) but which are not otherwise 151*333d2b36SAndroid Build Coastguard Worker // used outside those mainline modules. 152*333d2b36SAndroid Build Coastguard Worker // 153*333d2b36SAndroid Build Coastguard Worker // As they are not needed outside the mainline modules adding them to the sdk/module-exports as 154*333d2b36SAndroid Build Coastguard Worker // either java_libs, or java_header_libs would end up exporting more information than was strictly 155*333d2b36SAndroid Build Coastguard Worker // necessary. The java_boot_libs property to allow those modules to be exported as part of the 156*333d2b36SAndroid Build Coastguard Worker // sdk/module_exports without exposing any unnecessary information. 157*333d2b36SAndroid Build Coastguard Worker JavaBootLibsSdkMemberType = &librarySdkMemberType{ 158*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase{ 159*333d2b36SAndroid Build Coastguard Worker PropertyName: "java_boot_libs", 160*333d2b36SAndroid Build Coastguard Worker SupportsSdk: true, 161*333d2b36SAndroid Build Coastguard Worker }, 162*333d2b36SAndroid Build Coastguard Worker func(ctx android.SdkMemberContext, j *Library) android.Path { 163*333d2b36SAndroid Build Coastguard Worker if snapshotRequiresImplementationJar(ctx) { 164*333d2b36SAndroid Build Coastguard Worker return exportImplementationClassesJar(ctx, j) 165*333d2b36SAndroid Build Coastguard Worker } 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker // Java boot libs are only provided in the SDK to provide access to their dex implementation 168*333d2b36SAndroid Build Coastguard Worker // jar for use by dexpreopting and boot jars package check. They do not need to provide an 169*333d2b36SAndroid Build Coastguard Worker // actual implementation jar but the java_import will need a file that exists so just copy an 170*333d2b36SAndroid Build Coastguard Worker // empty file. Any attempt to use that file as a jar will cause a build error. 171*333d2b36SAndroid Build Coastguard Worker return ctx.SnapshotBuilder().EmptyFile() 172*333d2b36SAndroid Build Coastguard Worker }, 173*333d2b36SAndroid Build Coastguard Worker func(ctx android.SdkMemberContext, osPrefix, name string) string { 174*333d2b36SAndroid Build Coastguard Worker if snapshotRequiresImplementationJar(ctx) { 175*333d2b36SAndroid Build Coastguard Worker return sdkSnapshotFilePathForJar(ctx, osPrefix, name) 176*333d2b36SAndroid Build Coastguard Worker } 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker // Create a special name for the implementation jar to try and provide some useful information 179*333d2b36SAndroid Build Coastguard Worker // to a developer that attempts to compile against this. 180*333d2b36SAndroid Build Coastguard Worker // TODO(b/175714559): Provide a proper error message in Soong not ninja. 181*333d2b36SAndroid Build Coastguard Worker return filepath.Join(osPrefix, "java_boot_libs", "snapshot", "jars", "are", "invalid", name+jarFileSuffix) 182*333d2b36SAndroid Build Coastguard Worker }, 183*333d2b36SAndroid Build Coastguard Worker onlyCopyJarToSnapshot, 184*333d2b36SAndroid Build Coastguard Worker } 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker // Supports adding java systemserver libraries to module_exports and sdk. 187*333d2b36SAndroid Build Coastguard Worker // 188*333d2b36SAndroid Build Coastguard Worker // The build has some implicit dependencies (via the systemserver jars configuration) on a number 189*333d2b36SAndroid Build Coastguard Worker // of modules that are part of the java systemserver classpath and which are provided by mainline 190*333d2b36SAndroid Build Coastguard Worker // modules but which are not otherwise used outside those mainline modules. 191*333d2b36SAndroid Build Coastguard Worker // 192*333d2b36SAndroid Build Coastguard Worker // As they are not needed outside the mainline modules adding them to the sdk/module-exports as 193*333d2b36SAndroid Build Coastguard Worker // either java_libs, or java_header_libs would end up exporting more information than was strictly 194*333d2b36SAndroid Build Coastguard Worker // necessary. The java_systemserver_libs property to allow those modules to be exported as part of 195*333d2b36SAndroid Build Coastguard Worker // the sdk/module_exports without exposing any unnecessary information. 196*333d2b36SAndroid Build Coastguard Worker JavaSystemserverLibsSdkMemberType = &librarySdkMemberType{ 197*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase{ 198*333d2b36SAndroid Build Coastguard Worker PropertyName: "java_systemserver_libs", 199*333d2b36SAndroid Build Coastguard Worker SupportsSdk: true, 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker // This was only added in Tiramisu. 202*333d2b36SAndroid Build Coastguard Worker SupportedBuildReleaseSpecification: "Tiramisu+", 203*333d2b36SAndroid Build Coastguard Worker }, 204*333d2b36SAndroid Build Coastguard Worker func(ctx android.SdkMemberContext, j *Library) android.Path { 205*333d2b36SAndroid Build Coastguard Worker // Java systemserver libs are only provided in the SDK to provide access to their dex 206*333d2b36SAndroid Build Coastguard Worker // implementation jar for use by dexpreopting. They do not need to provide an actual 207*333d2b36SAndroid Build Coastguard Worker // implementation jar but the java_import will need a file that exists so just copy an empty 208*333d2b36SAndroid Build Coastguard Worker // file. Any attempt to use that file as a jar will cause a build error. 209*333d2b36SAndroid Build Coastguard Worker return ctx.SnapshotBuilder().EmptyFile() 210*333d2b36SAndroid Build Coastguard Worker }, 211*333d2b36SAndroid Build Coastguard Worker func(_ android.SdkMemberContext, osPrefix, name string) string { 212*333d2b36SAndroid Build Coastguard Worker // Create a special name for the implementation jar to try and provide some useful information 213*333d2b36SAndroid Build Coastguard Worker // to a developer that attempts to compile against this. 214*333d2b36SAndroid Build Coastguard Worker // TODO(b/175714559): Provide a proper error message in Soong not ninja. 215*333d2b36SAndroid Build Coastguard Worker return filepath.Join(osPrefix, "java_systemserver_libs", "snapshot", "jars", "are", "invalid", name+jarFileSuffix) 216*333d2b36SAndroid Build Coastguard Worker }, 217*333d2b36SAndroid Build Coastguard Worker onlyCopyJarToSnapshot, 218*333d2b36SAndroid Build Coastguard Worker } 219*333d2b36SAndroid Build Coastguard Worker 220*333d2b36SAndroid Build Coastguard Worker // Supports adding java test libraries to module_exports but not sdk. 221*333d2b36SAndroid Build Coastguard Worker javaTestSdkMemberType = &testSdkMemberType{ 222*333d2b36SAndroid Build Coastguard Worker SdkMemberTypeBase: android.SdkMemberTypeBase{ 223*333d2b36SAndroid Build Coastguard Worker PropertyName: "java_tests", 224*333d2b36SAndroid Build Coastguard Worker }, 225*333d2b36SAndroid Build Coastguard Worker } 226*333d2b36SAndroid Build Coastguard Worker 227*333d2b36SAndroid Build Coastguard Worker // Rule for generating device binary default wrapper 228*333d2b36SAndroid Build Coastguard Worker deviceBinaryWrapper = pctx.StaticRule("deviceBinaryWrapper", blueprint.RuleParams{ 229*333d2b36SAndroid Build Coastguard Worker Command: `printf '#!/system/bin/sh\n` + 230*333d2b36SAndroid Build Coastguard Worker `export CLASSPATH=/system/framework/$jar_name\n` + 231*333d2b36SAndroid Build Coastguard Worker `exec app_process /$partition/bin $main_class "$$@"\n'> ${out}`, 232*333d2b36SAndroid Build Coastguard Worker Description: "Generating device binary wrapper ${jar_name}", 233*333d2b36SAndroid Build Coastguard Worker }, "jar_name", "partition", "main_class") 234*333d2b36SAndroid Build Coastguard Worker) 235*333d2b36SAndroid Build Coastguard Worker 236*333d2b36SAndroid Build Coastguard Workertype ProguardSpecInfo struct { 237*333d2b36SAndroid Build Coastguard Worker // If true, proguard flags files will be exported to reverse dependencies across libs edges 238*333d2b36SAndroid Build Coastguard Worker // If false, proguard flags files will only be exported to reverse dependencies across 239*333d2b36SAndroid Build Coastguard Worker // static_libs edges. 240*333d2b36SAndroid Build Coastguard Worker Export_proguard_flags_files bool 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker // TransitiveDepsProguardSpecFiles is a depset of paths to proguard flags files that are exported from 243*333d2b36SAndroid Build Coastguard Worker // all transitive deps. This list includes all proguard flags files from transitive static dependencies, 244*333d2b36SAndroid Build Coastguard Worker // and all proguard flags files from transitive libs dependencies which set `export_proguard_spec: true`. 245*333d2b36SAndroid Build Coastguard Worker ProguardFlagsFiles depset.DepSet[android.Path] 246*333d2b36SAndroid Build Coastguard Worker 247*333d2b36SAndroid Build Coastguard Worker // implementation detail to store transitive proguard flags files from exporting shared deps 248*333d2b36SAndroid Build Coastguard Worker UnconditionallyExportedProguardFlags depset.DepSet[android.Path] 249*333d2b36SAndroid Build Coastguard Worker} 250*333d2b36SAndroid Build Coastguard Worker 251*333d2b36SAndroid Build Coastguard Workervar ProguardSpecInfoProvider = blueprint.NewProvider[ProguardSpecInfo]() 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker// JavaInfo contains information about a java module for use by modules that depend on it. 254*333d2b36SAndroid Build Coastguard Workertype JavaInfo struct { 255*333d2b36SAndroid Build Coastguard Worker // HeaderJars is a list of jars that can be passed as the javac classpath in order to link 256*333d2b36SAndroid Build Coastguard Worker // against this module. If empty, ImplementationJars should be used instead. 257*333d2b36SAndroid Build Coastguard Worker // Unlike LocalHeaderJars, HeaderJars includes classes from static dependencies. 258*333d2b36SAndroid Build Coastguard Worker HeaderJars android.Paths 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Worker RepackagedHeaderJars android.Paths 261*333d2b36SAndroid Build Coastguard Worker 262*333d2b36SAndroid Build Coastguard Worker // set of header jars for all transitive libs deps 263*333d2b36SAndroid Build Coastguard Worker TransitiveLibsHeaderJarsForR8 depset.DepSet[android.Path] 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker // set of header jars for all transitive static libs deps 266*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJarsForR8 depset.DepSet[android.Path] 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker // depset of header jars for this module and all transitive static dependencies 269*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars depset.DepSet[android.Path] 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker // depset of implementation jars for this module and all transitive static dependencies 272*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsImplementationJars depset.DepSet[android.Path] 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker // depset of resource jars for this module and all transitive static dependencies 275*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsResourceJars depset.DepSet[android.Path] 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker // ImplementationAndResourceJars is a list of jars that contain the implementations of classes 278*333d2b36SAndroid Build Coastguard Worker // in the module as well as any resources included in the module. 279*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars android.Paths 280*333d2b36SAndroid Build Coastguard Worker 281*333d2b36SAndroid Build Coastguard Worker // ImplementationJars is a list of jars that contain the implementations of classes in the 282*333d2b36SAndroid Build Coastguard Worker // module. 283*333d2b36SAndroid Build Coastguard Worker ImplementationJars android.Paths 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker // ResourceJars is a list of jars that contain the resources included in the module. 286*333d2b36SAndroid Build Coastguard Worker ResourceJars android.Paths 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker // LocalHeaderJars is a list of jars that contain classes from this module, but not from any static dependencies. 289*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars android.Paths 290*333d2b36SAndroid Build Coastguard Worker 291*333d2b36SAndroid Build Coastguard Worker // AidlIncludeDirs is a list of directories that should be passed to the aidl tool when 292*333d2b36SAndroid Build Coastguard Worker // depending on this module. 293*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs android.Paths 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker // SrcJarArgs is a list of arguments to pass to soong_zip to package the sources of this 296*333d2b36SAndroid Build Coastguard Worker // module. 297*333d2b36SAndroid Build Coastguard Worker SrcJarArgs []string 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker // SrcJarDeps is a list of paths to depend on when packaging the sources of this module. 300*333d2b36SAndroid Build Coastguard Worker SrcJarDeps android.Paths 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker // The source files of this module and all its transitive static dependencies. 303*333d2b36SAndroid Build Coastguard Worker TransitiveSrcFiles depset.DepSet[android.Path] 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker // ExportedPlugins is a list of paths that should be used as annotation processors for any 306*333d2b36SAndroid Build Coastguard Worker // module that depends on this module. 307*333d2b36SAndroid Build Coastguard Worker ExportedPlugins android.Paths 308*333d2b36SAndroid Build Coastguard Worker 309*333d2b36SAndroid Build Coastguard Worker // ExportedPluginClasses is a list of classes that should be run as annotation processors for 310*333d2b36SAndroid Build Coastguard Worker // any module that depends on this module. 311*333d2b36SAndroid Build Coastguard Worker ExportedPluginClasses []string 312*333d2b36SAndroid Build Coastguard Worker 313*333d2b36SAndroid Build Coastguard Worker // ExportedPluginDisableTurbine is true if this module's annotation processors generate APIs, 314*333d2b36SAndroid Build Coastguard Worker // requiring disbling turbine for any modules that depend on it. 315*333d2b36SAndroid Build Coastguard Worker ExportedPluginDisableTurbine bool 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Worker // JacocoReportClassesFile is the path to a jar containing uninstrumented classes that will be 318*333d2b36SAndroid Build Coastguard Worker // instrumented by jacoco. 319*333d2b36SAndroid Build Coastguard Worker JacocoReportClassesFile android.Path 320*333d2b36SAndroid Build Coastguard Worker 321*333d2b36SAndroid Build Coastguard Worker // StubsLinkType provides information about whether the provided jars are stub jars or 322*333d2b36SAndroid Build Coastguard Worker // implementation jars. If the provider is set by java_sdk_library, the link type is "unknown" 323*333d2b36SAndroid Build Coastguard Worker // and selection between the stub jar vs implementation jar is deferred to SdkLibrary.sdkJars(...) 324*333d2b36SAndroid Build Coastguard Worker StubsLinkType StubsLinkType 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker // AconfigIntermediateCacheOutputPaths is a path to the cache files collected from the 327*333d2b36SAndroid Build Coastguard Worker // java_aconfig_library modules that are statically linked to this module. 328*333d2b36SAndroid Build Coastguard Worker AconfigIntermediateCacheOutputPaths android.Paths 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Worker SdkVersion android.SdkSpec 331*333d2b36SAndroid Build Coastguard Worker} 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Workervar JavaInfoProvider = blueprint.NewProvider[*JavaInfo]() 334*333d2b36SAndroid Build Coastguard Worker 335*333d2b36SAndroid Build Coastguard Worker// SyspropPublicStubInfo contains info about the sysprop public stub library that corresponds to 336*333d2b36SAndroid Build Coastguard Worker// the sysprop implementation library. 337*333d2b36SAndroid Build Coastguard Workertype SyspropPublicStubInfo struct { 338*333d2b36SAndroid Build Coastguard Worker // JavaInfo is the JavaInfoProvider of the sysprop public stub library that corresponds to 339*333d2b36SAndroid Build Coastguard Worker // the sysprop implementation library. 340*333d2b36SAndroid Build Coastguard Worker JavaInfo *JavaInfo 341*333d2b36SAndroid Build Coastguard Worker} 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Workervar SyspropPublicStubInfoProvider = blueprint.NewProvider[SyspropPublicStubInfo]() 344*333d2b36SAndroid Build Coastguard Worker 345*333d2b36SAndroid Build Coastguard Worker// Methods that need to be implemented for a module that is added to apex java_libs property. 346*333d2b36SAndroid Build Coastguard Workertype ApexDependency interface { 347*333d2b36SAndroid Build Coastguard Worker HeaderJars() android.Paths 348*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars() android.Paths 349*333d2b36SAndroid Build Coastguard Worker} 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker// Provides build path and install path to DEX jars. 352*333d2b36SAndroid Build Coastguard Workertype UsesLibraryDependency interface { 353*333d2b36SAndroid Build Coastguard Worker DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath 354*333d2b36SAndroid Build Coastguard Worker DexJarInstallPath() android.Path 355*333d2b36SAndroid Build Coastguard Worker ClassLoaderContexts() dexpreopt.ClassLoaderContextMap 356*333d2b36SAndroid Build Coastguard Worker} 357*333d2b36SAndroid Build Coastguard Worker 358*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Move this to kythe.go once it's created. 359*333d2b36SAndroid Build Coastguard Workertype xref interface { 360*333d2b36SAndroid Build Coastguard Worker XrefJavaFiles() android.Paths 361*333d2b36SAndroid Build Coastguard Worker XrefKotlinFiles() android.Paths 362*333d2b36SAndroid Build Coastguard Worker} 363*333d2b36SAndroid Build Coastguard Worker 364*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) XrefJavaFiles() android.Paths { 365*333d2b36SAndroid Build Coastguard Worker return j.kytheFiles 366*333d2b36SAndroid Build Coastguard Worker} 367*333d2b36SAndroid Build Coastguard Worker 368*333d2b36SAndroid Build Coastguard Workerfunc (j *Module) XrefKotlinFiles() android.Paths { 369*333d2b36SAndroid Build Coastguard Worker return j.kytheKotlinFiles 370*333d2b36SAndroid Build Coastguard Worker} 371*333d2b36SAndroid Build Coastguard Worker 372*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) PropagateAconfigValidation() bool { 373*333d2b36SAndroid Build Coastguard Worker return d.static 374*333d2b36SAndroid Build Coastguard Worker} 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Workervar _ android.PropagateAconfigValidationDependencyTag = dependencyTag{} 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Workertype dependencyTag struct { 379*333d2b36SAndroid Build Coastguard Worker blueprint.BaseDependencyTag 380*333d2b36SAndroid Build Coastguard Worker name string 381*333d2b36SAndroid Build Coastguard Worker 382*333d2b36SAndroid Build Coastguard Worker // True if the dependency is relinked at runtime. 383*333d2b36SAndroid Build Coastguard Worker runtimeLinked bool 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Worker // True if the dependency is a toolchain, for example an annotation processor. 386*333d2b36SAndroid Build Coastguard Worker toolchain bool 387*333d2b36SAndroid Build Coastguard Worker 388*333d2b36SAndroid Build Coastguard Worker static bool 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker installable bool 391*333d2b36SAndroid Build Coastguard Worker} 392*333d2b36SAndroid Build Coastguard Worker 393*333d2b36SAndroid Build Coastguard Workervar _ android.InstallNeededDependencyTag = (*dependencyTag)(nil) 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) InstallDepNeeded() bool { 396*333d2b36SAndroid Build Coastguard Worker return d.installable 397*333d2b36SAndroid Build Coastguard Worker} 398*333d2b36SAndroid Build Coastguard Worker 399*333d2b36SAndroid Build Coastguard Workerfunc (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation { 400*333d2b36SAndroid Build Coastguard Worker if d.runtimeLinked { 401*333d2b36SAndroid Build Coastguard Worker return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} 402*333d2b36SAndroid Build Coastguard Worker } else if d.toolchain { 403*333d2b36SAndroid Build Coastguard Worker return []android.LicenseAnnotation{android.LicenseAnnotationToolchain} 404*333d2b36SAndroid Build Coastguard Worker } 405*333d2b36SAndroid Build Coastguard Worker return nil 406*333d2b36SAndroid Build Coastguard Worker} 407*333d2b36SAndroid Build Coastguard Worker 408*333d2b36SAndroid Build Coastguard Workervar _ android.LicenseAnnotationsDependencyTag = dependencyTag{} 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Workertype usesLibraryDependencyTag struct { 411*333d2b36SAndroid Build Coastguard Worker dependencyTag 412*333d2b36SAndroid Build Coastguard Worker sdkVersion int // SDK version in which the library appared as a standalone library. 413*333d2b36SAndroid Build Coastguard Worker optional bool // If the dependency is optional or required. 414*333d2b36SAndroid Build Coastguard Worker} 415*333d2b36SAndroid Build Coastguard Worker 416*333d2b36SAndroid Build Coastguard Workerfunc makeUsesLibraryDependencyTag(sdkVersion int, optional bool) usesLibraryDependencyTag { 417*333d2b36SAndroid Build Coastguard Worker return usesLibraryDependencyTag{ 418*333d2b36SAndroid Build Coastguard Worker dependencyTag: dependencyTag{ 419*333d2b36SAndroid Build Coastguard Worker name: fmt.Sprintf("uses-library-%d", sdkVersion), 420*333d2b36SAndroid Build Coastguard Worker runtimeLinked: true, 421*333d2b36SAndroid Build Coastguard Worker }, 422*333d2b36SAndroid Build Coastguard Worker sdkVersion: sdkVersion, 423*333d2b36SAndroid Build Coastguard Worker optional: optional, 424*333d2b36SAndroid Build Coastguard Worker } 425*333d2b36SAndroid Build Coastguard Worker} 426*333d2b36SAndroid Build Coastguard Worker 427*333d2b36SAndroid Build Coastguard Workerfunc IsJniDepTag(depTag blueprint.DependencyTag) bool { 428*333d2b36SAndroid Build Coastguard Worker return depTag == jniLibTag || depTag == jniInstallTag 429*333d2b36SAndroid Build Coastguard Worker} 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Workervar ( 432*333d2b36SAndroid Build Coastguard Worker dataNativeBinsTag = dependencyTag{name: "dataNativeBins"} 433*333d2b36SAndroid Build Coastguard Worker dataDeviceBinsTag = dependencyTag{name: "dataDeviceBins"} 434*333d2b36SAndroid Build Coastguard Worker staticLibTag = dependencyTag{name: "staticlib", static: true} 435*333d2b36SAndroid Build Coastguard Worker libTag = dependencyTag{name: "javalib", runtimeLinked: true} 436*333d2b36SAndroid Build Coastguard Worker sdkLibTag = dependencyTag{name: "sdklib", runtimeLinked: true} 437*333d2b36SAndroid Build Coastguard Worker java9LibTag = dependencyTag{name: "java9lib", runtimeLinked: true} 438*333d2b36SAndroid Build Coastguard Worker pluginTag = dependencyTag{name: "plugin", toolchain: true} 439*333d2b36SAndroid Build Coastguard Worker errorpronePluginTag = dependencyTag{name: "errorprone-plugin", toolchain: true} 440*333d2b36SAndroid Build Coastguard Worker exportedPluginTag = dependencyTag{name: "exported-plugin", toolchain: true} 441*333d2b36SAndroid Build Coastguard Worker bootClasspathTag = dependencyTag{name: "bootclasspath", runtimeLinked: true} 442*333d2b36SAndroid Build Coastguard Worker systemModulesTag = dependencyTag{name: "system modules", runtimeLinked: true} 443*333d2b36SAndroid Build Coastguard Worker frameworkResTag = dependencyTag{name: "framework-res"} 444*333d2b36SAndroid Build Coastguard Worker kotlinPluginTag = dependencyTag{name: "kotlin-plugin", toolchain: true} 445*333d2b36SAndroid Build Coastguard Worker proguardRaiseTag = dependencyTag{name: "proguard-raise"} 446*333d2b36SAndroid Build Coastguard Worker certificateTag = dependencyTag{name: "certificate"} 447*333d2b36SAndroid Build Coastguard Worker instrumentationForTag = dependencyTag{name: "instrumentation_for"} 448*333d2b36SAndroid Build Coastguard Worker extraLintCheckTag = dependencyTag{name: "extra-lint-check", toolchain: true} 449*333d2b36SAndroid Build Coastguard Worker jniLibTag = dependencyTag{name: "jnilib", runtimeLinked: true} 450*333d2b36SAndroid Build Coastguard Worker r8LibraryJarTag = dependencyTag{name: "r8-libraryjar", runtimeLinked: true} 451*333d2b36SAndroid Build Coastguard Worker syspropPublicStubDepTag = dependencyTag{name: "sysprop public stub"} 452*333d2b36SAndroid Build Coastguard Worker javaApiContributionTag = dependencyTag{name: "java-api-contribution"} 453*333d2b36SAndroid Build Coastguard Worker aconfigDeclarationTag = dependencyTag{name: "aconfig-declaration"} 454*333d2b36SAndroid Build Coastguard Worker jniInstallTag = dependencyTag{name: "jni install", runtimeLinked: true, installable: true} 455*333d2b36SAndroid Build Coastguard Worker usesLibReqTag = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion, false) 456*333d2b36SAndroid Build Coastguard Worker usesLibOptTag = makeUsesLibraryDependencyTag(dexpreopt.AnySdkVersion, true) 457*333d2b36SAndroid Build Coastguard Worker usesLibCompat28OptTag = makeUsesLibraryDependencyTag(28, true) 458*333d2b36SAndroid Build Coastguard Worker usesLibCompat29ReqTag = makeUsesLibraryDependencyTag(29, false) 459*333d2b36SAndroid Build Coastguard Worker usesLibCompat30OptTag = makeUsesLibraryDependencyTag(30, true) 460*333d2b36SAndroid Build Coastguard Worker) 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Worker// A list of tags for deps used for compiling a module. 463*333d2b36SAndroid Build Coastguard Worker// Any dependency tags that modifies the following properties of `deps` in `Module.collectDeps` should be 464*333d2b36SAndroid Build Coastguard Worker// added to this list: 465*333d2b36SAndroid Build Coastguard Worker// - bootClasspath 466*333d2b36SAndroid Build Coastguard Worker// - classpath 467*333d2b36SAndroid Build Coastguard Worker// - java9Classpath 468*333d2b36SAndroid Build Coastguard Worker// - systemModules 469*333d2b36SAndroid Build Coastguard Worker// - kotlin deps... 470*333d2b36SAndroid Build Coastguard Workervar ( 471*333d2b36SAndroid Build Coastguard Worker compileDependencyTags = []blueprint.DependencyTag{ 472*333d2b36SAndroid Build Coastguard Worker sdkLibTag, 473*333d2b36SAndroid Build Coastguard Worker libTag, 474*333d2b36SAndroid Build Coastguard Worker staticLibTag, 475*333d2b36SAndroid Build Coastguard Worker bootClasspathTag, 476*333d2b36SAndroid Build Coastguard Worker systemModulesTag, 477*333d2b36SAndroid Build Coastguard Worker java9LibTag, 478*333d2b36SAndroid Build Coastguard Worker kotlinPluginTag, 479*333d2b36SAndroid Build Coastguard Worker syspropPublicStubDepTag, 480*333d2b36SAndroid Build Coastguard Worker instrumentationForTag, 481*333d2b36SAndroid Build Coastguard Worker } 482*333d2b36SAndroid Build Coastguard Worker) 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Workerfunc IsLibDepTag(depTag blueprint.DependencyTag) bool { 485*333d2b36SAndroid Build Coastguard Worker return depTag == libTag || depTag == sdkLibTag 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc IsStaticLibDepTag(depTag blueprint.DependencyTag) bool { 489*333d2b36SAndroid Build Coastguard Worker return depTag == staticLibTag 490*333d2b36SAndroid Build Coastguard Worker} 491*333d2b36SAndroid Build Coastguard Worker 492*333d2b36SAndroid Build Coastguard Workertype sdkDep struct { 493*333d2b36SAndroid Build Coastguard Worker useModule, useFiles, invalidVersion bool 494*333d2b36SAndroid Build Coastguard Worker 495*333d2b36SAndroid Build Coastguard Worker // The modules that will be added to the bootclasspath when targeting 1.8 or lower 496*333d2b36SAndroid Build Coastguard Worker bootclasspath []string 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Worker // The default system modules to use. Will be an empty string if no system 499*333d2b36SAndroid Build Coastguard Worker // modules are to be used. 500*333d2b36SAndroid Build Coastguard Worker systemModules string 501*333d2b36SAndroid Build Coastguard Worker 502*333d2b36SAndroid Build Coastguard Worker // The modules that will be added to the classpath regardless of the Java language level targeted 503*333d2b36SAndroid Build Coastguard Worker classpath []string 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker // The modules that will be added ot the classpath when targeting 1.9 or higher 506*333d2b36SAndroid Build Coastguard Worker // (normally these will be on the bootclasspath when targeting 1.8 or lower) 507*333d2b36SAndroid Build Coastguard Worker java9Classpath []string 508*333d2b36SAndroid Build Coastguard Worker 509*333d2b36SAndroid Build Coastguard Worker frameworkResModule string 510*333d2b36SAndroid Build Coastguard Worker 511*333d2b36SAndroid Build Coastguard Worker jars android.Paths 512*333d2b36SAndroid Build Coastguard Worker aidl android.OptionalPath 513*333d2b36SAndroid Build Coastguard Worker 514*333d2b36SAndroid Build Coastguard Worker noStandardLibs, noFrameworksLibs bool 515*333d2b36SAndroid Build Coastguard Worker} 516*333d2b36SAndroid Build Coastguard Worker 517*333d2b36SAndroid Build Coastguard Workerfunc (s sdkDep) hasStandardLibs() bool { 518*333d2b36SAndroid Build Coastguard Worker return !s.noStandardLibs 519*333d2b36SAndroid Build Coastguard Worker} 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Workerfunc (s sdkDep) hasFrameworkLibs() bool { 522*333d2b36SAndroid Build Coastguard Worker return !s.noStandardLibs && !s.noFrameworksLibs 523*333d2b36SAndroid Build Coastguard Worker} 524*333d2b36SAndroid Build Coastguard Worker 525*333d2b36SAndroid Build Coastguard Workertype jniLib struct { 526*333d2b36SAndroid Build Coastguard Worker name string 527*333d2b36SAndroid Build Coastguard Worker path android.Path 528*333d2b36SAndroid Build Coastguard Worker target android.Target 529*333d2b36SAndroid Build Coastguard Worker coverageFile android.OptionalPath 530*333d2b36SAndroid Build Coastguard Worker unstrippedFile android.Path 531*333d2b36SAndroid Build Coastguard Worker partition string 532*333d2b36SAndroid Build Coastguard Worker installPaths android.InstallPaths 533*333d2b36SAndroid Build Coastguard Worker} 534*333d2b36SAndroid Build Coastguard Worker 535*333d2b36SAndroid Build Coastguard Workerfunc sdkDeps(ctx android.BottomUpMutatorContext, sdkContext android.SdkContext, d dexer) { 536*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, sdkContext) 537*333d2b36SAndroid Build Coastguard Worker if sdkDep.useModule { 538*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...) 539*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, java9LibTag, sdkDep.java9Classpath...) 540*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, sdkLibTag, sdkDep.classpath...) 541*333d2b36SAndroid Build Coastguard Worker if d.effectiveOptimizeEnabled() && sdkDep.hasStandardLibs() { 542*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, proguardRaiseTag, 543*333d2b36SAndroid Build Coastguard Worker config.LegacyCorePlatformBootclasspathLibraries..., 544*333d2b36SAndroid Build Coastguard Worker ) 545*333d2b36SAndroid Build Coastguard Worker } 546*333d2b36SAndroid Build Coastguard Worker if d.effectiveOptimizeEnabled() && sdkDep.hasFrameworkLibs() { 547*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, proguardRaiseTag, config.FrameworkLibraries...) 548*333d2b36SAndroid Build Coastguard Worker } 549*333d2b36SAndroid Build Coastguard Worker } 550*333d2b36SAndroid Build Coastguard Worker if sdkDep.systemModules != "" { 551*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules) 552*333d2b36SAndroid Build Coastguard Worker } 553*333d2b36SAndroid Build Coastguard Worker} 554*333d2b36SAndroid Build Coastguard Worker 555*333d2b36SAndroid Build Coastguard Workertype deps struct { 556*333d2b36SAndroid Build Coastguard Worker // bootClasspath is the list of jars that form the boot classpath (generally the java.* and 557*333d2b36SAndroid Build Coastguard Worker // android.* classes) for tools that still use it. javac targeting 1.9 or higher uses 558*333d2b36SAndroid Build Coastguard Worker // systemModules and java9Classpath instead. 559*333d2b36SAndroid Build Coastguard Worker bootClasspath classpath 560*333d2b36SAndroid Build Coastguard Worker 561*333d2b36SAndroid Build Coastguard Worker // classpath is the list of jars that form the classpath for javac and kotlinc rules. It 562*333d2b36SAndroid Build Coastguard Worker // contains header jars for all static and non-static dependencies. 563*333d2b36SAndroid Build Coastguard Worker classpath classpath 564*333d2b36SAndroid Build Coastguard Worker 565*333d2b36SAndroid Build Coastguard Worker // dexClasspath is the list of jars that form the classpath for d8 and r8 rules. It contains 566*333d2b36SAndroid Build Coastguard Worker // header jars for all non-static dependencies. Static dependencies have already been 567*333d2b36SAndroid Build Coastguard Worker // combined into the program jar. 568*333d2b36SAndroid Build Coastguard Worker dexClasspath classpath 569*333d2b36SAndroid Build Coastguard Worker 570*333d2b36SAndroid Build Coastguard Worker // java9Classpath is the list of jars that will be added to the classpath when targeting 571*333d2b36SAndroid Build Coastguard Worker // 1.9 or higher. It generally contains the android.* classes, while the java.* classes 572*333d2b36SAndroid Build Coastguard Worker // are provided by systemModules. 573*333d2b36SAndroid Build Coastguard Worker java9Classpath classpath 574*333d2b36SAndroid Build Coastguard Worker 575*333d2b36SAndroid Build Coastguard Worker processorPath classpath `` 576*333d2b36SAndroid Build Coastguard Worker errorProneProcessorPath classpath 577*333d2b36SAndroid Build Coastguard Worker processorClasses []string 578*333d2b36SAndroid Build Coastguard Worker staticJars android.Paths 579*333d2b36SAndroid Build Coastguard Worker staticHeaderJars android.Paths 580*333d2b36SAndroid Build Coastguard Worker staticResourceJars android.Paths 581*333d2b36SAndroid Build Coastguard Worker aidlIncludeDirs android.Paths 582*333d2b36SAndroid Build Coastguard Worker srcs android.Paths 583*333d2b36SAndroid Build Coastguard Worker srcJars android.Paths 584*333d2b36SAndroid Build Coastguard Worker systemModules *systemModules 585*333d2b36SAndroid Build Coastguard Worker aidlPreprocess android.OptionalPath 586*333d2b36SAndroid Build Coastguard Worker kotlinPlugins android.Paths 587*333d2b36SAndroid Build Coastguard Worker aconfigProtoFiles android.Paths 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker disableTurbine bool 590*333d2b36SAndroid Build Coastguard Worker 591*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars []depset.DepSet[android.Path] 592*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsImplementationJars []depset.DepSet[android.Path] 593*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsResourceJars []depset.DepSet[android.Path] 594*333d2b36SAndroid Build Coastguard Worker} 595*333d2b36SAndroid Build Coastguard Worker 596*333d2b36SAndroid Build Coastguard Workerfunc checkProducesJars(ctx android.ModuleContext, dep android.SourceFileProducer) { 597*333d2b36SAndroid Build Coastguard Worker for _, f := range dep.Srcs() { 598*333d2b36SAndroid Build Coastguard Worker if f.Ext() != ".jar" { 599*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("genrule %q must generate files ending with .jar to be used as a libs or static_libs dependency", 600*333d2b36SAndroid Build Coastguard Worker ctx.OtherModuleName(dep.(blueprint.Module))) 601*333d2b36SAndroid Build Coastguard Worker } 602*333d2b36SAndroid Build Coastguard Worker } 603*333d2b36SAndroid Build Coastguard Worker} 604*333d2b36SAndroid Build Coastguard Worker 605*333d2b36SAndroid Build Coastguard Workerfunc getJavaVersion(ctx android.ModuleContext, javaVersion string, sdkContext android.SdkContext) javaVersion { 606*333d2b36SAndroid Build Coastguard Worker if javaVersion != "" { 607*333d2b36SAndroid Build Coastguard Worker return normalizeJavaVersion(ctx, javaVersion) 608*333d2b36SAndroid Build Coastguard Worker } else if ctx.Device() { 609*333d2b36SAndroid Build Coastguard Worker return defaultJavaLanguageVersion(ctx, sdkContext.SdkVersion(ctx)) 610*333d2b36SAndroid Build Coastguard Worker } else if ctx.Config().TargetsJava21() { 611*333d2b36SAndroid Build Coastguard Worker // Build flag that controls whether Java 21 is used as the default 612*333d2b36SAndroid Build Coastguard Worker // target version, or Java 17. 613*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_21 614*333d2b36SAndroid Build Coastguard Worker } else { 615*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_17 616*333d2b36SAndroid Build Coastguard Worker } 617*333d2b36SAndroid Build Coastguard Worker} 618*333d2b36SAndroid Build Coastguard Worker 619*333d2b36SAndroid Build Coastguard Worker// Java version for stubs generation 620*333d2b36SAndroid Build Coastguard Workerfunc getStubsJavaVersion() javaVersion { 621*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_8 622*333d2b36SAndroid Build Coastguard Worker} 623*333d2b36SAndroid Build Coastguard Worker 624*333d2b36SAndroid Build Coastguard Workertype javaVersion int 625*333d2b36SAndroid Build Coastguard Worker 626*333d2b36SAndroid Build Coastguard Workerconst ( 627*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_UNSUPPORTED = 0 628*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_6 = 6 629*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_7 = 7 630*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_8 = 8 631*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_9 = 9 632*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_11 = 11 633*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_17 = 17 634*333d2b36SAndroid Build Coastguard Worker JAVA_VERSION_21 = 21 635*333d2b36SAndroid Build Coastguard Worker) 636*333d2b36SAndroid Build Coastguard Worker 637*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) String() string { 638*333d2b36SAndroid Build Coastguard Worker switch v { 639*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_6: 640*333d2b36SAndroid Build Coastguard Worker // Java version 1.6 no longer supported, bumping to 1.8 641*333d2b36SAndroid Build Coastguard Worker return "1.8" 642*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_7: 643*333d2b36SAndroid Build Coastguard Worker // Java version 1.7 no longer supported, bumping to 1.8 644*333d2b36SAndroid Build Coastguard Worker return "1.8" 645*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_8: 646*333d2b36SAndroid Build Coastguard Worker return "1.8" 647*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_9: 648*333d2b36SAndroid Build Coastguard Worker return "1.9" 649*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_11: 650*333d2b36SAndroid Build Coastguard Worker return "11" 651*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_17: 652*333d2b36SAndroid Build Coastguard Worker return "17" 653*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_21: 654*333d2b36SAndroid Build Coastguard Worker return "21" 655*333d2b36SAndroid Build Coastguard Worker default: 656*333d2b36SAndroid Build Coastguard Worker return "unsupported" 657*333d2b36SAndroid Build Coastguard Worker } 658*333d2b36SAndroid Build Coastguard Worker} 659*333d2b36SAndroid Build Coastguard Worker 660*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) StringForKotlinc() string { 661*333d2b36SAndroid Build Coastguard Worker // $ ./external/kotlinc/bin/kotlinc -jvm-target foo 662*333d2b36SAndroid Build Coastguard Worker // error: unknown JVM target version: foo 663*333d2b36SAndroid Build Coastguard Worker // Supported versions: 1.8, 9, 10, 11, 12, 13, 14, 15, 16, 17 664*333d2b36SAndroid Build Coastguard Worker switch v { 665*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_6: 666*333d2b36SAndroid Build Coastguard Worker return "1.8" 667*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_7: 668*333d2b36SAndroid Build Coastguard Worker return "1.8" 669*333d2b36SAndroid Build Coastguard Worker case JAVA_VERSION_9: 670*333d2b36SAndroid Build Coastguard Worker return "9" 671*333d2b36SAndroid Build Coastguard Worker default: 672*333d2b36SAndroid Build Coastguard Worker return v.String() 673*333d2b36SAndroid Build Coastguard Worker } 674*333d2b36SAndroid Build Coastguard Worker} 675*333d2b36SAndroid Build Coastguard Worker 676*333d2b36SAndroid Build Coastguard Worker// Returns true if javac targeting this version uses system modules instead of a bootclasspath. 677*333d2b36SAndroid Build Coastguard Workerfunc (v javaVersion) usesJavaModules() bool { 678*333d2b36SAndroid Build Coastguard Worker return v >= 9 679*333d2b36SAndroid Build Coastguard Worker} 680*333d2b36SAndroid Build Coastguard Worker 681*333d2b36SAndroid Build Coastguard Workerfunc normalizeJavaVersion(ctx android.BaseModuleContext, javaVersion string) javaVersion { 682*333d2b36SAndroid Build Coastguard Worker switch javaVersion { 683*333d2b36SAndroid Build Coastguard Worker case "1.6", "6": 684*333d2b36SAndroid Build Coastguard Worker // Java version 1.6 no longer supported, bumping to 1.8 685*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_8 686*333d2b36SAndroid Build Coastguard Worker case "1.7", "7": 687*333d2b36SAndroid Build Coastguard Worker // Java version 1.7 no longer supported, bumping to 1.8 688*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_8 689*333d2b36SAndroid Build Coastguard Worker case "1.8", "8": 690*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_8 691*333d2b36SAndroid Build Coastguard Worker case "1.9", "9": 692*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_9 693*333d2b36SAndroid Build Coastguard Worker case "11": 694*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_11 695*333d2b36SAndroid Build Coastguard Worker case "17": 696*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_17 697*333d2b36SAndroid Build Coastguard Worker case "21": 698*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_21 699*333d2b36SAndroid Build Coastguard Worker case "10", "12", "13", "14", "15", "16": 700*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("java_version", "Java language level %s is not supported", javaVersion) 701*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_UNSUPPORTED 702*333d2b36SAndroid Build Coastguard Worker default: 703*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("java_version", "Unrecognized Java language level") 704*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_UNSUPPORTED 705*333d2b36SAndroid Build Coastguard Worker } 706*333d2b36SAndroid Build Coastguard Worker} 707*333d2b36SAndroid Build Coastguard Worker 708*333d2b36SAndroid Build Coastguard Worker// 709*333d2b36SAndroid Build Coastguard Worker// Java libraries (.jar file) 710*333d2b36SAndroid Build Coastguard Worker// 711*333d2b36SAndroid Build Coastguard Worker 712*333d2b36SAndroid Build Coastguard Workertype Library struct { 713*333d2b36SAndroid Build Coastguard Worker Module 714*333d2b36SAndroid Build Coastguard Worker 715*333d2b36SAndroid Build Coastguard Worker combinedExportedProguardFlagsFile android.Path 716*333d2b36SAndroid Build Coastguard Worker 717*333d2b36SAndroid Build Coastguard Worker InstallMixin func(ctx android.ModuleContext, installPath android.Path) (extraInstallDeps android.InstallPaths) 718*333d2b36SAndroid Build Coastguard Worker} 719*333d2b36SAndroid Build Coastguard Worker 720*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Library)(nil) 721*333d2b36SAndroid Build Coastguard Worker 722*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) CheckDepsMinSdkVersion(ctx android.ModuleContext) { 723*333d2b36SAndroid Build Coastguard Worker CheckMinSdkVersion(ctx, j) 724*333d2b36SAndroid Build Coastguard Worker} 725*333d2b36SAndroid Build Coastguard Worker 726*333d2b36SAndroid Build Coastguard Worker// Provides access to the list of permitted packages from apex boot jars. 727*333d2b36SAndroid Build Coastguard Workertype PermittedPackagesForUpdatableBootJars interface { 728*333d2b36SAndroid Build Coastguard Worker PermittedPackagesForUpdatableBootJars() []string 729*333d2b36SAndroid Build Coastguard Worker} 730*333d2b36SAndroid Build Coastguard Worker 731*333d2b36SAndroid Build Coastguard Workervar _ PermittedPackagesForUpdatableBootJars = (*Library)(nil) 732*333d2b36SAndroid Build Coastguard Worker 733*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) PermittedPackagesForUpdatableBootJars() []string { 734*333d2b36SAndroid Build Coastguard Worker return j.properties.Permitted_packages 735*333d2b36SAndroid Build Coastguard Worker} 736*333d2b36SAndroid Build Coastguard Worker 737*333d2b36SAndroid Build Coastguard Workerfunc shouldUncompressDex(ctx android.ModuleContext, libName string, dexpreopter *dexpreopter) bool { 738*333d2b36SAndroid Build Coastguard Worker // Store uncompressed (and aligned) any dex files from jars in APEXes. 739*333d2b36SAndroid Build Coastguard Worker if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() { 740*333d2b36SAndroid Build Coastguard Worker return true 741*333d2b36SAndroid Build Coastguard Worker } 742*333d2b36SAndroid Build Coastguard Worker 743*333d2b36SAndroid Build Coastguard Worker // Store uncompressed (and do not strip) dex files from boot class path jars. 744*333d2b36SAndroid Build Coastguard Worker if inList(ctx.ModuleName(), ctx.Config().BootJars()) { 745*333d2b36SAndroid Build Coastguard Worker return true 746*333d2b36SAndroid Build Coastguard Worker } 747*333d2b36SAndroid Build Coastguard Worker 748*333d2b36SAndroid Build Coastguard Worker // Store uncompressed dex files that are preopted on /system or /system_other. 749*333d2b36SAndroid Build Coastguard Worker if !dexpreopter.dexpreoptDisabled(ctx, libName) { 750*333d2b36SAndroid Build Coastguard Worker return true 751*333d2b36SAndroid Build Coastguard Worker } 752*333d2b36SAndroid Build Coastguard Worker 753*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UncompressPrivAppDex() && 754*333d2b36SAndroid Build Coastguard Worker inList(ctx.ModuleName(), ctx.Config().ModulesLoadedByPrivilegedModules()) { 755*333d2b36SAndroid Build Coastguard Worker return true 756*333d2b36SAndroid Build Coastguard Worker } 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Worker return false 759*333d2b36SAndroid Build Coastguard Worker} 760*333d2b36SAndroid Build Coastguard Worker 761*333d2b36SAndroid Build Coastguard Worker// Sets `dexer.dexProperties.Uncompress_dex` to the proper value. 762*333d2b36SAndroid Build Coastguard Workerfunc setUncompressDex(ctx android.ModuleContext, dexpreopter *dexpreopter, dexer *dexer) { 763*333d2b36SAndroid Build Coastguard Worker if dexer.dexProperties.Uncompress_dex == nil { 764*333d2b36SAndroid Build Coastguard Worker // If the value was not force-set by the user, use reasonable default based on the module. 765*333d2b36SAndroid Build Coastguard Worker dexer.dexProperties.Uncompress_dex = proptools.BoolPtr(shouldUncompressDex(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), dexpreopter)) 766*333d2b36SAndroid Build Coastguard Worker } 767*333d2b36SAndroid Build Coastguard Worker} 768*333d2b36SAndroid Build Coastguard Worker 769*333d2b36SAndroid Build Coastguard Worker// list of java_library modules that set platform_apis: true 770*333d2b36SAndroid Build Coastguard Worker// this property is a no-op for java_library 771*333d2b36SAndroid Build Coastguard Worker// TODO (b/215379393): Remove this allowlist 772*333d2b36SAndroid Build Coastguard Workervar ( 773*333d2b36SAndroid Build Coastguard Worker aospPlatformApiAllowlist = map[string]bool{ 774*333d2b36SAndroid Build Coastguard Worker "adservices-test-scenarios": true, 775*333d2b36SAndroid Build Coastguard Worker "aidl-cpp-java-test-interface-java": true, 776*333d2b36SAndroid Build Coastguard Worker "aidl-test-extras-java": true, 777*333d2b36SAndroid Build Coastguard Worker "aidl-test-interface-java": true, 778*333d2b36SAndroid Build Coastguard Worker "aidl-test-interface-permission-java": true, 779*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_client_permission": true, 780*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_client_sdk1": true, 781*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_client_sdk29": true, 782*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_client": true, 783*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_service_permission": true, 784*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_service_sdk1": true, 785*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_service_sdk29": true, 786*333d2b36SAndroid Build Coastguard Worker "aidl_test_java_service": true, 787*333d2b36SAndroid Build Coastguard Worker "aidl_test_loggable_interface-java": true, 788*333d2b36SAndroid Build Coastguard Worker "aidl_test_nonvintf_parcelable-V1-java": true, 789*333d2b36SAndroid Build Coastguard Worker "aidl_test_nonvintf_parcelable-V2-java": true, 790*333d2b36SAndroid Build Coastguard Worker "aidl_test_unstable_parcelable-java": true, 791*333d2b36SAndroid Build Coastguard Worker "aidl_test_vintf_parcelable-V1-java": true, 792*333d2b36SAndroid Build Coastguard Worker "aidl_test_vintf_parcelable-V2-java": true, 793*333d2b36SAndroid Build Coastguard Worker "android.aidl.test.trunk-V1-java": true, 794*333d2b36SAndroid Build Coastguard Worker "android.aidl.test.trunk-V2-java": true, 795*333d2b36SAndroid Build Coastguard Worker "android.frameworks.location.altitude-V1-java": true, 796*333d2b36SAndroid Build Coastguard Worker "android.frameworks.location.altitude-V2-java": true, 797*333d2b36SAndroid Build Coastguard Worker "android.frameworks.stats-V1-java": true, 798*333d2b36SAndroid Build Coastguard Worker "android.frameworks.stats-V2-java": true, 799*333d2b36SAndroid Build Coastguard Worker "android.frameworks.stats-V3-java": true, 800*333d2b36SAndroid Build Coastguard Worker "android.hardware.authsecret-V1-java": true, 801*333d2b36SAndroid Build Coastguard Worker "android.hardware.authsecret-V2-java": true, 802*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.common-V1-java": true, 803*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.common-V2-java": true, 804*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.common-V3-java": true, 805*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.common-V4-java": true, 806*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.face-V1-java": true, 807*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.face-V2-java": true, 808*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.face-V3-java": true, 809*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.face-V4-java": true, 810*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.fingerprint-V1-java": true, 811*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.fingerprint-V2-java": true, 812*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.fingerprint-V3-java": true, 813*333d2b36SAndroid Build Coastguard Worker "android.hardware.biometrics.fingerprint-V4-java": true, 814*333d2b36SAndroid Build Coastguard Worker "android.hardware.bluetooth.lmp_event-V1-java": true, 815*333d2b36SAndroid Build Coastguard Worker "android.hardware.confirmationui-V1-java": true, 816*333d2b36SAndroid Build Coastguard Worker "android.hardware.confirmationui-V2-java": true, 817*333d2b36SAndroid Build Coastguard Worker "android.hardware.gatekeeper-V1-java": true, 818*333d2b36SAndroid Build Coastguard Worker "android.hardware.gatekeeper-V2-java": true, 819*333d2b36SAndroid Build Coastguard Worker "android.hardware.gnss-V1-java": true, 820*333d2b36SAndroid Build Coastguard Worker "android.hardware.gnss-V2-java": true, 821*333d2b36SAndroid Build Coastguard Worker "android.hardware.gnss-V3-java": true, 822*333d2b36SAndroid Build Coastguard Worker "android.hardware.gnss-V4-java": true, 823*333d2b36SAndroid Build Coastguard Worker "android.hardware.graphics.common-V1-java": true, 824*333d2b36SAndroid Build Coastguard Worker "android.hardware.graphics.common-V2-java": true, 825*333d2b36SAndroid Build Coastguard Worker "android.hardware.graphics.common-V3-java": true, 826*333d2b36SAndroid Build Coastguard Worker "android.hardware.graphics.common-V4-java": true, 827*333d2b36SAndroid Build Coastguard Worker "android.hardware.graphics.common-V5-java": true, 828*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V1-java": true, 829*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V2-java": true, 830*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V3-java": true, 831*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V4-java": true, 832*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V5-java": true, 833*333d2b36SAndroid Build Coastguard Worker "android.hardware.identity-V6-java": true, 834*333d2b36SAndroid Build Coastguard Worker "android.hardware.keymaster-V1-java": true, 835*333d2b36SAndroid Build Coastguard Worker "android.hardware.keymaster-V2-java": true, 836*333d2b36SAndroid Build Coastguard Worker "android.hardware.keymaster-V3-java": true, 837*333d2b36SAndroid Build Coastguard Worker "android.hardware.keymaster-V4-java": true, 838*333d2b36SAndroid Build Coastguard Worker "android.hardware.keymaster-V5-java": true, 839*333d2b36SAndroid Build Coastguard Worker "android.hardware.oemlock-V1-java": true, 840*333d2b36SAndroid Build Coastguard Worker "android.hardware.oemlock-V2-java": true, 841*333d2b36SAndroid Build Coastguard Worker "android.hardware.power.stats-V1-java": true, 842*333d2b36SAndroid Build Coastguard Worker "android.hardware.power.stats-V2-java": true, 843*333d2b36SAndroid Build Coastguard Worker "android.hardware.power.stats-V3-java": true, 844*333d2b36SAndroid Build Coastguard Worker "android.hardware.power-V1-java": true, 845*333d2b36SAndroid Build Coastguard Worker "android.hardware.power-V2-java": true, 846*333d2b36SAndroid Build Coastguard Worker "android.hardware.power-V3-java": true, 847*333d2b36SAndroid Build Coastguard Worker "android.hardware.power-V4-java": true, 848*333d2b36SAndroid Build Coastguard Worker "android.hardware.power-V5-java": true, 849*333d2b36SAndroid Build Coastguard Worker "android.hardware.rebootescrow-V1-java": true, 850*333d2b36SAndroid Build Coastguard Worker "android.hardware.rebootescrow-V2-java": true, 851*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.authgraph-V1-java": true, 852*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.keymint-V1-java": true, 853*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.keymint-V2-java": true, 854*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.keymint-V3-java": true, 855*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.keymint-V4-java": true, 856*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.secretkeeper-V1-java": true, 857*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.secureclock-V1-java": true, 858*333d2b36SAndroid Build Coastguard Worker "android.hardware.security.secureclock-V2-java": true, 859*333d2b36SAndroid Build Coastguard Worker "android.hardware.thermal-V1-java": true, 860*333d2b36SAndroid Build Coastguard Worker "android.hardware.thermal-V2-java": true, 861*333d2b36SAndroid Build Coastguard Worker "android.hardware.threadnetwork-V1-java": true, 862*333d2b36SAndroid Build Coastguard Worker "android.hardware.weaver-V1-java": true, 863*333d2b36SAndroid Build Coastguard Worker "android.hardware.weaver-V2-java": true, 864*333d2b36SAndroid Build Coastguard Worker "android.hardware.weaver-V3-java": true, 865*333d2b36SAndroid Build Coastguard Worker "android.security.attestationmanager-java": true, 866*333d2b36SAndroid Build Coastguard Worker "android.security.authorization-java": true, 867*333d2b36SAndroid Build Coastguard Worker "android.security.compat-java": true, 868*333d2b36SAndroid Build Coastguard Worker "android.security.legacykeystore-java": true, 869*333d2b36SAndroid Build Coastguard Worker "android.security.maintenance-java": true, 870*333d2b36SAndroid Build Coastguard Worker "android.security.metrics-java": true, 871*333d2b36SAndroid Build Coastguard Worker "android.system.keystore2-V1-java": true, 872*333d2b36SAndroid Build Coastguard Worker "android.system.keystore2-V2-java": true, 873*333d2b36SAndroid Build Coastguard Worker "android.system.keystore2-V3-java": true, 874*333d2b36SAndroid Build Coastguard Worker "android.system.keystore2-V4-java": true, 875*333d2b36SAndroid Build Coastguard Worker "binderReadParcelIface-java": true, 876*333d2b36SAndroid Build Coastguard Worker "binderRecordReplayTestIface-java": true, 877*333d2b36SAndroid Build Coastguard Worker "car-experimental-api-static-lib": true, 878*333d2b36SAndroid Build Coastguard Worker "collector-device-lib-platform": true, 879*333d2b36SAndroid Build Coastguard Worker "com.android.car.oem": true, 880*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V10-java": true, 881*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V1-java": true, 882*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V2-java": true, 883*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V3-java": true, 884*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V4-java": true, 885*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V5-java": true, 886*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V6-java": true, 887*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V7-java": true, 888*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V8-java": true, 889*333d2b36SAndroid Build Coastguard Worker "com.google.hardware.pixel.display-V9-java": true, 890*333d2b36SAndroid Build Coastguard Worker "conscrypt-support": true, 891*333d2b36SAndroid Build Coastguard Worker "cts-keystore-test-util": true, 892*333d2b36SAndroid Build Coastguard Worker "cts-keystore-user-auth-helper-library": true, 893*333d2b36SAndroid Build Coastguard Worker "ctsmediautil": true, 894*333d2b36SAndroid Build Coastguard Worker "CtsNetTestsNonUpdatableLib": true, 895*333d2b36SAndroid Build Coastguard Worker "DpmWrapper": true, 896*333d2b36SAndroid Build Coastguard Worker "flickerlib-apphelpers": true, 897*333d2b36SAndroid Build Coastguard Worker "flickerlib-helpers": true, 898*333d2b36SAndroid Build Coastguard Worker "flickerlib-parsers": true, 899*333d2b36SAndroid Build Coastguard Worker "flickerlib": true, 900*333d2b36SAndroid Build Coastguard Worker "hardware.google.bluetooth.ccc-V1-java": true, 901*333d2b36SAndroid Build Coastguard Worker "hardware.google.bluetooth.sar-V1-java": true, 902*333d2b36SAndroid Build Coastguard Worker "monet": true, 903*333d2b36SAndroid Build Coastguard Worker "pixel-power-ext-V1-java": true, 904*333d2b36SAndroid Build Coastguard Worker "pixel-power-ext-V2-java": true, 905*333d2b36SAndroid Build Coastguard Worker "pixel_stateresidency_provider_aidl_interface-java": true, 906*333d2b36SAndroid Build Coastguard Worker "pixel-thermal-ext-V1-java": true, 907*333d2b36SAndroid Build Coastguard Worker "protolog-lib": true, 908*333d2b36SAndroid Build Coastguard Worker "RkpRegistrationCheck": true, 909*333d2b36SAndroid Build Coastguard Worker "rotary-service-javastream-protos": true, 910*333d2b36SAndroid Build Coastguard Worker "service_based_camera_extensions": true, 911*333d2b36SAndroid Build Coastguard Worker "statsd-helper-test": true, 912*333d2b36SAndroid Build Coastguard Worker "statsd-helper": true, 913*333d2b36SAndroid Build Coastguard Worker "test-piece-2-V1-java": true, 914*333d2b36SAndroid Build Coastguard Worker "test-piece-2-V2-java": true, 915*333d2b36SAndroid Build Coastguard Worker "test-piece-3-V1-java": true, 916*333d2b36SAndroid Build Coastguard Worker "test-piece-3-V2-java": true, 917*333d2b36SAndroid Build Coastguard Worker "test-piece-3-V3-java": true, 918*333d2b36SAndroid Build Coastguard Worker "test-piece-4-V1-java": true, 919*333d2b36SAndroid Build Coastguard Worker "test-piece-4-V2-java": true, 920*333d2b36SAndroid Build Coastguard Worker "test-root-package-V1-java": true, 921*333d2b36SAndroid Build Coastguard Worker "test-root-package-V2-java": true, 922*333d2b36SAndroid Build Coastguard Worker "test-root-package-V3-java": true, 923*333d2b36SAndroid Build Coastguard Worker "test-root-package-V4-java": true, 924*333d2b36SAndroid Build Coastguard Worker "testServiceIface-java": true, 925*333d2b36SAndroid Build Coastguard Worker "wm-flicker-common-app-helpers": true, 926*333d2b36SAndroid Build Coastguard Worker "wm-flicker-common-assertions": true, 927*333d2b36SAndroid Build Coastguard Worker "wm-shell-flicker-utils": true, 928*333d2b36SAndroid Build Coastguard Worker "wycheproof-keystore": true, 929*333d2b36SAndroid Build Coastguard Worker } 930*333d2b36SAndroid Build Coastguard Worker 931*333d2b36SAndroid Build Coastguard Worker // Union of aosp and internal allowlists 932*333d2b36SAndroid Build Coastguard Worker PlatformApiAllowlist = map[string]bool{} 933*333d2b36SAndroid Build Coastguard Worker) 934*333d2b36SAndroid Build Coastguard Worker 935*333d2b36SAndroid Build Coastguard Workerfunc init() { 936*333d2b36SAndroid Build Coastguard Worker for k, v := range aospPlatformApiAllowlist { 937*333d2b36SAndroid Build Coastguard Worker PlatformApiAllowlist[k] = v 938*333d2b36SAndroid Build Coastguard Worker } 939*333d2b36SAndroid Build Coastguard Worker} 940*333d2b36SAndroid Build Coastguard Worker 941*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { 942*333d2b36SAndroid Build Coastguard Worker if disableSourceApexVariant(ctx) { 943*333d2b36SAndroid Build Coastguard Worker // Prebuilts are active, do not create the installation rules for the source javalib. 944*333d2b36SAndroid Build Coastguard Worker // Even though the source javalib is not used, we need to hide it to prevent duplicate installation rules. 945*333d2b36SAndroid Build Coastguard Worker // TODO (b/331665856): Implement a principled solution for this. 946*333d2b36SAndroid Build Coastguard Worker j.HideFromMake() 947*333d2b36SAndroid Build Coastguard Worker j.SkipInstall() 948*333d2b36SAndroid Build Coastguard Worker } 949*333d2b36SAndroid Build Coastguard Worker j.provideHiddenAPIPropertyInfo(ctx) 950*333d2b36SAndroid Build Coastguard Worker 951*333d2b36SAndroid Build Coastguard Worker j.sdkVersion = j.SdkVersion(ctx) 952*333d2b36SAndroid Build Coastguard Worker j.minSdkVersion = j.MinSdkVersion(ctx) 953*333d2b36SAndroid Build Coastguard Worker j.maxSdkVersion = j.MaxSdkVersion(ctx) 954*333d2b36SAndroid Build Coastguard Worker 955*333d2b36SAndroid Build Coastguard Worker // Check min_sdk_version of the transitive dependencies if this module is created from 956*333d2b36SAndroid Build Coastguard Worker // java_sdk_library. 957*333d2b36SAndroid Build Coastguard Worker if j.overridableProperties.Min_sdk_version != nil && j.SdkLibraryName() != nil { 958*333d2b36SAndroid Build Coastguard Worker j.CheckDepsMinSdkVersion(ctx) 959*333d2b36SAndroid Build Coastguard Worker } 960*333d2b36SAndroid Build Coastguard Worker 961*333d2b36SAndroid Build Coastguard Worker // SdkLibrary.GenerateAndroidBuildActions(ctx) sets the stubsLinkType to Unknown. 962*333d2b36SAndroid Build Coastguard Worker // If the stubsLinkType has already been set to Unknown, the stubsLinkType should 963*333d2b36SAndroid Build Coastguard Worker // not be overridden. 964*333d2b36SAndroid Build Coastguard Worker if j.stubsLinkType != Unknown { 965*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(j.properties.Is_stubs_module) { 966*333d2b36SAndroid Build Coastguard Worker j.stubsLinkType = Stubs 967*333d2b36SAndroid Build Coastguard Worker } else { 968*333d2b36SAndroid Build Coastguard Worker j.stubsLinkType = Implementation 969*333d2b36SAndroid Build Coastguard Worker } 970*333d2b36SAndroid Build Coastguard Worker } 971*333d2b36SAndroid Build Coastguard Worker 972*333d2b36SAndroid Build Coastguard Worker j.stem = proptools.StringDefault(j.overridableProperties.Stem, ctx.ModuleName()) 973*333d2b36SAndroid Build Coastguard Worker 974*333d2b36SAndroid Build Coastguard Worker proguardSpecInfo := j.collectProguardSpecInfo(ctx) 975*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, ProguardSpecInfoProvider, proguardSpecInfo) 976*333d2b36SAndroid Build Coastguard Worker exportedProguardFlagsFiles := proguardSpecInfo.ProguardFlagsFiles.ToList() 977*333d2b36SAndroid Build Coastguard Worker j.extraProguardFlagsFiles = append(j.extraProguardFlagsFiles, exportedProguardFlagsFiles...) 978*333d2b36SAndroid Build Coastguard Worker 979*333d2b36SAndroid Build Coastguard Worker combinedExportedProguardFlagFile := android.PathForModuleOut(ctx, "export_proguard_flags") 980*333d2b36SAndroid Build Coastguard Worker writeCombinedProguardFlagsFile(ctx, combinedExportedProguardFlagFile, exportedProguardFlagsFiles) 981*333d2b36SAndroid Build Coastguard Worker j.combinedExportedProguardFlagsFile = combinedExportedProguardFlagFile 982*333d2b36SAndroid Build Coastguard Worker 983*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 984*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 985*333d2b36SAndroid Build Coastguard Worker j.hideApexVariantFromMake = true 986*333d2b36SAndroid Build Coastguard Worker } 987*333d2b36SAndroid Build Coastguard Worker 988*333d2b36SAndroid Build Coastguard Worker j.checkSdkVersions(ctx) 989*333d2b36SAndroid Build Coastguard Worker j.checkHeadersOnly(ctx) 990*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 991*333d2b36SAndroid Build Coastguard Worker libName := j.Name() 992*333d2b36SAndroid Build Coastguard Worker if j.SdkLibraryName() != nil && strings.HasSuffix(libName, ".impl") { 993*333d2b36SAndroid Build Coastguard Worker libName = proptools.String(j.SdkLibraryName()) 994*333d2b36SAndroid Build Coastguard Worker } 995*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.installPath = j.dexpreopter.getInstallPath( 996*333d2b36SAndroid Build Coastguard Worker ctx, libName, android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar")) 997*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.isSDKLibrary = j.deviceProperties.IsSDKLibrary 998*333d2b36SAndroid Build Coastguard Worker setUncompressDex(ctx, &j.dexpreopter, &j.dexer) 999*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex 1000*333d2b36SAndroid Build Coastguard Worker j.classLoaderContexts = j.usesLibrary.classLoaderContextForUsesLibDeps(ctx) 1001*333d2b36SAndroid Build Coastguard Worker if j.usesLibrary.shouldDisableDexpreopt { 1002*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.disableDexpreopt() 1003*333d2b36SAndroid Build Coastguard Worker } 1004*333d2b36SAndroid Build Coastguard Worker } 1005*333d2b36SAndroid Build Coastguard Worker j.compile(ctx, nil, nil, nil, nil) 1006*333d2b36SAndroid Build Coastguard Worker 1007*333d2b36SAndroid Build Coastguard Worker j.setInstallRules(ctx) 1008*333d2b36SAndroid Build Coastguard Worker 1009*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, android.TestOnlyProviderKey, android.TestModuleInformation{ 1010*333d2b36SAndroid Build Coastguard Worker TestOnly: Bool(j.sourceProperties.Test_only), 1011*333d2b36SAndroid Build Coastguard Worker TopLevelTarget: j.sourceProperties.Top_level_test_target, 1012*333d2b36SAndroid Build Coastguard Worker }) 1013*333d2b36SAndroid Build Coastguard Worker 1014*333d2b36SAndroid Build Coastguard Worker setOutputFiles(ctx, j.Module) 1015*333d2b36SAndroid Build Coastguard Worker} 1016*333d2b36SAndroid Build Coastguard Worker 1017*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) getJarInstallDir(ctx android.ModuleContext) android.InstallPath { 1018*333d2b36SAndroid Build Coastguard Worker var installDir android.InstallPath 1019*333d2b36SAndroid Build Coastguard Worker if ctx.InstallInTestcases() { 1020*333d2b36SAndroid Build Coastguard Worker var archDir string 1021*333d2b36SAndroid Build Coastguard Worker if !ctx.Host() { 1022*333d2b36SAndroid Build Coastguard Worker archDir = ctx.DeviceConfig().DeviceArch() 1023*333d2b36SAndroid Build Coastguard Worker } 1024*333d2b36SAndroid Build Coastguard Worker installModuleName := ctx.ModuleName() 1025*333d2b36SAndroid Build Coastguard Worker // If this module is an impl library created from java_sdk_library, 1026*333d2b36SAndroid Build Coastguard Worker // install the files under the java_sdk_library module outdir instead of this module outdir. 1027*333d2b36SAndroid Build Coastguard Worker if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") { 1028*333d2b36SAndroid Build Coastguard Worker installModuleName = proptools.String(j.SdkLibraryName()) 1029*333d2b36SAndroid Build Coastguard Worker } 1030*333d2b36SAndroid Build Coastguard Worker installDir = android.PathForModuleInstall(ctx, installModuleName, archDir) 1031*333d2b36SAndroid Build Coastguard Worker } else { 1032*333d2b36SAndroid Build Coastguard Worker installDir = android.PathForModuleInstall(ctx, "framework") 1033*333d2b36SAndroid Build Coastguard Worker } 1034*333d2b36SAndroid Build Coastguard Worker return installDir 1035*333d2b36SAndroid Build Coastguard Worker} 1036*333d2b36SAndroid Build Coastguard Worker 1037*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) setInstallRules(ctx android.ModuleContext) { 1038*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 1039*333d2b36SAndroid Build Coastguard Worker 1040*333d2b36SAndroid Build Coastguard Worker if (Bool(j.properties.Installable) || ctx.Host()) && apexInfo.IsForPlatform() { 1041*333d2b36SAndroid Build Coastguard Worker var extraInstallDeps android.InstallPaths 1042*333d2b36SAndroid Build Coastguard Worker if j.InstallMixin != nil { 1043*333d2b36SAndroid Build Coastguard Worker extraInstallDeps = j.InstallMixin(ctx, j.outputFile) 1044*333d2b36SAndroid Build Coastguard Worker } 1045*333d2b36SAndroid Build Coastguard Worker hostDexNeeded := Bool(j.deviceProperties.Hostdex) && !ctx.Host() 1046*333d2b36SAndroid Build Coastguard Worker if hostDexNeeded { 1047*333d2b36SAndroid Build Coastguard Worker j.hostdexInstallFile = ctx.InstallFileWithoutCheckbuild( 1048*333d2b36SAndroid Build Coastguard Worker android.PathForHostDexInstall(ctx, "framework"), 1049*333d2b36SAndroid Build Coastguard Worker j.Stem()+"-hostdex.jar", j.outputFile) 1050*333d2b36SAndroid Build Coastguard Worker } 1051*333d2b36SAndroid Build Coastguard Worker j.installFile = ctx.InstallFileWithoutCheckbuild(j.getJarInstallDir(ctx), j.Stem()+".jar", j.outputFile, extraInstallDeps...) 1052*333d2b36SAndroid Build Coastguard Worker } 1053*333d2b36SAndroid Build Coastguard Worker} 1054*333d2b36SAndroid Build Coastguard Worker 1055*333d2b36SAndroid Build Coastguard Workerfunc (j *Library) DepsMutator(ctx android.BottomUpMutatorContext) { 1056*333d2b36SAndroid Build Coastguard Worker j.usesLibrary.deps(ctx, false) 1057*333d2b36SAndroid Build Coastguard Worker j.deps(ctx) 1058*333d2b36SAndroid Build Coastguard Worker 1059*333d2b36SAndroid Build Coastguard Worker if j.SdkLibraryName() != nil && strings.HasSuffix(j.Name(), ".impl") { 1060*333d2b36SAndroid Build Coastguard Worker if dexpreopt.IsDex2oatNeeded(ctx) { 1061*333d2b36SAndroid Build Coastguard Worker dexpreopt.RegisterToolDeps(ctx) 1062*333d2b36SAndroid Build Coastguard Worker } 1063*333d2b36SAndroid Build Coastguard Worker prebuiltSdkLibExists := ctx.OtherModuleExists(android.PrebuiltNameFromSource(proptools.String(j.SdkLibraryName()))) 1064*333d2b36SAndroid Build Coastguard Worker if prebuiltSdkLibExists && ctx.OtherModuleExists("all_apex_contributions") { 1065*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), android.AcDepTag, "all_apex_contributions") 1066*333d2b36SAndroid Build Coastguard Worker } 1067*333d2b36SAndroid Build Coastguard Worker } 1068*333d2b36SAndroid Build Coastguard Worker} 1069*333d2b36SAndroid Build Coastguard Worker 1070*333d2b36SAndroid Build Coastguard Workerconst ( 1071*333d2b36SAndroid Build Coastguard Worker aidlIncludeDir = "aidl" 1072*333d2b36SAndroid Build Coastguard Worker javaDir = "java" 1073*333d2b36SAndroid Build Coastguard Worker jarFileSuffix = ".jar" 1074*333d2b36SAndroid Build Coastguard Worker testConfigSuffix = "-AndroidTest.xml" 1075*333d2b36SAndroid Build Coastguard Worker) 1076*333d2b36SAndroid Build Coastguard Worker 1077*333d2b36SAndroid Build Coastguard Worker// path to the jar file of a java library. Relative to <sdk_root>/<api_dir> 1078*333d2b36SAndroid Build Coastguard Workerfunc sdkSnapshotFilePathForJar(_ android.SdkMemberContext, osPrefix, name string) string { 1079*333d2b36SAndroid Build Coastguard Worker return sdkSnapshotFilePathForMember(osPrefix, name, jarFileSuffix) 1080*333d2b36SAndroid Build Coastguard Worker} 1081*333d2b36SAndroid Build Coastguard Worker 1082*333d2b36SAndroid Build Coastguard Workerfunc sdkSnapshotFilePathForMember(osPrefix, name string, suffix string) string { 1083*333d2b36SAndroid Build Coastguard Worker return filepath.Join(javaDir, osPrefix, name+suffix) 1084*333d2b36SAndroid Build Coastguard Worker} 1085*333d2b36SAndroid Build Coastguard Worker 1086*333d2b36SAndroid Build Coastguard Workertype librarySdkMemberType struct { 1087*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase 1088*333d2b36SAndroid Build Coastguard Worker 1089*333d2b36SAndroid Build Coastguard Worker // Function to retrieve the appropriate output jar (implementation or header) from 1090*333d2b36SAndroid Build Coastguard Worker // the library. 1091*333d2b36SAndroid Build Coastguard Worker jarToExportGetter func(ctx android.SdkMemberContext, j *Library) android.Path 1092*333d2b36SAndroid Build Coastguard Worker 1093*333d2b36SAndroid Build Coastguard Worker // Function to compute the snapshot relative path to which the named library's 1094*333d2b36SAndroid Build Coastguard Worker // jar should be copied. 1095*333d2b36SAndroid Build Coastguard Worker snapshotPathGetter func(ctx android.SdkMemberContext, osPrefix, name string) string 1096*333d2b36SAndroid Build Coastguard Worker 1097*333d2b36SAndroid Build Coastguard Worker // True if only the jar should be copied to the snapshot, false if the jar plus any additional 1098*333d2b36SAndroid Build Coastguard Worker // files like aidl files should also be copied. 1099*333d2b36SAndroid Build Coastguard Worker onlyCopyJarToSnapshot bool 1100*333d2b36SAndroid Build Coastguard Worker} 1101*333d2b36SAndroid Build Coastguard Worker 1102*333d2b36SAndroid Build Coastguard Workerconst ( 1103*333d2b36SAndroid Build Coastguard Worker onlyCopyJarToSnapshot = true 1104*333d2b36SAndroid Build Coastguard Worker copyEverythingToSnapshot = false 1105*333d2b36SAndroid Build Coastguard Worker) 1106*333d2b36SAndroid Build Coastguard Worker 1107*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) { 1108*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, dependencyTag, names...) 1109*333d2b36SAndroid Build Coastguard Worker} 1110*333d2b36SAndroid Build Coastguard Worker 1111*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) IsInstance(module android.Module) bool { 1112*333d2b36SAndroid Build Coastguard Worker _, ok := module.(*Library) 1113*333d2b36SAndroid Build Coastguard Worker return ok 1114*333d2b36SAndroid Build Coastguard Worker} 1115*333d2b36SAndroid Build Coastguard Worker 1116*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule { 1117*333d2b36SAndroid Build Coastguard Worker return ctx.SnapshotBuilder().AddPrebuiltModule(member, "java_import") 1118*333d2b36SAndroid Build Coastguard Worker} 1119*333d2b36SAndroid Build Coastguard Worker 1120*333d2b36SAndroid Build Coastguard Workerfunc (mt *librarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { 1121*333d2b36SAndroid Build Coastguard Worker return &librarySdkMemberProperties{} 1122*333d2b36SAndroid Build Coastguard Worker} 1123*333d2b36SAndroid Build Coastguard Worker 1124*333d2b36SAndroid Build Coastguard Workertype librarySdkMemberProperties struct { 1125*333d2b36SAndroid Build Coastguard Worker android.SdkMemberPropertiesBase 1126*333d2b36SAndroid Build Coastguard Worker 1127*333d2b36SAndroid Build Coastguard Worker JarToExport android.Path `android:"arch_variant"` 1128*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs android.Paths 1129*333d2b36SAndroid Build Coastguard Worker 1130*333d2b36SAndroid Build Coastguard Worker // The list of permitted packages that need to be passed to the prebuilts as they are used to 1131*333d2b36SAndroid Build Coastguard Worker // create the updatable-bcp-packages.txt file. 1132*333d2b36SAndroid Build Coastguard Worker PermittedPackages []string 1133*333d2b36SAndroid Build Coastguard Worker 1134*333d2b36SAndroid Build Coastguard Worker // The value of the min_sdk_version property, translated into a number where possible. 1135*333d2b36SAndroid Build Coastguard Worker MinSdkVersion *string `supported_build_releases:"Tiramisu+"` 1136*333d2b36SAndroid Build Coastguard Worker 1137*333d2b36SAndroid Build Coastguard Worker DexPreoptProfileGuided *bool `supported_build_releases:"UpsideDownCake+"` 1138*333d2b36SAndroid Build Coastguard Worker} 1139*333d2b36SAndroid Build Coastguard Worker 1140*333d2b36SAndroid Build Coastguard Workerfunc (p *librarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { 1141*333d2b36SAndroid Build Coastguard Worker j := variant.(*Library) 1142*333d2b36SAndroid Build Coastguard Worker 1143*333d2b36SAndroid Build Coastguard Worker p.JarToExport = ctx.MemberType().(*librarySdkMemberType).jarToExportGetter(ctx, j) 1144*333d2b36SAndroid Build Coastguard Worker 1145*333d2b36SAndroid Build Coastguard Worker p.AidlIncludeDirs = j.AidlIncludeDirs() 1146*333d2b36SAndroid Build Coastguard Worker 1147*333d2b36SAndroid Build Coastguard Worker p.PermittedPackages = j.PermittedPackagesForUpdatableBootJars() 1148*333d2b36SAndroid Build Coastguard Worker 1149*333d2b36SAndroid Build Coastguard Worker // If the min_sdk_version was set then add the canonical representation of the API level to the 1150*333d2b36SAndroid Build Coastguard Worker // snapshot. 1151*333d2b36SAndroid Build Coastguard Worker if j.overridableProperties.Min_sdk_version != nil { 1152*333d2b36SAndroid Build Coastguard Worker canonical, err := android.ReplaceFinalizedCodenames(ctx.SdkModuleContext().Config(), j.minSdkVersion.String()) 1153*333d2b36SAndroid Build Coastguard Worker if err != nil { 1154*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("%s", err) 1155*333d2b36SAndroid Build Coastguard Worker } 1156*333d2b36SAndroid Build Coastguard Worker p.MinSdkVersion = proptools.StringPtr(canonical) 1157*333d2b36SAndroid Build Coastguard Worker } 1158*333d2b36SAndroid Build Coastguard Worker 1159*333d2b36SAndroid Build Coastguard Worker if j.dexpreopter.dexpreoptProperties.Dex_preopt_result.Profile_guided { 1160*333d2b36SAndroid Build Coastguard Worker p.DexPreoptProfileGuided = proptools.BoolPtr(true) 1161*333d2b36SAndroid Build Coastguard Worker } 1162*333d2b36SAndroid Build Coastguard Worker} 1163*333d2b36SAndroid Build Coastguard Worker 1164*333d2b36SAndroid Build Coastguard Workerfunc (p *librarySdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) { 1165*333d2b36SAndroid Build Coastguard Worker builder := ctx.SnapshotBuilder() 1166*333d2b36SAndroid Build Coastguard Worker 1167*333d2b36SAndroid Build Coastguard Worker memberType := ctx.MemberType().(*librarySdkMemberType) 1168*333d2b36SAndroid Build Coastguard Worker 1169*333d2b36SAndroid Build Coastguard Worker exportedJar := p.JarToExport 1170*333d2b36SAndroid Build Coastguard Worker if exportedJar != nil { 1171*333d2b36SAndroid Build Coastguard Worker // Delegate the creation of the snapshot relative path to the member type. 1172*333d2b36SAndroid Build Coastguard Worker snapshotRelativeJavaLibPath := memberType.snapshotPathGetter(ctx, p.OsPrefix(), ctx.Name()) 1173*333d2b36SAndroid Build Coastguard Worker 1174*333d2b36SAndroid Build Coastguard Worker // Copy the exported jar to the snapshot. 1175*333d2b36SAndroid Build Coastguard Worker builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) 1176*333d2b36SAndroid Build Coastguard Worker 1177*333d2b36SAndroid Build Coastguard Worker propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) 1178*333d2b36SAndroid Build Coastguard Worker } 1179*333d2b36SAndroid Build Coastguard Worker 1180*333d2b36SAndroid Build Coastguard Worker if p.MinSdkVersion != nil { 1181*333d2b36SAndroid Build Coastguard Worker propertySet.AddProperty("min_sdk_version", *p.MinSdkVersion) 1182*333d2b36SAndroid Build Coastguard Worker } 1183*333d2b36SAndroid Build Coastguard Worker 1184*333d2b36SAndroid Build Coastguard Worker if len(p.PermittedPackages) > 0 { 1185*333d2b36SAndroid Build Coastguard Worker propertySet.AddProperty("permitted_packages", p.PermittedPackages) 1186*333d2b36SAndroid Build Coastguard Worker } 1187*333d2b36SAndroid Build Coastguard Worker 1188*333d2b36SAndroid Build Coastguard Worker dexPreoptSet := propertySet.AddPropertySet("dex_preopt") 1189*333d2b36SAndroid Build Coastguard Worker if p.DexPreoptProfileGuided != nil { 1190*333d2b36SAndroid Build Coastguard Worker dexPreoptSet.AddProperty("profile_guided", proptools.Bool(p.DexPreoptProfileGuided)) 1191*333d2b36SAndroid Build Coastguard Worker } 1192*333d2b36SAndroid Build Coastguard Worker 1193*333d2b36SAndroid Build Coastguard Worker // Do not copy anything else to the snapshot. 1194*333d2b36SAndroid Build Coastguard Worker if memberType.onlyCopyJarToSnapshot { 1195*333d2b36SAndroid Build Coastguard Worker return 1196*333d2b36SAndroid Build Coastguard Worker } 1197*333d2b36SAndroid Build Coastguard Worker 1198*333d2b36SAndroid Build Coastguard Worker aidlIncludeDirs := p.AidlIncludeDirs 1199*333d2b36SAndroid Build Coastguard Worker if len(aidlIncludeDirs) != 0 { 1200*333d2b36SAndroid Build Coastguard Worker sdkModuleContext := ctx.SdkModuleContext() 1201*333d2b36SAndroid Build Coastguard Worker for _, dir := range aidlIncludeDirs { 1202*333d2b36SAndroid Build Coastguard Worker // TODO(jiyong): copy parcelable declarations only 1203*333d2b36SAndroid Build Coastguard Worker aidlFiles, _ := sdkModuleContext.GlobWithDeps(dir.String()+"/**/*.aidl", nil) 1204*333d2b36SAndroid Build Coastguard Worker for _, file := range aidlFiles { 1205*333d2b36SAndroid Build Coastguard Worker builder.CopyToSnapshot(android.PathForSource(sdkModuleContext, file), filepath.Join(aidlIncludeDir, file)) 1206*333d2b36SAndroid Build Coastguard Worker } 1207*333d2b36SAndroid Build Coastguard Worker } 1208*333d2b36SAndroid Build Coastguard Worker 1209*333d2b36SAndroid Build Coastguard Worker // TODO(b/151933053) - add aidl include dirs property 1210*333d2b36SAndroid Build Coastguard Worker } 1211*333d2b36SAndroid Build Coastguard Worker} 1212*333d2b36SAndroid Build Coastguard Worker 1213*333d2b36SAndroid Build Coastguard Worker// java_library builds and links sources into a `.jar` file for the device, and possibly for the host as well. 1214*333d2b36SAndroid Build Coastguard Worker// 1215*333d2b36SAndroid Build Coastguard Worker// By default, a java_library has a single variant that produces a `.jar` file containing `.class` files that were 1216*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath. This jar is not suitable for installing on a device, but can be used 1217*333d2b36SAndroid Build Coastguard Worker// as a `static_libs` dependency of another module. 1218*333d2b36SAndroid Build Coastguard Worker// 1219*333d2b36SAndroid Build Coastguard Worker// Specifying `installable: true` will product a `.jar` file containing `classes.dex` files, suitable for installing on 1220*333d2b36SAndroid Build Coastguard Worker// a device. 1221*333d2b36SAndroid Build Coastguard Worker// 1222*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one 1223*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1224*333d2b36SAndroid Build Coastguard Workerfunc LibraryFactory() android.Module { 1225*333d2b36SAndroid Build Coastguard Worker module := &Library{} 1226*333d2b36SAndroid Build Coastguard Worker 1227*333d2b36SAndroid Build Coastguard Worker module.addHostAndDeviceProperties() 1228*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.sourceProperties) 1229*333d2b36SAndroid Build Coastguard Worker 1230*333d2b36SAndroid Build Coastguard Worker module.initModuleAndImport(module) 1231*333d2b36SAndroid Build Coastguard Worker 1232*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 1233*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostAndDeviceSupported) 1234*333d2b36SAndroid Build Coastguard Worker return module 1235*333d2b36SAndroid Build Coastguard Worker} 1236*333d2b36SAndroid Build Coastguard Worker 1237*333d2b36SAndroid Build Coastguard Worker// java_library_static is an obsolete alias for java_library. 1238*333d2b36SAndroid Build Coastguard Workerfunc LibraryStaticFactory() android.Module { 1239*333d2b36SAndroid Build Coastguard Worker return LibraryFactory() 1240*333d2b36SAndroid Build Coastguard Worker} 1241*333d2b36SAndroid Build Coastguard Worker 1242*333d2b36SAndroid Build Coastguard Worker// java_library_host builds and links sources into a `.jar` file for the host. 1243*333d2b36SAndroid Build Coastguard Worker// 1244*333d2b36SAndroid Build Coastguard Worker// A java_library_host has a single variant that produces a `.jar` file containing `.class` files that were 1245*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1246*333d2b36SAndroid Build Coastguard Workerfunc LibraryHostFactory() android.Module { 1247*333d2b36SAndroid Build Coastguard Worker module := &Library{} 1248*333d2b36SAndroid Build Coastguard Worker 1249*333d2b36SAndroid Build Coastguard Worker module.addHostProperties() 1250*333d2b36SAndroid Build Coastguard Worker 1251*333d2b36SAndroid Build Coastguard Worker module.Module.properties.Installable = proptools.BoolPtr(true) 1252*333d2b36SAndroid Build Coastguard Worker 1253*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 1254*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostSupported) 1255*333d2b36SAndroid Build Coastguard Worker return module 1256*333d2b36SAndroid Build Coastguard Worker} 1257*333d2b36SAndroid Build Coastguard Worker 1258*333d2b36SAndroid Build Coastguard Worker// 1259*333d2b36SAndroid Build Coastguard Worker// Java Tests 1260*333d2b36SAndroid Build Coastguard Worker// 1261*333d2b36SAndroid Build Coastguard Worker 1262*333d2b36SAndroid Build Coastguard Worker// Test option struct. 1263*333d2b36SAndroid Build Coastguard Workertype TestOptions struct { 1264*333d2b36SAndroid Build Coastguard Worker android.CommonTestOptions 1265*333d2b36SAndroid Build Coastguard Worker 1266*333d2b36SAndroid Build Coastguard Worker // a list of extra test configuration files that should be installed with the module. 1267*333d2b36SAndroid Build Coastguard Worker Extra_test_configs []string `android:"path,arch_variant"` 1268*333d2b36SAndroid Build Coastguard Worker 1269*333d2b36SAndroid Build Coastguard Worker // Extra <option> tags to add to the auto generated test xml file. The "key" 1270*333d2b36SAndroid Build Coastguard Worker // is optional in each of these. 1271*333d2b36SAndroid Build Coastguard Worker Tradefed_options []tradefed.Option 1272*333d2b36SAndroid Build Coastguard Worker 1273*333d2b36SAndroid Build Coastguard Worker // Extra <option> tags to add to the auto generated test xml file under the test runner, e.g., AndroidJunitTest. 1274*333d2b36SAndroid Build Coastguard Worker // The "key" is optional in each of these. 1275*333d2b36SAndroid Build Coastguard Worker Test_runner_options []tradefed.Option 1276*333d2b36SAndroid Build Coastguard Worker} 1277*333d2b36SAndroid Build Coastguard Worker 1278*333d2b36SAndroid Build Coastguard Workertype testProperties struct { 1279*333d2b36SAndroid Build Coastguard Worker // list of compatibility suites (for example "cts", "vts") that the module should be 1280*333d2b36SAndroid Build Coastguard Worker // installed into. 1281*333d2b36SAndroid Build Coastguard Worker Test_suites []string `android:"arch_variant"` 1282*333d2b36SAndroid Build Coastguard Worker 1283*333d2b36SAndroid Build Coastguard Worker // the name of the test configuration (for example "AndroidTest.xml") that should be 1284*333d2b36SAndroid Build Coastguard Worker // installed with the module. 1285*333d2b36SAndroid Build Coastguard Worker Test_config *string `android:"path,arch_variant"` 1286*333d2b36SAndroid Build Coastguard Worker 1287*333d2b36SAndroid Build Coastguard Worker // the name of the test configuration template (for example "AndroidTestTemplate.xml") that 1288*333d2b36SAndroid Build Coastguard Worker // should be installed with the module. 1289*333d2b36SAndroid Build Coastguard Worker Test_config_template *string `android:"path,arch_variant"` 1290*333d2b36SAndroid Build Coastguard Worker 1291*333d2b36SAndroid Build Coastguard Worker // list of files or filegroup modules that provide data that should be installed alongside 1292*333d2b36SAndroid Build Coastguard Worker // the test 1293*333d2b36SAndroid Build Coastguard Worker Data []string `android:"path"` 1294*333d2b36SAndroid Build Coastguard Worker 1295*333d2b36SAndroid Build Coastguard Worker // Same as data, but will add dependencies on modules using the device's os variation and 1296*333d2b36SAndroid Build Coastguard Worker // the common arch variation. Useful for a host test that wants to embed a module built for 1297*333d2b36SAndroid Build Coastguard Worker // device. 1298*333d2b36SAndroid Build Coastguard Worker Device_common_data []string `android:"path_device_common"` 1299*333d2b36SAndroid Build Coastguard Worker 1300*333d2b36SAndroid Build Coastguard Worker // same as data, but adds dependencies using the device's os variation and the device's first 1301*333d2b36SAndroid Build Coastguard Worker // architecture's variation. Can be used to add a module built for device to the data of a 1302*333d2b36SAndroid Build Coastguard Worker // host test. 1303*333d2b36SAndroid Build Coastguard Worker Device_first_data []string `android:"path_device_first"` 1304*333d2b36SAndroid Build Coastguard Worker 1305*333d2b36SAndroid Build Coastguard Worker // same as data, but adds dependencies using the device's os variation and the device's first 1306*333d2b36SAndroid Build Coastguard Worker // 32-bit architecture's variation. If a 32-bit arch doesn't exist for this device, it will use 1307*333d2b36SAndroid Build Coastguard Worker // a 64 bit arch instead. Can be used to add a module built for device to the data of a 1308*333d2b36SAndroid Build Coastguard Worker // host test. 1309*333d2b36SAndroid Build Coastguard Worker Device_first_prefer32_data []string `android:"path_device_first_prefer32"` 1310*333d2b36SAndroid Build Coastguard Worker 1311*333d2b36SAndroid Build Coastguard Worker // Flag to indicate whether or not to create test config automatically. If AndroidTest.xml 1312*333d2b36SAndroid Build Coastguard Worker // doesn't exist next to the Android.bp, this attribute doesn't need to be set to true 1313*333d2b36SAndroid Build Coastguard Worker // explicitly. 1314*333d2b36SAndroid Build Coastguard Worker Auto_gen_config *bool 1315*333d2b36SAndroid Build Coastguard Worker 1316*333d2b36SAndroid Build Coastguard Worker // Add parameterized mainline modules to auto generated test config. The options will be 1317*333d2b36SAndroid Build Coastguard Worker // handled by TradeFed to do downloading and installing the specified modules on the device. 1318*333d2b36SAndroid Build Coastguard Worker Test_mainline_modules []string 1319*333d2b36SAndroid Build Coastguard Worker 1320*333d2b36SAndroid Build Coastguard Worker // Test options. 1321*333d2b36SAndroid Build Coastguard Worker Test_options TestOptions 1322*333d2b36SAndroid Build Coastguard Worker 1323*333d2b36SAndroid Build Coastguard Worker // Names of modules containing JNI libraries that should be installed alongside the test. 1324*333d2b36SAndroid Build Coastguard Worker Jni_libs proptools.Configurable[[]string] 1325*333d2b36SAndroid Build Coastguard Worker 1326*333d2b36SAndroid Build Coastguard Worker // Install the test into a folder named for the module in all test suites. 1327*333d2b36SAndroid Build Coastguard Worker Per_testcase_directory *bool 1328*333d2b36SAndroid Build Coastguard Worker} 1329*333d2b36SAndroid Build Coastguard Worker 1330*333d2b36SAndroid Build Coastguard Workertype hostTestProperties struct { 1331*333d2b36SAndroid Build Coastguard Worker // list of native binary modules that should be installed alongside the test 1332*333d2b36SAndroid Build Coastguard Worker Data_native_bins []string `android:"arch_variant"` 1333*333d2b36SAndroid Build Coastguard Worker 1334*333d2b36SAndroid Build Coastguard Worker // list of device binary modules that should be installed alongside the test 1335*333d2b36SAndroid Build Coastguard Worker // This property only adds the first variant of the dependency 1336*333d2b36SAndroid Build Coastguard Worker Data_device_bins_first []string `android:"arch_variant"` 1337*333d2b36SAndroid Build Coastguard Worker 1338*333d2b36SAndroid Build Coastguard Worker // list of device binary modules that should be installed alongside the test 1339*333d2b36SAndroid Build Coastguard Worker // This property adds 64bit AND 32bit variants of the dependency 1340*333d2b36SAndroid Build Coastguard Worker Data_device_bins_both []string `android:"arch_variant"` 1341*333d2b36SAndroid Build Coastguard Worker 1342*333d2b36SAndroid Build Coastguard Worker // list of device binary modules that should be installed alongside the test 1343*333d2b36SAndroid Build Coastguard Worker // This property only adds 64bit variants of the dependency 1344*333d2b36SAndroid Build Coastguard Worker Data_device_bins_64 []string `android:"arch_variant"` 1345*333d2b36SAndroid Build Coastguard Worker 1346*333d2b36SAndroid Build Coastguard Worker // list of device binary modules that should be installed alongside the test 1347*333d2b36SAndroid Build Coastguard Worker // This property adds 32bit variants of the dependency if available, or else 1348*333d2b36SAndroid Build Coastguard Worker // defaults to the 64bit variant 1349*333d2b36SAndroid Build Coastguard Worker Data_device_bins_prefer32 []string `android:"arch_variant"` 1350*333d2b36SAndroid Build Coastguard Worker 1351*333d2b36SAndroid Build Coastguard Worker // list of device binary modules that should be installed alongside the test 1352*333d2b36SAndroid Build Coastguard Worker // This property only adds 32bit variants of the dependency 1353*333d2b36SAndroid Build Coastguard Worker Data_device_bins_32 []string `android:"arch_variant"` 1354*333d2b36SAndroid Build Coastguard Worker} 1355*333d2b36SAndroid Build Coastguard Worker 1356*333d2b36SAndroid Build Coastguard Workertype testHelperLibraryProperties struct { 1357*333d2b36SAndroid Build Coastguard Worker // list of compatibility suites (for example "cts", "vts") that the module should be 1358*333d2b36SAndroid Build Coastguard Worker // installed into. 1359*333d2b36SAndroid Build Coastguard Worker Test_suites []string `android:"arch_variant"` 1360*333d2b36SAndroid Build Coastguard Worker 1361*333d2b36SAndroid Build Coastguard Worker // Install the test into a folder named for the module in all test suites. 1362*333d2b36SAndroid Build Coastguard Worker Per_testcase_directory *bool 1363*333d2b36SAndroid Build Coastguard Worker} 1364*333d2b36SAndroid Build Coastguard Worker 1365*333d2b36SAndroid Build Coastguard Workertype prebuiltTestProperties struct { 1366*333d2b36SAndroid Build Coastguard Worker // list of compatibility suites (for example "cts", "vts") that the module should be 1367*333d2b36SAndroid Build Coastguard Worker // installed into. 1368*333d2b36SAndroid Build Coastguard Worker Test_suites []string `android:"arch_variant"` 1369*333d2b36SAndroid Build Coastguard Worker 1370*333d2b36SAndroid Build Coastguard Worker // the name of the test configuration (for example "AndroidTest.xml") that should be 1371*333d2b36SAndroid Build Coastguard Worker // installed with the module. 1372*333d2b36SAndroid Build Coastguard Worker Test_config *string `android:"path,arch_variant"` 1373*333d2b36SAndroid Build Coastguard Worker} 1374*333d2b36SAndroid Build Coastguard Worker 1375*333d2b36SAndroid Build Coastguard Workertype Test struct { 1376*333d2b36SAndroid Build Coastguard Worker Library 1377*333d2b36SAndroid Build Coastguard Worker 1378*333d2b36SAndroid Build Coastguard Worker testProperties testProperties 1379*333d2b36SAndroid Build Coastguard Worker 1380*333d2b36SAndroid Build Coastguard Worker testConfig android.Path 1381*333d2b36SAndroid Build Coastguard Worker extraTestConfigs android.Paths 1382*333d2b36SAndroid Build Coastguard Worker data android.Paths 1383*333d2b36SAndroid Build Coastguard Worker} 1384*333d2b36SAndroid Build Coastguard Worker 1385*333d2b36SAndroid Build Coastguard Workertype TestHost struct { 1386*333d2b36SAndroid Build Coastguard Worker Test 1387*333d2b36SAndroid Build Coastguard Worker 1388*333d2b36SAndroid Build Coastguard Worker testHostProperties hostTestProperties 1389*333d2b36SAndroid Build Coastguard Worker} 1390*333d2b36SAndroid Build Coastguard Worker 1391*333d2b36SAndroid Build Coastguard Workertype TestHelperLibrary struct { 1392*333d2b36SAndroid Build Coastguard Worker Library 1393*333d2b36SAndroid Build Coastguard Worker 1394*333d2b36SAndroid Build Coastguard Worker testHelperLibraryProperties testHelperLibraryProperties 1395*333d2b36SAndroid Build Coastguard Worker} 1396*333d2b36SAndroid Build Coastguard Worker 1397*333d2b36SAndroid Build Coastguard Workertype JavaTestImport struct { 1398*333d2b36SAndroid Build Coastguard Worker Import 1399*333d2b36SAndroid Build Coastguard Worker 1400*333d2b36SAndroid Build Coastguard Worker prebuiltTestProperties prebuiltTestProperties 1401*333d2b36SAndroid Build Coastguard Worker 1402*333d2b36SAndroid Build Coastguard Worker testConfig android.Path 1403*333d2b36SAndroid Build Coastguard Worker dexJarFile android.Path 1404*333d2b36SAndroid Build Coastguard Worker} 1405*333d2b36SAndroid Build Coastguard Worker 1406*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) InstallInTestcases() bool { 1407*333d2b36SAndroid Build Coastguard Worker // Host java tests install into $(HOST_OUT_JAVA_LIBRARIES), and then are copied into 1408*333d2b36SAndroid Build Coastguard Worker // testcases by base_rules.mk. 1409*333d2b36SAndroid Build Coastguard Worker return !j.Host() 1410*333d2b36SAndroid Build Coastguard Worker} 1411*333d2b36SAndroid Build Coastguard Worker 1412*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHelperLibrary) InstallInTestcases() bool { 1413*333d2b36SAndroid Build Coastguard Worker return true 1414*333d2b36SAndroid Build Coastguard Worker} 1415*333d2b36SAndroid Build Coastguard Worker 1416*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaTestImport) InstallInTestcases() bool { 1417*333d2b36SAndroid Build Coastguard Worker return true 1418*333d2b36SAndroid Build Coastguard Worker} 1419*333d2b36SAndroid Build Coastguard Worker 1420*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) IsNativeCoverageNeeded(ctx cc.IsNativeCoverageNeededContext) bool { 1421*333d2b36SAndroid Build Coastguard Worker return ctx.DeviceConfig().NativeCoverageEnabled() 1422*333d2b36SAndroid Build Coastguard Worker} 1423*333d2b36SAndroid Build Coastguard Worker 1424*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) addDataDeviceBinsDeps(ctx android.BottomUpMutatorContext) { 1425*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_device_bins_first) > 0 { 1426*333d2b36SAndroid Build Coastguard Worker deviceVariations := ctx.Config().AndroidFirstDeviceTarget.Variations() 1427*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_first...) 1428*333d2b36SAndroid Build Coastguard Worker } 1429*333d2b36SAndroid Build Coastguard Worker 1430*333d2b36SAndroid Build Coastguard Worker var maybeAndroid32Target *android.Target 1431*333d2b36SAndroid Build Coastguard Worker var maybeAndroid64Target *android.Target 1432*333d2b36SAndroid Build Coastguard Worker android32TargetList := android.FirstTarget(ctx.Config().Targets[android.Android], "lib32") 1433*333d2b36SAndroid Build Coastguard Worker android64TargetList := android.FirstTarget(ctx.Config().Targets[android.Android], "lib64") 1434*333d2b36SAndroid Build Coastguard Worker if len(android32TargetList) > 0 { 1435*333d2b36SAndroid Build Coastguard Worker maybeAndroid32Target = &android32TargetList[0] 1436*333d2b36SAndroid Build Coastguard Worker } 1437*333d2b36SAndroid Build Coastguard Worker if len(android64TargetList) > 0 { 1438*333d2b36SAndroid Build Coastguard Worker maybeAndroid64Target = &android64TargetList[0] 1439*333d2b36SAndroid Build Coastguard Worker } 1440*333d2b36SAndroid Build Coastguard Worker 1441*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_device_bins_both) > 0 { 1442*333d2b36SAndroid Build Coastguard Worker if maybeAndroid32Target == nil && maybeAndroid64Target == nil { 1443*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("data_device_bins_both", "no device targets available. Targets: %q", ctx.Config().Targets) 1444*333d2b36SAndroid Build Coastguard Worker return 1445*333d2b36SAndroid Build Coastguard Worker } 1446*333d2b36SAndroid Build Coastguard Worker if maybeAndroid32Target != nil { 1447*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies( 1448*333d2b36SAndroid Build Coastguard Worker maybeAndroid32Target.Variations(), 1449*333d2b36SAndroid Build Coastguard Worker dataDeviceBinsTag, 1450*333d2b36SAndroid Build Coastguard Worker j.testHostProperties.Data_device_bins_both..., 1451*333d2b36SAndroid Build Coastguard Worker ) 1452*333d2b36SAndroid Build Coastguard Worker } 1453*333d2b36SAndroid Build Coastguard Worker if maybeAndroid64Target != nil { 1454*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies( 1455*333d2b36SAndroid Build Coastguard Worker maybeAndroid64Target.Variations(), 1456*333d2b36SAndroid Build Coastguard Worker dataDeviceBinsTag, 1457*333d2b36SAndroid Build Coastguard Worker j.testHostProperties.Data_device_bins_both..., 1458*333d2b36SAndroid Build Coastguard Worker ) 1459*333d2b36SAndroid Build Coastguard Worker } 1460*333d2b36SAndroid Build Coastguard Worker } 1461*333d2b36SAndroid Build Coastguard Worker 1462*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_device_bins_prefer32) > 0 { 1463*333d2b36SAndroid Build Coastguard Worker if maybeAndroid32Target != nil { 1464*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies( 1465*333d2b36SAndroid Build Coastguard Worker maybeAndroid32Target.Variations(), 1466*333d2b36SAndroid Build Coastguard Worker dataDeviceBinsTag, 1467*333d2b36SAndroid Build Coastguard Worker j.testHostProperties.Data_device_bins_prefer32..., 1468*333d2b36SAndroid Build Coastguard Worker ) 1469*333d2b36SAndroid Build Coastguard Worker } else { 1470*333d2b36SAndroid Build Coastguard Worker if maybeAndroid64Target == nil { 1471*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("data_device_bins_prefer32", "no device targets available. Targets: %q", ctx.Config().Targets) 1472*333d2b36SAndroid Build Coastguard Worker return 1473*333d2b36SAndroid Build Coastguard Worker } 1474*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies( 1475*333d2b36SAndroid Build Coastguard Worker maybeAndroid64Target.Variations(), 1476*333d2b36SAndroid Build Coastguard Worker dataDeviceBinsTag, 1477*333d2b36SAndroid Build Coastguard Worker j.testHostProperties.Data_device_bins_prefer32..., 1478*333d2b36SAndroid Build Coastguard Worker ) 1479*333d2b36SAndroid Build Coastguard Worker } 1480*333d2b36SAndroid Build Coastguard Worker } 1481*333d2b36SAndroid Build Coastguard Worker 1482*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_device_bins_32) > 0 { 1483*333d2b36SAndroid Build Coastguard Worker if maybeAndroid32Target == nil { 1484*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("data_device_bins_32", "cannot find 32bit device target. Targets: %q", ctx.Config().Targets) 1485*333d2b36SAndroid Build Coastguard Worker return 1486*333d2b36SAndroid Build Coastguard Worker } 1487*333d2b36SAndroid Build Coastguard Worker deviceVariations := maybeAndroid32Target.Variations() 1488*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_32...) 1489*333d2b36SAndroid Build Coastguard Worker } 1490*333d2b36SAndroid Build Coastguard Worker 1491*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_device_bins_64) > 0 { 1492*333d2b36SAndroid Build Coastguard Worker if maybeAndroid64Target == nil { 1493*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("data_device_bins_64", "cannot find 64bit device target. Targets: %q", ctx.Config().Targets) 1494*333d2b36SAndroid Build Coastguard Worker return 1495*333d2b36SAndroid Build Coastguard Worker } 1496*333d2b36SAndroid Build Coastguard Worker deviceVariations := maybeAndroid64Target.Variations() 1497*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins_64...) 1498*333d2b36SAndroid Build Coastguard Worker } 1499*333d2b36SAndroid Build Coastguard Worker} 1500*333d2b36SAndroid Build Coastguard Worker 1501*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) DepsMutator(ctx android.BottomUpMutatorContext) { 1502*333d2b36SAndroid Build Coastguard Worker if len(j.testHostProperties.Data_native_bins) > 0 { 1503*333d2b36SAndroid Build Coastguard Worker for _, target := range ctx.MultiTargets() { 1504*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(target.Variations(), dataNativeBinsTag, j.testHostProperties.Data_native_bins...) 1505*333d2b36SAndroid Build Coastguard Worker } 1506*333d2b36SAndroid Build Coastguard Worker } 1507*333d2b36SAndroid Build Coastguard Worker 1508*333d2b36SAndroid Build Coastguard Worker jniLibs := j.testProperties.Jni_libs.GetOrDefault(ctx, nil) 1509*333d2b36SAndroid Build Coastguard Worker if len(jniLibs) > 0 { 1510*333d2b36SAndroid Build Coastguard Worker for _, target := range ctx.MultiTargets() { 1511*333d2b36SAndroid Build Coastguard Worker sharedLibVariations := append(target.Variations(), blueprint.Variation{Mutator: "link", Variation: "shared"}) 1512*333d2b36SAndroid Build Coastguard Worker ctx.AddFarVariationDependencies(sharedLibVariations, jniLibTag, jniLibs...) 1513*333d2b36SAndroid Build Coastguard Worker } 1514*333d2b36SAndroid Build Coastguard Worker } 1515*333d2b36SAndroid Build Coastguard Worker 1516*333d2b36SAndroid Build Coastguard Worker j.addDataDeviceBinsDeps(ctx) 1517*333d2b36SAndroid Build Coastguard Worker j.deps(ctx) 1518*333d2b36SAndroid Build Coastguard Worker} 1519*333d2b36SAndroid Build Coastguard Worker 1520*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) AddExtraResource(p android.Path) { 1521*333d2b36SAndroid Build Coastguard Worker j.extraResources = append(j.extraResources, p) 1522*333d2b36SAndroid Build Coastguard Worker} 1523*333d2b36SAndroid Build Coastguard Worker 1524*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) dataDeviceBins() []string { 1525*333d2b36SAndroid Build Coastguard Worker ret := make([]string, 0, 1526*333d2b36SAndroid Build Coastguard Worker len(j.testHostProperties.Data_device_bins_first)+ 1527*333d2b36SAndroid Build Coastguard Worker len(j.testHostProperties.Data_device_bins_both)+ 1528*333d2b36SAndroid Build Coastguard Worker len(j.testHostProperties.Data_device_bins_prefer32)+ 1529*333d2b36SAndroid Build Coastguard Worker len(j.testHostProperties.Data_device_bins_32)+ 1530*333d2b36SAndroid Build Coastguard Worker len(j.testHostProperties.Data_device_bins_64), 1531*333d2b36SAndroid Build Coastguard Worker ) 1532*333d2b36SAndroid Build Coastguard Worker 1533*333d2b36SAndroid Build Coastguard Worker ret = append(ret, j.testHostProperties.Data_device_bins_first...) 1534*333d2b36SAndroid Build Coastguard Worker ret = append(ret, j.testHostProperties.Data_device_bins_both...) 1535*333d2b36SAndroid Build Coastguard Worker ret = append(ret, j.testHostProperties.Data_device_bins_prefer32...) 1536*333d2b36SAndroid Build Coastguard Worker ret = append(ret, j.testHostProperties.Data_device_bins_32...) 1537*333d2b36SAndroid Build Coastguard Worker ret = append(ret, j.testHostProperties.Data_device_bins_64...) 1538*333d2b36SAndroid Build Coastguard Worker 1539*333d2b36SAndroid Build Coastguard Worker return ret 1540*333d2b36SAndroid Build Coastguard Worker} 1541*333d2b36SAndroid Build Coastguard Worker 1542*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHost) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1543*333d2b36SAndroid Build Coastguard Worker var configs []tradefed.Config 1544*333d2b36SAndroid Build Coastguard Worker dataDeviceBins := j.dataDeviceBins() 1545*333d2b36SAndroid Build Coastguard Worker if len(dataDeviceBins) > 0 { 1546*333d2b36SAndroid Build Coastguard Worker // add Tradefed configuration to push device bins to device for testing 1547*333d2b36SAndroid Build Coastguard Worker remoteDir := filepath.Join("/data/local/tests/unrestricted/", j.Name()) 1548*333d2b36SAndroid Build Coastguard Worker options := []tradefed.Option{{Name: "cleanup", Value: "true"}} 1549*333d2b36SAndroid Build Coastguard Worker for _, bin := range dataDeviceBins { 1550*333d2b36SAndroid Build Coastguard Worker fullPath := filepath.Join(remoteDir, bin) 1551*333d2b36SAndroid Build Coastguard Worker options = append(options, tradefed.Option{Name: "push-file", Key: bin, Value: fullPath}) 1552*333d2b36SAndroid Build Coastguard Worker } 1553*333d2b36SAndroid Build Coastguard Worker configs = append(configs, tradefed.Object{ 1554*333d2b36SAndroid Build Coastguard Worker Type: "target_preparer", 1555*333d2b36SAndroid Build Coastguard Worker Class: "com.android.tradefed.targetprep.PushFilePreparer", 1556*333d2b36SAndroid Build Coastguard Worker Options: options, 1557*333d2b36SAndroid Build Coastguard Worker }) 1558*333d2b36SAndroid Build Coastguard Worker } 1559*333d2b36SAndroid Build Coastguard Worker 1560*333d2b36SAndroid Build Coastguard Worker j.Test.generateAndroidBuildActionsWithConfig(ctx, configs) 1561*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, tradefed.BaseTestProviderKey, tradefed.BaseTestProviderData{ 1562*333d2b36SAndroid Build Coastguard Worker TestcaseRelDataFiles: testcaseRel(j.data), 1563*333d2b36SAndroid Build Coastguard Worker OutputFile: j.outputFile, 1564*333d2b36SAndroid Build Coastguard Worker TestConfig: j.testConfig, 1565*333d2b36SAndroid Build Coastguard Worker RequiredModuleNames: j.RequiredModuleNames(ctx), 1566*333d2b36SAndroid Build Coastguard Worker TestSuites: j.testProperties.Test_suites, 1567*333d2b36SAndroid Build Coastguard Worker IsHost: true, 1568*333d2b36SAndroid Build Coastguard Worker LocalSdkVersion: j.sdkVersion.String(), 1569*333d2b36SAndroid Build Coastguard Worker IsUnitTest: Bool(j.testProperties.Test_options.Unit_test), 1570*333d2b36SAndroid Build Coastguard Worker MkInclude: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", 1571*333d2b36SAndroid Build Coastguard Worker MkAppClass: "JAVA_LIBRARIES", 1572*333d2b36SAndroid Build Coastguard Worker }) 1573*333d2b36SAndroid Build Coastguard Worker} 1574*333d2b36SAndroid Build Coastguard Worker 1575*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1576*333d2b36SAndroid Build Coastguard Worker checkMinSdkVersionMts(ctx, j.MinSdkVersion(ctx)) 1577*333d2b36SAndroid Build Coastguard Worker j.generateAndroidBuildActionsWithConfig(ctx, nil) 1578*333d2b36SAndroid Build Coastguard Worker} 1579*333d2b36SAndroid Build Coastguard Worker 1580*333d2b36SAndroid Build Coastguard Workerfunc (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext, configs []tradefed.Config) { 1581*333d2b36SAndroid Build Coastguard Worker if j.testProperties.Test_options.Unit_test == nil && ctx.Host() { 1582*333d2b36SAndroid Build Coastguard Worker // TODO(b/): Clean temporary heuristic to avoid unexpected onboarding. 1583*333d2b36SAndroid Build Coastguard Worker defaultUnitTest := !inList("tradefed", j.properties.Libs) && !inList("cts", j.testProperties.Test_suites) 1584*333d2b36SAndroid Build Coastguard Worker j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest) 1585*333d2b36SAndroid Build Coastguard Worker } 1586*333d2b36SAndroid Build Coastguard Worker j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{ 1587*333d2b36SAndroid Build Coastguard Worker TestConfigProp: j.testProperties.Test_config, 1588*333d2b36SAndroid Build Coastguard Worker TestConfigTemplateProp: j.testProperties.Test_config_template, 1589*333d2b36SAndroid Build Coastguard Worker TestSuites: j.testProperties.Test_suites, 1590*333d2b36SAndroid Build Coastguard Worker Config: configs, 1591*333d2b36SAndroid Build Coastguard Worker OptionsForAutogenerated: j.testProperties.Test_options.Tradefed_options, 1592*333d2b36SAndroid Build Coastguard Worker TestRunnerOptions: j.testProperties.Test_options.Test_runner_options, 1593*333d2b36SAndroid Build Coastguard Worker AutoGenConfig: j.testProperties.Auto_gen_config, 1594*333d2b36SAndroid Build Coastguard Worker UnitTest: j.testProperties.Test_options.Unit_test, 1595*333d2b36SAndroid Build Coastguard Worker DeviceTemplate: "${JavaTestConfigTemplate}", 1596*333d2b36SAndroid Build Coastguard Worker HostTemplate: "${JavaHostTestConfigTemplate}", 1597*333d2b36SAndroid Build Coastguard Worker HostUnitTestTemplate: "${JavaHostUnitTestConfigTemplate}", 1598*333d2b36SAndroid Build Coastguard Worker }) 1599*333d2b36SAndroid Build Coastguard Worker 1600*333d2b36SAndroid Build Coastguard Worker j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data) 1601*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_common_data)...) 1602*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_first_data)...) 1603*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, android.PathsForModuleSrc(ctx, j.testProperties.Device_first_prefer32_data)...) 1604*333d2b36SAndroid Build Coastguard Worker 1605*333d2b36SAndroid Build Coastguard Worker j.extraTestConfigs = android.PathsForModuleSrc(ctx, j.testProperties.Test_options.Extra_test_configs) 1606*333d2b36SAndroid Build Coastguard Worker 1607*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(dataNativeBinsTag, func(dep android.Module) { 1608*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, android.OutputFileForModule(ctx, dep, "")) 1609*333d2b36SAndroid Build Coastguard Worker }) 1610*333d2b36SAndroid Build Coastguard Worker 1611*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(dataDeviceBinsTag, func(dep android.Module) { 1612*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, android.OutputFileForModule(ctx, dep, "")) 1613*333d2b36SAndroid Build Coastguard Worker }) 1614*333d2b36SAndroid Build Coastguard Worker 1615*333d2b36SAndroid Build Coastguard Worker var directImplementationDeps android.Paths 1616*333d2b36SAndroid Build Coastguard Worker var transitiveImplementationDeps []depset.DepSet[android.Path] 1617*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(jniLibTag, func(dep android.Module) { 1618*333d2b36SAndroid Build Coastguard Worker sharedLibInfo, _ := android.OtherModuleProvider(ctx, dep, cc.SharedLibraryInfoProvider) 1619*333d2b36SAndroid Build Coastguard Worker if sharedLibInfo.SharedLibrary != nil { 1620*333d2b36SAndroid Build Coastguard Worker // Copy to an intermediate output directory to append "lib[64]" to the path, 1621*333d2b36SAndroid Build Coastguard Worker // so that it's compatible with the default rpath values. 1622*333d2b36SAndroid Build Coastguard Worker var relPath string 1623*333d2b36SAndroid Build Coastguard Worker if sharedLibInfo.Target.Arch.ArchType.Multilib == "lib64" { 1624*333d2b36SAndroid Build Coastguard Worker relPath = filepath.Join("lib64", sharedLibInfo.SharedLibrary.Base()) 1625*333d2b36SAndroid Build Coastguard Worker } else { 1626*333d2b36SAndroid Build Coastguard Worker relPath = filepath.Join("lib", sharedLibInfo.SharedLibrary.Base()) 1627*333d2b36SAndroid Build Coastguard Worker } 1628*333d2b36SAndroid Build Coastguard Worker relocatedLib := android.PathForModuleOut(ctx, "relocated").Join(ctx, relPath) 1629*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1630*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 1631*333d2b36SAndroid Build Coastguard Worker Input: sharedLibInfo.SharedLibrary, 1632*333d2b36SAndroid Build Coastguard Worker Output: relocatedLib, 1633*333d2b36SAndroid Build Coastguard Worker }) 1634*333d2b36SAndroid Build Coastguard Worker j.data = append(j.data, relocatedLib) 1635*333d2b36SAndroid Build Coastguard Worker 1636*333d2b36SAndroid Build Coastguard Worker directImplementationDeps = append(directImplementationDeps, android.OutputFileForModule(ctx, dep, "")) 1637*333d2b36SAndroid Build Coastguard Worker if info, ok := android.OtherModuleProvider(ctx, dep, cc.ImplementationDepInfoProvider); ok { 1638*333d2b36SAndroid Build Coastguard Worker transitiveImplementationDeps = append(transitiveImplementationDeps, info.ImplementationDeps) 1639*333d2b36SAndroid Build Coastguard Worker } 1640*333d2b36SAndroid Build Coastguard Worker } else { 1641*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("jni_libs", "%q of type %q is not supported", dep.Name(), ctx.OtherModuleType(dep)) 1642*333d2b36SAndroid Build Coastguard Worker } 1643*333d2b36SAndroid Build Coastguard Worker }) 1644*333d2b36SAndroid Build Coastguard Worker 1645*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, cc.ImplementationDepInfoProvider, &cc.ImplementationDepInfo{ 1646*333d2b36SAndroid Build Coastguard Worker ImplementationDeps: depset.New(depset.PREORDER, directImplementationDeps, transitiveImplementationDeps), 1647*333d2b36SAndroid Build Coastguard Worker }) 1648*333d2b36SAndroid Build Coastguard Worker 1649*333d2b36SAndroid Build Coastguard Worker j.Library.GenerateAndroidBuildActions(ctx) 1650*333d2b36SAndroid Build Coastguard Worker} 1651*333d2b36SAndroid Build Coastguard Worker 1652*333d2b36SAndroid Build Coastguard Workerfunc (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1653*333d2b36SAndroid Build Coastguard Worker j.Library.GenerateAndroidBuildActions(ctx) 1654*333d2b36SAndroid Build Coastguard Worker} 1655*333d2b36SAndroid Build Coastguard Worker 1656*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1657*333d2b36SAndroid Build Coastguard Worker j.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{ 1658*333d2b36SAndroid Build Coastguard Worker TestConfigProp: j.prebuiltTestProperties.Test_config, 1659*333d2b36SAndroid Build Coastguard Worker TestSuites: j.prebuiltTestProperties.Test_suites, 1660*333d2b36SAndroid Build Coastguard Worker DeviceTemplate: "${JavaTestConfigTemplate}", 1661*333d2b36SAndroid Build Coastguard Worker HostTemplate: "${JavaHostTestConfigTemplate}", 1662*333d2b36SAndroid Build Coastguard Worker HostUnitTestTemplate: "${JavaHostUnitTestConfigTemplate}", 1663*333d2b36SAndroid Build Coastguard Worker }) 1664*333d2b36SAndroid Build Coastguard Worker 1665*333d2b36SAndroid Build Coastguard Worker j.Import.GenerateAndroidBuildActions(ctx) 1666*333d2b36SAndroid Build Coastguard Worker} 1667*333d2b36SAndroid Build Coastguard Worker 1668*333d2b36SAndroid Build Coastguard Workertype testSdkMemberType struct { 1669*333d2b36SAndroid Build Coastguard Worker android.SdkMemberTypeBase 1670*333d2b36SAndroid Build Coastguard Worker} 1671*333d2b36SAndroid Build Coastguard Worker 1672*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) { 1673*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, dependencyTag, names...) 1674*333d2b36SAndroid Build Coastguard Worker} 1675*333d2b36SAndroid Build Coastguard Worker 1676*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) IsInstance(module android.Module) bool { 1677*333d2b36SAndroid Build Coastguard Worker _, ok := module.(*Test) 1678*333d2b36SAndroid Build Coastguard Worker return ok 1679*333d2b36SAndroid Build Coastguard Worker} 1680*333d2b36SAndroid Build Coastguard Worker 1681*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule { 1682*333d2b36SAndroid Build Coastguard Worker return ctx.SnapshotBuilder().AddPrebuiltModule(member, "java_test_import") 1683*333d2b36SAndroid Build Coastguard Worker} 1684*333d2b36SAndroid Build Coastguard Worker 1685*333d2b36SAndroid Build Coastguard Workerfunc (mt *testSdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { 1686*333d2b36SAndroid Build Coastguard Worker return &testSdkMemberProperties{} 1687*333d2b36SAndroid Build Coastguard Worker} 1688*333d2b36SAndroid Build Coastguard Worker 1689*333d2b36SAndroid Build Coastguard Workertype testSdkMemberProperties struct { 1690*333d2b36SAndroid Build Coastguard Worker android.SdkMemberPropertiesBase 1691*333d2b36SAndroid Build Coastguard Worker 1692*333d2b36SAndroid Build Coastguard Worker JarToExport android.Path 1693*333d2b36SAndroid Build Coastguard Worker TestConfig android.Path 1694*333d2b36SAndroid Build Coastguard Worker} 1695*333d2b36SAndroid Build Coastguard Worker 1696*333d2b36SAndroid Build Coastguard Workerfunc (p *testSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { 1697*333d2b36SAndroid Build Coastguard Worker test := variant.(*Test) 1698*333d2b36SAndroid Build Coastguard Worker 1699*333d2b36SAndroid Build Coastguard Worker implementationJars := test.ImplementationJars() 1700*333d2b36SAndroid Build Coastguard Worker if len(implementationJars) != 1 { 1701*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("there must be only one implementation jar from %q", test.Name())) 1702*333d2b36SAndroid Build Coastguard Worker } 1703*333d2b36SAndroid Build Coastguard Worker 1704*333d2b36SAndroid Build Coastguard Worker p.JarToExport = implementationJars[0] 1705*333d2b36SAndroid Build Coastguard Worker p.TestConfig = test.testConfig 1706*333d2b36SAndroid Build Coastguard Worker} 1707*333d2b36SAndroid Build Coastguard Worker 1708*333d2b36SAndroid Build Coastguard Workerfunc (p *testSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) { 1709*333d2b36SAndroid Build Coastguard Worker builder := ctx.SnapshotBuilder() 1710*333d2b36SAndroid Build Coastguard Worker 1711*333d2b36SAndroid Build Coastguard Worker exportedJar := p.JarToExport 1712*333d2b36SAndroid Build Coastguard Worker if exportedJar != nil { 1713*333d2b36SAndroid Build Coastguard Worker snapshotRelativeJavaLibPath := sdkSnapshotFilePathForJar(ctx, p.OsPrefix(), ctx.Name()) 1714*333d2b36SAndroid Build Coastguard Worker builder.CopyToSnapshot(exportedJar, snapshotRelativeJavaLibPath) 1715*333d2b36SAndroid Build Coastguard Worker 1716*333d2b36SAndroid Build Coastguard Worker propertySet.AddProperty("jars", []string{snapshotRelativeJavaLibPath}) 1717*333d2b36SAndroid Build Coastguard Worker } 1718*333d2b36SAndroid Build Coastguard Worker 1719*333d2b36SAndroid Build Coastguard Worker testConfig := p.TestConfig 1720*333d2b36SAndroid Build Coastguard Worker if testConfig != nil { 1721*333d2b36SAndroid Build Coastguard Worker snapshotRelativeTestConfigPath := sdkSnapshotFilePathForMember(p.OsPrefix(), ctx.Name(), testConfigSuffix) 1722*333d2b36SAndroid Build Coastguard Worker builder.CopyToSnapshot(testConfig, snapshotRelativeTestConfigPath) 1723*333d2b36SAndroid Build Coastguard Worker propertySet.AddProperty("test_config", snapshotRelativeTestConfigPath) 1724*333d2b36SAndroid Build Coastguard Worker } 1725*333d2b36SAndroid Build Coastguard Worker} 1726*333d2b36SAndroid Build Coastguard Worker 1727*333d2b36SAndroid Build Coastguard Worker// java_test builds a and links sources into a `.jar` file for the device, and possibly for the host as well, and 1728*333d2b36SAndroid Build Coastguard Worker// creates an `AndroidTest.xml` file to allow running the test with `atest` or a `TEST_MAPPING` file. 1729*333d2b36SAndroid Build Coastguard Worker// 1730*333d2b36SAndroid Build Coastguard Worker// By default, a java_test has a single variant that produces a `.jar` file containing `classes.dex` files that were 1731*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath. 1732*333d2b36SAndroid Build Coastguard Worker// 1733*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one 1734*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1735*333d2b36SAndroid Build Coastguard Workerfunc TestFactory() android.Module { 1736*333d2b36SAndroid Build Coastguard Worker module := &Test{} 1737*333d2b36SAndroid Build Coastguard Worker 1738*333d2b36SAndroid Build Coastguard Worker module.addHostAndDeviceProperties() 1739*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testProperties) 1740*333d2b36SAndroid Build Coastguard Worker 1741*333d2b36SAndroid Build Coastguard Worker module.Module.properties.Installable = proptools.BoolPtr(true) 1742*333d2b36SAndroid Build Coastguard Worker module.Module.dexpreopter.isTest = true 1743*333d2b36SAndroid Build Coastguard Worker module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true) 1744*333d2b36SAndroid Build Coastguard Worker module.Module.sourceProperties.Test_only = proptools.BoolPtr(true) 1745*333d2b36SAndroid Build Coastguard Worker module.Module.sourceProperties.Top_level_test_target = true 1746*333d2b36SAndroid Build Coastguard Worker 1747*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostAndDeviceSupported) 1748*333d2b36SAndroid Build Coastguard Worker return module 1749*333d2b36SAndroid Build Coastguard Worker} 1750*333d2b36SAndroid Build Coastguard Worker 1751*333d2b36SAndroid Build Coastguard Worker// java_test_helper_library creates a java library and makes sure that it is added to the appropriate test suite. 1752*333d2b36SAndroid Build Coastguard Workerfunc TestHelperLibraryFactory() android.Module { 1753*333d2b36SAndroid Build Coastguard Worker module := &TestHelperLibrary{} 1754*333d2b36SAndroid Build Coastguard Worker 1755*333d2b36SAndroid Build Coastguard Worker module.addHostAndDeviceProperties() 1756*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testHelperLibraryProperties) 1757*333d2b36SAndroid Build Coastguard Worker 1758*333d2b36SAndroid Build Coastguard Worker module.Module.properties.Installable = proptools.BoolPtr(true) 1759*333d2b36SAndroid Build Coastguard Worker module.Module.dexpreopter.isTest = true 1760*333d2b36SAndroid Build Coastguard Worker module.Module.linter.properties.Lint.Test = proptools.BoolPtr(true) 1761*333d2b36SAndroid Build Coastguard Worker module.Module.sourceProperties.Test_only = proptools.BoolPtr(true) 1762*333d2b36SAndroid Build Coastguard Worker 1763*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostAndDeviceSupported) 1764*333d2b36SAndroid Build Coastguard Worker return module 1765*333d2b36SAndroid Build Coastguard Worker} 1766*333d2b36SAndroid Build Coastguard Worker 1767*333d2b36SAndroid Build Coastguard Worker// java_test_import imports one or more `.jar` files into the build graph as if they were built by a java_test module 1768*333d2b36SAndroid Build Coastguard Worker// and makes sure that it is added to the appropriate test suite. 1769*333d2b36SAndroid Build Coastguard Worker// 1770*333d2b36SAndroid Build Coastguard Worker// By default, a java_test_import has a single variant that expects a `.jar` file containing `.class` files that were 1771*333d2b36SAndroid Build Coastguard Worker// compiled against an Android classpath. 1772*333d2b36SAndroid Build Coastguard Worker// 1773*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one 1774*333d2b36SAndroid Build Coastguard Worker// for host modules. 1775*333d2b36SAndroid Build Coastguard Workerfunc JavaTestImportFactory() android.Module { 1776*333d2b36SAndroid Build Coastguard Worker module := &JavaTestImport{} 1777*333d2b36SAndroid Build Coastguard Worker 1778*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 1779*333d2b36SAndroid Build Coastguard Worker &module.Import.properties, 1780*333d2b36SAndroid Build Coastguard Worker &module.prebuiltTestProperties) 1781*333d2b36SAndroid Build Coastguard Worker 1782*333d2b36SAndroid Build Coastguard Worker module.Import.properties.Installable = proptools.BoolPtr(true) 1783*333d2b36SAndroid Build Coastguard Worker 1784*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &module.properties.Jars) 1785*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 1786*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostAndDeviceSupported) 1787*333d2b36SAndroid Build Coastguard Worker return module 1788*333d2b36SAndroid Build Coastguard Worker} 1789*333d2b36SAndroid Build Coastguard Worker 1790*333d2b36SAndroid Build Coastguard Worker// java_test_host builds a and links sources into a `.jar` file for the host, and creates an `AndroidTest.xml` file to 1791*333d2b36SAndroid Build Coastguard Worker// allow running the test with `atest` or a `TEST_MAPPING` file. 1792*333d2b36SAndroid Build Coastguard Worker// 1793*333d2b36SAndroid Build Coastguard Worker// A java_test_host has a single variant that produces a `.jar` file containing `.class` files that were 1794*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1795*333d2b36SAndroid Build Coastguard Workerfunc TestHostFactory() android.Module { 1796*333d2b36SAndroid Build Coastguard Worker module := &TestHost{} 1797*333d2b36SAndroid Build Coastguard Worker 1798*333d2b36SAndroid Build Coastguard Worker module.addHostProperties() 1799*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testProperties) 1800*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.testHostProperties) 1801*333d2b36SAndroid Build Coastguard Worker 1802*333d2b36SAndroid Build Coastguard Worker InitTestHost( 1803*333d2b36SAndroid Build Coastguard Worker module, 1804*333d2b36SAndroid Build Coastguard Worker proptools.BoolPtr(true), 1805*333d2b36SAndroid Build Coastguard Worker nil, 1806*333d2b36SAndroid Build Coastguard Worker nil) 1807*333d2b36SAndroid Build Coastguard Worker 1808*333d2b36SAndroid Build Coastguard Worker InitJavaModuleMultiTargets(module, android.HostSupported) 1809*333d2b36SAndroid Build Coastguard Worker 1810*333d2b36SAndroid Build Coastguard Worker return module 1811*333d2b36SAndroid Build Coastguard Worker} 1812*333d2b36SAndroid Build Coastguard Worker 1813*333d2b36SAndroid Build Coastguard Workerfunc InitTestHost(th *TestHost, installable *bool, testSuites []string, autoGenConfig *bool) { 1814*333d2b36SAndroid Build Coastguard Worker th.properties.Installable = installable 1815*333d2b36SAndroid Build Coastguard Worker th.testProperties.Auto_gen_config = autoGenConfig 1816*333d2b36SAndroid Build Coastguard Worker th.testProperties.Test_suites = testSuites 1817*333d2b36SAndroid Build Coastguard Worker th.sourceProperties.Test_only = proptools.BoolPtr(true) 1818*333d2b36SAndroid Build Coastguard Worker th.sourceProperties.Top_level_test_target = true 1819*333d2b36SAndroid Build Coastguard Worker} 1820*333d2b36SAndroid Build Coastguard Worker 1821*333d2b36SAndroid Build Coastguard Worker// 1822*333d2b36SAndroid Build Coastguard Worker// Java Binaries (.jar file plus wrapper script) 1823*333d2b36SAndroid Build Coastguard Worker// 1824*333d2b36SAndroid Build Coastguard Worker 1825*333d2b36SAndroid Build Coastguard Workertype binaryProperties struct { 1826*333d2b36SAndroid Build Coastguard Worker // installable script to execute the resulting jar 1827*333d2b36SAndroid Build Coastguard Worker Wrapper *string `android:"path,arch_variant"` 1828*333d2b36SAndroid Build Coastguard Worker 1829*333d2b36SAndroid Build Coastguard Worker // Name of the class containing main to be inserted into the manifest as Main-Class. 1830*333d2b36SAndroid Build Coastguard Worker Main_class *string 1831*333d2b36SAndroid Build Coastguard Worker 1832*333d2b36SAndroid Build Coastguard Worker // Names of modules containing JNI libraries that should be installed alongside the binary. 1833*333d2b36SAndroid Build Coastguard Worker Jni_libs []string `android:"arch_variant"` 1834*333d2b36SAndroid Build Coastguard Worker} 1835*333d2b36SAndroid Build Coastguard Worker 1836*333d2b36SAndroid Build Coastguard Workertype Binary struct { 1837*333d2b36SAndroid Build Coastguard Worker Library 1838*333d2b36SAndroid Build Coastguard Worker 1839*333d2b36SAndroid Build Coastguard Worker binaryProperties binaryProperties 1840*333d2b36SAndroid Build Coastguard Worker 1841*333d2b36SAndroid Build Coastguard Worker wrapperFile android.Path 1842*333d2b36SAndroid Build Coastguard Worker binaryFile android.InstallPath 1843*333d2b36SAndroid Build Coastguard Worker 1844*333d2b36SAndroid Build Coastguard Worker androidMkNamesOfJniLibs []string 1845*333d2b36SAndroid Build Coastguard Worker} 1846*333d2b36SAndroid Build Coastguard Worker 1847*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) HostToolPath() android.OptionalPath { 1848*333d2b36SAndroid Build Coastguard Worker return android.OptionalPathForPath(j.binaryFile) 1849*333d2b36SAndroid Build Coastguard Worker} 1850*333d2b36SAndroid Build Coastguard Worker 1851*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 1852*333d2b36SAndroid Build Coastguard Worker j.stem = proptools.StringDefault(j.overridableProperties.Stem, ctx.ModuleName()) 1853*333d2b36SAndroid Build Coastguard Worker 1854*333d2b36SAndroid Build Coastguard Worker // Handle the binary wrapper. This comes before compiling the jar so that the wrapper 1855*333d2b36SAndroid Build Coastguard Worker // is the first PackagingSpec 1856*333d2b36SAndroid Build Coastguard Worker if j.binaryProperties.Wrapper != nil { 1857*333d2b36SAndroid Build Coastguard Worker j.wrapperFile = android.PathForModuleSrc(ctx, *j.binaryProperties.Wrapper) 1858*333d2b36SAndroid Build Coastguard Worker } else { 1859*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 1860*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("wrapper", "wrapper is required for Windows") 1861*333d2b36SAndroid Build Coastguard Worker } 1862*333d2b36SAndroid Build Coastguard Worker 1863*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 1864*333d2b36SAndroid Build Coastguard Worker // device binary should have a main_class property if it does not 1865*333d2b36SAndroid Build Coastguard Worker // have a specific wrapper, so that a default wrapper can 1866*333d2b36SAndroid Build Coastguard Worker // be generated for it. 1867*333d2b36SAndroid Build Coastguard Worker if j.binaryProperties.Main_class == nil { 1868*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("main_class", "main_class property "+ 1869*333d2b36SAndroid Build Coastguard Worker "is required for device binary if no default wrapper is assigned") 1870*333d2b36SAndroid Build Coastguard Worker } else { 1871*333d2b36SAndroid Build Coastguard Worker wrapper := android.PathForModuleOut(ctx, ctx.ModuleName()+".sh") 1872*333d2b36SAndroid Build Coastguard Worker jarName := j.Stem() + ".jar" 1873*333d2b36SAndroid Build Coastguard Worker partition := j.PartitionTag(ctx.DeviceConfig()) 1874*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 1875*333d2b36SAndroid Build Coastguard Worker Rule: deviceBinaryWrapper, 1876*333d2b36SAndroid Build Coastguard Worker Output: wrapper, 1877*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 1878*333d2b36SAndroid Build Coastguard Worker "jar_name": jarName, 1879*333d2b36SAndroid Build Coastguard Worker "partition": partition, 1880*333d2b36SAndroid Build Coastguard Worker "main_class": String(j.binaryProperties.Main_class), 1881*333d2b36SAndroid Build Coastguard Worker }, 1882*333d2b36SAndroid Build Coastguard Worker }) 1883*333d2b36SAndroid Build Coastguard Worker j.wrapperFile = wrapper 1884*333d2b36SAndroid Build Coastguard Worker } 1885*333d2b36SAndroid Build Coastguard Worker } else { 1886*333d2b36SAndroid Build Coastguard Worker j.wrapperFile = android.PathForSource(ctx, "build/soong/scripts/jar-wrapper.sh") 1887*333d2b36SAndroid Build Coastguard Worker } 1888*333d2b36SAndroid Build Coastguard Worker } 1889*333d2b36SAndroid Build Coastguard Worker 1890*333d2b36SAndroid Build Coastguard Worker ext := "" 1891*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 1892*333d2b36SAndroid Build Coastguard Worker ext = ".bat" 1893*333d2b36SAndroid Build Coastguard Worker } 1894*333d2b36SAndroid Build Coastguard Worker 1895*333d2b36SAndroid Build Coastguard Worker // The host installation rules make the installed wrapper depend on all the dependencies 1896*333d2b36SAndroid Build Coastguard Worker // of the wrapper variant, which will include the common variant's jar file and any JNI 1897*333d2b36SAndroid Build Coastguard Worker // libraries. This is verified by TestBinary. Also make it depend on the jar file so that 1898*333d2b36SAndroid Build Coastguard Worker // the binary file timestamp will update when the jar file timestamp does. The jar file is 1899*333d2b36SAndroid Build Coastguard Worker // built later on, in j.Library.GenerateAndroidBuildActions, so we have to create an identical 1900*333d2b36SAndroid Build Coastguard Worker // installpath representing it here. 1901*333d2b36SAndroid Build Coastguard Worker j.binaryFile = ctx.InstallExecutable(android.PathForModuleInstall(ctx, "bin"), 1902*333d2b36SAndroid Build Coastguard Worker ctx.ModuleName()+ext, j.wrapperFile, j.getJarInstallDir(ctx).Join(ctx, j.Stem()+".jar")) 1903*333d2b36SAndroid Build Coastguard Worker 1904*333d2b36SAndroid Build Coastguard Worker // Set the jniLibs of this binary. 1905*333d2b36SAndroid Build Coastguard Worker // These will be added to `LOCAL_REQUIRED_MODULES`, and the kati packaging system will 1906*333d2b36SAndroid Build Coastguard Worker // install these alongside the java binary. 1907*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(jniInstallTag, func(jni android.Module) { 1908*333d2b36SAndroid Build Coastguard Worker // Use the BaseModuleName of the dependency (without any prebuilt_ prefix) 1909*333d2b36SAndroid Build Coastguard Worker bmn, _ := jni.(interface{ BaseModuleName() string }) 1910*333d2b36SAndroid Build Coastguard Worker j.androidMkNamesOfJniLibs = append(j.androidMkNamesOfJniLibs, bmn.BaseModuleName()+":"+jni.Target().Arch.ArchType.Bitness()) 1911*333d2b36SAndroid Build Coastguard Worker }) 1912*333d2b36SAndroid Build Coastguard Worker // Check that native libraries are not listed in `required`. Prompt users to use `jni_libs` instead. 1913*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDepsWithTag(android.RequiredDepTag, func(dep android.Module) { 1914*333d2b36SAndroid Build Coastguard Worker if _, hasSharedLibraryInfo := android.OtherModuleProvider(ctx, dep, cc.SharedLibraryInfoProvider); hasSharedLibraryInfo { 1915*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("cc_library %s is no longer supported in `required` of java_binary modules. Please use jni_libs instead.", dep.Name()) 1916*333d2b36SAndroid Build Coastguard Worker } 1917*333d2b36SAndroid Build Coastguard Worker }) 1918*333d2b36SAndroid Build Coastguard Worker 1919*333d2b36SAndroid Build Coastguard Worker // Compile the jar 1920*333d2b36SAndroid Build Coastguard Worker if j.binaryProperties.Main_class != nil { 1921*333d2b36SAndroid Build Coastguard Worker if j.properties.Manifest != nil { 1922*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("main_class", "main_class cannot be used when manifest is set") 1923*333d2b36SAndroid Build Coastguard Worker } 1924*333d2b36SAndroid Build Coastguard Worker manifestFile := android.PathForModuleOut(ctx, "manifest.txt") 1925*333d2b36SAndroid Build Coastguard Worker GenerateMainClassManifest(ctx, manifestFile, String(j.binaryProperties.Main_class)) 1926*333d2b36SAndroid Build Coastguard Worker j.overrideManifest = android.OptionalPathForPath(manifestFile) 1927*333d2b36SAndroid Build Coastguard Worker } 1928*333d2b36SAndroid Build Coastguard Worker 1929*333d2b36SAndroid Build Coastguard Worker j.Library.GenerateAndroidBuildActions(ctx) 1930*333d2b36SAndroid Build Coastguard Worker} 1931*333d2b36SAndroid Build Coastguard Worker 1932*333d2b36SAndroid Build Coastguard Workerfunc (j *Binary) DepsMutator(ctx android.BottomUpMutatorContext) { 1933*333d2b36SAndroid Build Coastguard Worker j.deps(ctx) 1934*333d2b36SAndroid Build Coastguard Worker // These dependencies ensure the installation rules will install the jar file when the 1935*333d2b36SAndroid Build Coastguard Worker // wrapper is installed, and the jni libraries when the wrapper is installed. 1936*333d2b36SAndroid Build Coastguard Worker if ctx.Os().Class == android.Host { 1937*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(ctx.Config().BuildOSTarget.Variations(), jniInstallTag, j.binaryProperties.Jni_libs...) 1938*333d2b36SAndroid Build Coastguard Worker } else if ctx.Os().Class == android.Device { 1939*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(ctx.Config().AndroidFirstDeviceTarget.Variations(), jniInstallTag, j.binaryProperties.Jni_libs...) 1940*333d2b36SAndroid Build Coastguard Worker } else { 1941*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Unknown os class") 1942*333d2b36SAndroid Build Coastguard Worker } 1943*333d2b36SAndroid Build Coastguard Worker} 1944*333d2b36SAndroid Build Coastguard Worker 1945*333d2b36SAndroid Build Coastguard Worker// java_binary builds a `.jar` file and a shell script that executes it for the device, and possibly for the host 1946*333d2b36SAndroid Build Coastguard Worker// as well. 1947*333d2b36SAndroid Build Coastguard Worker// 1948*333d2b36SAndroid Build Coastguard Worker// By default, a java_binary has a single variant that produces a `.jar` file containing `classes.dex` files that were 1949*333d2b36SAndroid Build Coastguard Worker// compiled against the device bootclasspath. 1950*333d2b36SAndroid Build Coastguard Worker// 1951*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one compiled against the device bootclasspath and one 1952*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1953*333d2b36SAndroid Build Coastguard Workerfunc BinaryFactory() android.Module { 1954*333d2b36SAndroid Build Coastguard Worker module := &Binary{} 1955*333d2b36SAndroid Build Coastguard Worker 1956*333d2b36SAndroid Build Coastguard Worker module.addHostAndDeviceProperties() 1957*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.binaryProperties, &module.sourceProperties) 1958*333d2b36SAndroid Build Coastguard Worker 1959*333d2b36SAndroid Build Coastguard Worker module.Module.properties.Installable = proptools.BoolPtr(true) 1960*333d2b36SAndroid Build Coastguard Worker 1961*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon) 1962*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 1963*333d2b36SAndroid Build Coastguard Worker 1964*333d2b36SAndroid Build Coastguard Worker return module 1965*333d2b36SAndroid Build Coastguard Worker} 1966*333d2b36SAndroid Build Coastguard Worker 1967*333d2b36SAndroid Build Coastguard Worker// java_binary_host builds a `.jar` file and a shell script that executes it for the host. 1968*333d2b36SAndroid Build Coastguard Worker// 1969*333d2b36SAndroid Build Coastguard Worker// A java_binary_host has a single variant that produces a `.jar` file containing `.class` files that were 1970*333d2b36SAndroid Build Coastguard Worker// compiled against the host bootclasspath. 1971*333d2b36SAndroid Build Coastguard Workerfunc BinaryHostFactory() android.Module { 1972*333d2b36SAndroid Build Coastguard Worker module := &Binary{} 1973*333d2b36SAndroid Build Coastguard Worker 1974*333d2b36SAndroid Build Coastguard Worker module.addHostProperties() 1975*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.binaryProperties) 1976*333d2b36SAndroid Build Coastguard Worker 1977*333d2b36SAndroid Build Coastguard Worker module.Module.properties.Installable = proptools.BoolPtr(true) 1978*333d2b36SAndroid Build Coastguard Worker 1979*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.HostSupported, android.MultilibCommon) 1980*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 1981*333d2b36SAndroid Build Coastguard Worker return module 1982*333d2b36SAndroid Build Coastguard Worker} 1983*333d2b36SAndroid Build Coastguard Worker 1984*333d2b36SAndroid Build Coastguard Workertype JavaApiContribution struct { 1985*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 1986*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 1987*333d2b36SAndroid Build Coastguard Worker embeddableInModuleAndImport 1988*333d2b36SAndroid Build Coastguard Worker 1989*333d2b36SAndroid Build Coastguard Worker properties struct { 1990*333d2b36SAndroid Build Coastguard Worker // name of the API surface 1991*333d2b36SAndroid Build Coastguard Worker Api_surface *string 1992*333d2b36SAndroid Build Coastguard Worker 1993*333d2b36SAndroid Build Coastguard Worker // relative path to the API signature text file 1994*333d2b36SAndroid Build Coastguard Worker Api_file *string `android:"path"` 1995*333d2b36SAndroid Build Coastguard Worker } 1996*333d2b36SAndroid Build Coastguard Worker} 1997*333d2b36SAndroid Build Coastguard Worker 1998*333d2b36SAndroid Build Coastguard Workerfunc ApiContributionFactory() android.Module { 1999*333d2b36SAndroid Build Coastguard Worker module := &JavaApiContribution{} 2000*333d2b36SAndroid Build Coastguard Worker android.InitAndroidModule(module) 2001*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 2002*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 2003*333d2b36SAndroid Build Coastguard Worker module.initModuleAndImport(module) 2004*333d2b36SAndroid Build Coastguard Worker return module 2005*333d2b36SAndroid Build Coastguard Worker} 2006*333d2b36SAndroid Build Coastguard Worker 2007*333d2b36SAndroid Build Coastguard Workertype JavaApiImportInfo struct { 2008*333d2b36SAndroid Build Coastguard Worker ApiFile android.Path 2009*333d2b36SAndroid Build Coastguard Worker ApiSurface string 2010*333d2b36SAndroid Build Coastguard Worker} 2011*333d2b36SAndroid Build Coastguard Worker 2012*333d2b36SAndroid Build Coastguard Workervar JavaApiImportProvider = blueprint.NewProvider[JavaApiImportInfo]() 2013*333d2b36SAndroid Build Coastguard Worker 2014*333d2b36SAndroid Build Coastguard Workerfunc (ap *JavaApiContribution) GenerateAndroidBuildActions(ctx android.ModuleContext) { 2015*333d2b36SAndroid Build Coastguard Worker var apiFile android.Path = nil 2016*333d2b36SAndroid Build Coastguard Worker if apiFileString := ap.properties.Api_file; apiFileString != nil { 2017*333d2b36SAndroid Build Coastguard Worker apiFile = android.PathForModuleSrc(ctx, String(apiFileString)) 2018*333d2b36SAndroid Build Coastguard Worker } 2019*333d2b36SAndroid Build Coastguard Worker 2020*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaApiImportProvider, JavaApiImportInfo{ 2021*333d2b36SAndroid Build Coastguard Worker ApiFile: apiFile, 2022*333d2b36SAndroid Build Coastguard Worker ApiSurface: proptools.String(ap.properties.Api_surface), 2023*333d2b36SAndroid Build Coastguard Worker }) 2024*333d2b36SAndroid Build Coastguard Worker} 2025*333d2b36SAndroid Build Coastguard Worker 2026*333d2b36SAndroid Build Coastguard Workertype ApiLibrary struct { 2027*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 2028*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 2029*333d2b36SAndroid Build Coastguard Worker 2030*333d2b36SAndroid Build Coastguard Worker hiddenAPI 2031*333d2b36SAndroid Build Coastguard Worker dexer 2032*333d2b36SAndroid Build Coastguard Worker embeddableInModuleAndImport 2033*333d2b36SAndroid Build Coastguard Worker 2034*333d2b36SAndroid Build Coastguard Worker properties JavaApiLibraryProperties 2035*333d2b36SAndroid Build Coastguard Worker 2036*333d2b36SAndroid Build Coastguard Worker stubsSrcJar android.WritablePath 2037*333d2b36SAndroid Build Coastguard Worker stubsJar android.WritablePath 2038*333d2b36SAndroid Build Coastguard Worker stubsJarWithoutStaticLibs android.WritablePath 2039*333d2b36SAndroid Build Coastguard Worker extractedSrcJar android.WritablePath 2040*333d2b36SAndroid Build Coastguard Worker // .dex of stubs, used for hiddenapi processing 2041*333d2b36SAndroid Build Coastguard Worker dexJarFile OptionalDexJarPath 2042*333d2b36SAndroid Build Coastguard Worker 2043*333d2b36SAndroid Build Coastguard Worker validationPaths android.Paths 2044*333d2b36SAndroid Build Coastguard Worker 2045*333d2b36SAndroid Build Coastguard Worker stubsType StubsType 2046*333d2b36SAndroid Build Coastguard Worker 2047*333d2b36SAndroid Build Coastguard Worker aconfigProtoFiles android.Paths 2048*333d2b36SAndroid Build Coastguard Worker} 2049*333d2b36SAndroid Build Coastguard Worker 2050*333d2b36SAndroid Build Coastguard Workertype JavaApiLibraryProperties struct { 2051*333d2b36SAndroid Build Coastguard Worker // name of the API surface 2052*333d2b36SAndroid Build Coastguard Worker Api_surface *string 2053*333d2b36SAndroid Build Coastguard Worker 2054*333d2b36SAndroid Build Coastguard Worker // list of Java API contribution modules that consists this API surface 2055*333d2b36SAndroid Build Coastguard Worker // This is a list of Soong modules 2056*333d2b36SAndroid Build Coastguard Worker Api_contributions []string 2057*333d2b36SAndroid Build Coastguard Worker 2058*333d2b36SAndroid Build Coastguard Worker // List of flags to be passed to the javac compiler to generate jar file 2059*333d2b36SAndroid Build Coastguard Worker Javacflags []string 2060*333d2b36SAndroid Build Coastguard Worker 2061*333d2b36SAndroid Build Coastguard Worker // List of shared java libs that this module has dependencies to and 2062*333d2b36SAndroid Build Coastguard Worker // should be passed as classpath in javac invocation 2063*333d2b36SAndroid Build Coastguard Worker Libs proptools.Configurable[[]string] 2064*333d2b36SAndroid Build Coastguard Worker 2065*333d2b36SAndroid Build Coastguard Worker // List of java libs that this module has static dependencies to and will be 2066*333d2b36SAndroid Build Coastguard Worker // merge zipped after metalava invocation 2067*333d2b36SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] 2068*333d2b36SAndroid Build Coastguard Worker 2069*333d2b36SAndroid Build Coastguard Worker // Version of previously released API file for compatibility check. 2070*333d2b36SAndroid Build Coastguard Worker Previous_api *string `android:"path"` 2071*333d2b36SAndroid Build Coastguard Worker 2072*333d2b36SAndroid Build Coastguard Worker // java_system_modules module providing the jar to be added to the 2073*333d2b36SAndroid Build Coastguard Worker // bootclasspath when compiling the stubs. 2074*333d2b36SAndroid Build Coastguard Worker // The jar will also be passed to metalava as a classpath to 2075*333d2b36SAndroid Build Coastguard Worker // generate compilable stubs. 2076*333d2b36SAndroid Build Coastguard Worker System_modules *string 2077*333d2b36SAndroid Build Coastguard Worker 2078*333d2b36SAndroid Build Coastguard Worker // If true, the module runs validation on the API signature files provided 2079*333d2b36SAndroid Build Coastguard Worker // by the modules passed via api_contributions by checking if the files are 2080*333d2b36SAndroid Build Coastguard Worker // in sync with the source Java files. However, the environment variable 2081*333d2b36SAndroid Build Coastguard Worker // DISABLE_STUB_VALIDATION has precedence over this property. 2082*333d2b36SAndroid Build Coastguard Worker Enable_validation *bool 2083*333d2b36SAndroid Build Coastguard Worker 2084*333d2b36SAndroid Build Coastguard Worker // Type of stubs the module should generate. Must be one of "everything", "runtime" or 2085*333d2b36SAndroid Build Coastguard Worker // "exportable". Defaults to "everything". 2086*333d2b36SAndroid Build Coastguard Worker // - "everything" stubs include all non-flagged apis and flagged apis, regardless of the state 2087*333d2b36SAndroid Build Coastguard Worker // of the flag. 2088*333d2b36SAndroid Build Coastguard Worker // - "runtime" stubs include all non-flagged apis and flagged apis that are ENABLED or 2089*333d2b36SAndroid Build Coastguard Worker // READ_WRITE, and all other flagged apis are stripped. 2090*333d2b36SAndroid Build Coastguard Worker // - "exportable" stubs include all non-flagged apis and flagged apis that are ENABLED and 2091*333d2b36SAndroid Build Coastguard Worker // READ_ONLY, and all other flagged apis are stripped. 2092*333d2b36SAndroid Build Coastguard Worker Stubs_type *string 2093*333d2b36SAndroid Build Coastguard Worker 2094*333d2b36SAndroid Build Coastguard Worker // List of aconfig_declarations module names that the stubs generated in this module 2095*333d2b36SAndroid Build Coastguard Worker // depend on. 2096*333d2b36SAndroid Build Coastguard Worker Aconfig_declarations []string 2097*333d2b36SAndroid Build Coastguard Worker 2098*333d2b36SAndroid Build Coastguard Worker // List of hard coded filegroups containing Metalava config files that are passed to every 2099*333d2b36SAndroid Build Coastguard Worker // Metalava invocation that this module performs. See addMetalavaConfigFilesToCmd. 2100*333d2b36SAndroid Build Coastguard Worker ConfigFiles []string `android:"path" blueprint:"mutated"` 2101*333d2b36SAndroid Build Coastguard Worker 2102*333d2b36SAndroid Build Coastguard Worker // If not blank, set to the version of the sdk to compile against. 2103*333d2b36SAndroid Build Coastguard Worker // Defaults to an empty string, which compiles the module against the private platform APIs. 2104*333d2b36SAndroid Build Coastguard Worker // Values are of one of the following forms: 2105*333d2b36SAndroid Build Coastguard Worker // 1) numerical API level, "current", "none", or "core_platform" 2106*333d2b36SAndroid Build Coastguard Worker // 2) An SDK kind with an API level: "<sdk kind>_<API level>" 2107*333d2b36SAndroid Build Coastguard Worker // See build/soong/android/sdk_version.go for the complete and up to date list of SDK kinds. 2108*333d2b36SAndroid Build Coastguard Worker // If the SDK kind is empty, it will be set to public. 2109*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 2110*333d2b36SAndroid Build Coastguard Worker} 2111*333d2b36SAndroid Build Coastguard Worker 2112*333d2b36SAndroid Build Coastguard Workerfunc ApiLibraryFactory() android.Module { 2113*333d2b36SAndroid Build Coastguard Worker module := &ApiLibrary{} 2114*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 2115*333d2b36SAndroid Build Coastguard Worker module.properties.ConfigFiles = getMetalavaConfigFilegroupReference() 2116*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 2117*333d2b36SAndroid Build Coastguard Worker module.initModuleAndImport(module) 2118*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 2119*333d2b36SAndroid Build Coastguard Worker return module 2120*333d2b36SAndroid Build Coastguard Worker} 2121*333d2b36SAndroid Build Coastguard Worker 2122*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ApiSurface() *string { 2123*333d2b36SAndroid Build Coastguard Worker return al.properties.Api_surface 2124*333d2b36SAndroid Build Coastguard Worker} 2125*333d2b36SAndroid Build Coastguard Worker 2126*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) StubsJar() android.Path { 2127*333d2b36SAndroid Build Coastguard Worker return al.stubsJar 2128*333d2b36SAndroid Build Coastguard Worker} 2129*333d2b36SAndroid Build Coastguard Worker 2130*333d2b36SAndroid Build Coastguard Workerfunc metalavaStubCmd(ctx android.ModuleContext, rule *android.RuleBuilder, 2131*333d2b36SAndroid Build Coastguard Worker srcs android.Paths, homeDir android.WritablePath, 2132*333d2b36SAndroid Build Coastguard Worker classpath android.Paths, configFiles android.Paths) *android.RuleBuilderCommand { 2133*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm -rf").Flag(homeDir.String()) 2134*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Flag(homeDir.String()) 2135*333d2b36SAndroid Build Coastguard Worker 2136*333d2b36SAndroid Build Coastguard Worker cmd := rule.Command() 2137*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithArg("ANDROID_PREFS_ROOT=", homeDir.String()) 2138*333d2b36SAndroid Build Coastguard Worker 2139*333d2b36SAndroid Build Coastguard Worker if metalavaUseRbe(ctx) { 2140*333d2b36SAndroid Build Coastguard Worker rule.Remoteable(android.RemoteRuleSupports{RBE: true}) 2141*333d2b36SAndroid Build Coastguard Worker execStrategy := ctx.Config().GetenvWithDefault("RBE_METALAVA_EXEC_STRATEGY", remoteexec.LocalExecStrategy) 2142*333d2b36SAndroid Build Coastguard Worker labels := map[string]string{"type": "tool", "name": "metalava"} 2143*333d2b36SAndroid Build Coastguard Worker 2144*333d2b36SAndroid Build Coastguard Worker pool := ctx.Config().GetenvWithDefault("RBE_METALAVA_POOL", "java16") 2145*333d2b36SAndroid Build Coastguard Worker rule.Rewrapper(&remoteexec.REParams{ 2146*333d2b36SAndroid Build Coastguard Worker Labels: labels, 2147*333d2b36SAndroid Build Coastguard Worker ExecStrategy: execStrategy, 2148*333d2b36SAndroid Build Coastguard Worker ToolchainInputs: []string{config.JavaCmd(ctx).String()}, 2149*333d2b36SAndroid Build Coastguard Worker Platform: map[string]string{remoteexec.PoolKey: pool}, 2150*333d2b36SAndroid Build Coastguard Worker }) 2151*333d2b36SAndroid Build Coastguard Worker } 2152*333d2b36SAndroid Build Coastguard Worker 2153*333d2b36SAndroid Build Coastguard Worker cmd.BuiltTool("metalava").ImplicitTool(ctx.Config().HostJavaToolPath(ctx, "metalava.jar")). 2154*333d2b36SAndroid Build Coastguard Worker Flag(config.JavacVmFlags). 2155*333d2b36SAndroid Build Coastguard Worker Flag("-J--add-opens=java.base/java.util=ALL-UNNAMED"). 2156*333d2b36SAndroid Build Coastguard Worker FlagWithInputList("--source-files ", srcs, " ") 2157*333d2b36SAndroid Build Coastguard Worker 2158*333d2b36SAndroid Build Coastguard Worker cmd.Flag("--color"). 2159*333d2b36SAndroid Build Coastguard Worker Flag("--quiet"). 2160*333d2b36SAndroid Build Coastguard Worker Flag("--include-annotations"). 2161*333d2b36SAndroid Build Coastguard Worker // The flag makes nullability issues as warnings rather than errors by replacing 2162*333d2b36SAndroid Build Coastguard Worker // @Nullable/@NonNull in the listed packages APIs with @RecentlyNullable/@RecentlyNonNull, 2163*333d2b36SAndroid Build Coastguard Worker // and these packages are meant to have everything annotated 2164*333d2b36SAndroid Build Coastguard Worker // @RecentlyNullable/@RecentlyNonNull. 2165*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--force-convert-to-warning-nullability-annotations ", "+*:-android.*:+android.icu.*:-dalvik.*"). 2166*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--repeat-errors-max ", "10"). 2167*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--hide ", "UnresolvedImport"). 2168*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--hide ", "InvalidNullabilityOverride"). 2169*333d2b36SAndroid Build Coastguard Worker FlagWithArg("--hide ", "ChangedDefault") 2170*333d2b36SAndroid Build Coastguard Worker 2171*333d2b36SAndroid Build Coastguard Worker addMetalavaConfigFilesToCmd(cmd, configFiles) 2172*333d2b36SAndroid Build Coastguard Worker 2173*333d2b36SAndroid Build Coastguard Worker if len(classpath) == 0 { 2174*333d2b36SAndroid Build Coastguard Worker // The main purpose of the `--api-class-resolution api` option is to force metalava to ignore 2175*333d2b36SAndroid Build Coastguard Worker // classes on the classpath when an API file contains missing classes. However, as this command 2176*333d2b36SAndroid Build Coastguard Worker // does not specify `--classpath` this is not needed for that. However, this is also used as a 2177*333d2b36SAndroid Build Coastguard Worker // signal to the special metalava code for generating stubs from text files that it needs to add 2178*333d2b36SAndroid Build Coastguard Worker // some additional items into the API (e.g. default constructors). 2179*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithArg("--api-class-resolution ", "api") 2180*333d2b36SAndroid Build Coastguard Worker } else { 2181*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithArg("--api-class-resolution ", "api:classpath") 2182*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithInputList("--classpath ", classpath, ":") 2183*333d2b36SAndroid Build Coastguard Worker } 2184*333d2b36SAndroid Build Coastguard Worker 2185*333d2b36SAndroid Build Coastguard Worker return cmd 2186*333d2b36SAndroid Build Coastguard Worker} 2187*333d2b36SAndroid Build Coastguard Worker 2188*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) HeaderJars() android.Paths { 2189*333d2b36SAndroid Build Coastguard Worker return android.Paths{al.stubsJar} 2190*333d2b36SAndroid Build Coastguard Worker} 2191*333d2b36SAndroid Build Coastguard Worker 2192*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) OutputDirAndDeps() (android.Path, android.Paths) { 2193*333d2b36SAndroid Build Coastguard Worker return nil, nil 2194*333d2b36SAndroid Build Coastguard Worker} 2195*333d2b36SAndroid Build Coastguard Worker 2196*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.OptionalPath) { 2197*333d2b36SAndroid Build Coastguard Worker if stubsDir.Valid() { 2198*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithArg("--stubs ", stubsDir.String()) 2199*333d2b36SAndroid Build Coastguard Worker } 2200*333d2b36SAndroid Build Coastguard Worker} 2201*333d2b36SAndroid Build Coastguard Worker 2202*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) addValidation(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, validationPaths android.Paths) { 2203*333d2b36SAndroid Build Coastguard Worker for _, validationPath := range validationPaths { 2204*333d2b36SAndroid Build Coastguard Worker cmd.Validation(validationPath) 2205*333d2b36SAndroid Build Coastguard Worker } 2206*333d2b36SAndroid Build Coastguard Worker} 2207*333d2b36SAndroid Build Coastguard Worker 2208*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { 2209*333d2b36SAndroid Build Coastguard Worker apiContributions := al.properties.Api_contributions 2210*333d2b36SAndroid Build Coastguard Worker addValidations := !ctx.Config().IsEnvTrue("DISABLE_STUB_VALIDATION") && 2211*333d2b36SAndroid Build Coastguard Worker !ctx.Config().IsEnvTrue("WITHOUT_CHECK_API") && 2212*333d2b36SAndroid Build Coastguard Worker proptools.BoolDefault(al.properties.Enable_validation, true) 2213*333d2b36SAndroid Build Coastguard Worker for _, apiContributionName := range apiContributions { 2214*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), javaApiContributionTag, apiContributionName) 2215*333d2b36SAndroid Build Coastguard Worker 2216*333d2b36SAndroid Build Coastguard Worker // Add the java_api_contribution module generating droidstubs module 2217*333d2b36SAndroid Build Coastguard Worker // as dependency when validation adding conditions are met and 2218*333d2b36SAndroid Build Coastguard Worker // the java_api_contribution module name has ".api.contribution" suffix. 2219*333d2b36SAndroid Build Coastguard Worker // All droidstubs-generated modules possess the suffix in the name, 2220*333d2b36SAndroid Build Coastguard Worker // but there is no such guarantee for tests. 2221*333d2b36SAndroid Build Coastguard Worker if addValidations { 2222*333d2b36SAndroid Build Coastguard Worker if strings.HasSuffix(apiContributionName, ".api.contribution") { 2223*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), metalavaCurrentApiTimestampTag, strings.TrimSuffix(apiContributionName, ".api.contribution")) 2224*333d2b36SAndroid Build Coastguard Worker } else { 2225*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Validation is enabled for module %s but a "+ 2226*333d2b36SAndroid Build Coastguard Worker "current timestamp provider is not found for the api "+ 2227*333d2b36SAndroid Build Coastguard Worker "contribution %s", 2228*333d2b36SAndroid Build Coastguard Worker ctx.ModuleName(), 2229*333d2b36SAndroid Build Coastguard Worker apiContributionName, 2230*333d2b36SAndroid Build Coastguard Worker ) 2231*333d2b36SAndroid Build Coastguard Worker } 2232*333d2b36SAndroid Build Coastguard Worker } 2233*333d2b36SAndroid Build Coastguard Worker } 2234*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 2235*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, android.SdkContext(al)) 2236*333d2b36SAndroid Build Coastguard Worker if sdkDep.useModule { 2237*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules) 2238*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, libTag, sdkDep.classpath...) 2239*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...) 2240*333d2b36SAndroid Build Coastguard Worker 2241*333d2b36SAndroid Build Coastguard Worker } 2242*333d2b36SAndroid Build Coastguard Worker } 2243*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, libTag, al.properties.Libs.GetOrDefault(ctx, nil)...) 2244*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, al.properties.Static_libs.GetOrDefault(ctx, nil)...) 2245*333d2b36SAndroid Build Coastguard Worker 2246*333d2b36SAndroid Build Coastguard Worker for _, aconfigDeclarationsName := range al.properties.Aconfig_declarations { 2247*333d2b36SAndroid Build Coastguard Worker ctx.AddDependency(ctx.Module(), aconfigDeclarationTag, aconfigDeclarationsName) 2248*333d2b36SAndroid Build Coastguard Worker } 2249*333d2b36SAndroid Build Coastguard Worker} 2250*333d2b36SAndroid Build Coastguard Worker 2251*333d2b36SAndroid Build Coastguard Worker// Map where key is the api scope name and value is the int value 2252*333d2b36SAndroid Build Coastguard Worker// representing the order of the api scope, narrowest to the widest 2253*333d2b36SAndroid Build Coastguard Workervar scopeOrderMap = AllApiScopes.MapToIndex( 2254*333d2b36SAndroid Build Coastguard Worker func(s *apiScope) string { return s.name }) 2255*333d2b36SAndroid Build Coastguard Worker 2256*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) sortApiFilesByApiScope(ctx android.ModuleContext, srcFilesInfo []JavaApiImportInfo) []JavaApiImportInfo { 2257*333d2b36SAndroid Build Coastguard Worker for _, srcFileInfo := range srcFilesInfo { 2258*333d2b36SAndroid Build Coastguard Worker if srcFileInfo.ApiSurface == "" { 2259*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Api surface not defined for the associated api file %s", srcFileInfo.ApiFile) 2260*333d2b36SAndroid Build Coastguard Worker } 2261*333d2b36SAndroid Build Coastguard Worker } 2262*333d2b36SAndroid Build Coastguard Worker sort.Slice(srcFilesInfo, func(i, j int) bool { 2263*333d2b36SAndroid Build Coastguard Worker return scopeOrderMap[srcFilesInfo[i].ApiSurface] < scopeOrderMap[srcFilesInfo[j].ApiSurface] 2264*333d2b36SAndroid Build Coastguard Worker }) 2265*333d2b36SAndroid Build Coastguard Worker 2266*333d2b36SAndroid Build Coastguard Worker return srcFilesInfo 2267*333d2b36SAndroid Build Coastguard Worker} 2268*333d2b36SAndroid Build Coastguard Worker 2269*333d2b36SAndroid Build Coastguard Workervar validstubsType = []StubsType{Everything, Runtime, Exportable} 2270*333d2b36SAndroid Build Coastguard Worker 2271*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) validateProperties(ctx android.ModuleContext) { 2272*333d2b36SAndroid Build Coastguard Worker if al.properties.Stubs_type == nil { 2273*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("java_api_library module type must specify stubs_type property.") 2274*333d2b36SAndroid Build Coastguard Worker } else { 2275*333d2b36SAndroid Build Coastguard Worker al.stubsType = StringToStubsType(proptools.String(al.properties.Stubs_type)) 2276*333d2b36SAndroid Build Coastguard Worker } 2277*333d2b36SAndroid Build Coastguard Worker 2278*333d2b36SAndroid Build Coastguard Worker if !android.InList(al.stubsType, validstubsType) { 2279*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("stubs_type", "%s is not a valid stubs_type property value. "+ 2280*333d2b36SAndroid Build Coastguard Worker "Must be one of %s.", proptools.String(al.properties.Stubs_type), validstubsType) 2281*333d2b36SAndroid Build Coastguard Worker } 2282*333d2b36SAndroid Build Coastguard Worker} 2283*333d2b36SAndroid Build Coastguard Worker 2284*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 2285*333d2b36SAndroid Build Coastguard Worker al.validateProperties(ctx) 2286*333d2b36SAndroid Build Coastguard Worker 2287*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 2288*333d2b36SAndroid Build Coastguard Worker 2289*333d2b36SAndroid Build Coastguard Worker rule.Sbox(android.PathForModuleOut(ctx, "metalava"), 2290*333d2b36SAndroid Build Coastguard Worker android.PathForModuleOut(ctx, "metalava.sbox.textproto")). 2291*333d2b36SAndroid Build Coastguard Worker SandboxInputs() 2292*333d2b36SAndroid Build Coastguard Worker 2293*333d2b36SAndroid Build Coastguard Worker stubsDir := android.OptionalPathForPath(android.PathForModuleOut(ctx, "metalava", "stubsDir")) 2294*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm -rf").Text(stubsDir.String()) 2295*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Text(stubsDir.String()) 2296*333d2b36SAndroid Build Coastguard Worker 2297*333d2b36SAndroid Build Coastguard Worker homeDir := android.PathForModuleOut(ctx, "metalava", "home") 2298*333d2b36SAndroid Build Coastguard Worker 2299*333d2b36SAndroid Build Coastguard Worker var srcFilesInfo []JavaApiImportInfo 2300*333d2b36SAndroid Build Coastguard Worker var classPaths android.Paths 2301*333d2b36SAndroid Build Coastguard Worker var bootclassPaths android.Paths 2302*333d2b36SAndroid Build Coastguard Worker var staticLibs android.Paths 2303*333d2b36SAndroid Build Coastguard Worker var systemModulesPaths android.Paths 2304*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(dep android.Module) { 2305*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(dep) 2306*333d2b36SAndroid Build Coastguard Worker switch tag { 2307*333d2b36SAndroid Build Coastguard Worker case javaApiContributionTag: 2308*333d2b36SAndroid Build Coastguard Worker provider, _ := android.OtherModuleProvider(ctx, dep, JavaApiImportProvider) 2309*333d2b36SAndroid Build Coastguard Worker if provider.ApiFile == nil && !ctx.Config().AllowMissingDependencies() { 2310*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Error: %s has an empty api file.", dep.Name()) 2311*333d2b36SAndroid Build Coastguard Worker } 2312*333d2b36SAndroid Build Coastguard Worker srcFilesInfo = append(srcFilesInfo, provider) 2313*333d2b36SAndroid Build Coastguard Worker case libTag: 2314*333d2b36SAndroid Build Coastguard Worker if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok { 2315*333d2b36SAndroid Build Coastguard Worker classPaths = append(classPaths, provider.HeaderJars...) 2316*333d2b36SAndroid Build Coastguard Worker al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...) 2317*333d2b36SAndroid Build Coastguard Worker } 2318*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2319*333d2b36SAndroid Build Coastguard Worker if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok { 2320*333d2b36SAndroid Build Coastguard Worker bootclassPaths = append(bootclassPaths, provider.HeaderJars...) 2321*333d2b36SAndroid Build Coastguard Worker al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...) 2322*333d2b36SAndroid Build Coastguard Worker } 2323*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2324*333d2b36SAndroid Build Coastguard Worker if provider, ok := android.OtherModuleProvider(ctx, dep, JavaInfoProvider); ok { 2325*333d2b36SAndroid Build Coastguard Worker staticLibs = append(staticLibs, provider.HeaderJars...) 2326*333d2b36SAndroid Build Coastguard Worker al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.AconfigIntermediateCacheOutputPaths...) 2327*333d2b36SAndroid Build Coastguard Worker } 2328*333d2b36SAndroid Build Coastguard Worker case systemModulesTag: 2329*333d2b36SAndroid Build Coastguard Worker if sm, ok := android.OtherModuleProvider(ctx, dep, SystemModulesProvider); ok { 2330*333d2b36SAndroid Build Coastguard Worker systemModulesPaths = append(systemModulesPaths, sm.HeaderJars...) 2331*333d2b36SAndroid Build Coastguard Worker } 2332*333d2b36SAndroid Build Coastguard Worker case metalavaCurrentApiTimestampTag: 2333*333d2b36SAndroid Build Coastguard Worker if currentApiTimestampProvider, ok := dep.(currentApiTimestampProvider); ok { 2334*333d2b36SAndroid Build Coastguard Worker al.validationPaths = append(al.validationPaths, currentApiTimestampProvider.CurrentApiTimestamp()) 2335*333d2b36SAndroid Build Coastguard Worker } 2336*333d2b36SAndroid Build Coastguard Worker case aconfigDeclarationTag: 2337*333d2b36SAndroid Build Coastguard Worker if provider, ok := android.OtherModuleProvider(ctx, dep, android.AconfigDeclarationsProviderKey); ok { 2338*333d2b36SAndroid Build Coastguard Worker al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPath) 2339*333d2b36SAndroid Build Coastguard Worker } else if provider, ok := android.OtherModuleProvider(ctx, dep, android.CodegenInfoProvider); ok { 2340*333d2b36SAndroid Build Coastguard Worker al.aconfigProtoFiles = append(al.aconfigProtoFiles, provider.IntermediateCacheOutputPaths...) 2341*333d2b36SAndroid Build Coastguard Worker } else { 2342*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Only aconfig_declarations and aconfig_declarations_group "+ 2343*333d2b36SAndroid Build Coastguard Worker "module type is allowed for flags_packages property, but %s is neither "+ 2344*333d2b36SAndroid Build Coastguard Worker "of these supported module types", 2345*333d2b36SAndroid Build Coastguard Worker dep.Name(), 2346*333d2b36SAndroid Build Coastguard Worker ) 2347*333d2b36SAndroid Build Coastguard Worker } 2348*333d2b36SAndroid Build Coastguard Worker } 2349*333d2b36SAndroid Build Coastguard Worker }) 2350*333d2b36SAndroid Build Coastguard Worker 2351*333d2b36SAndroid Build Coastguard Worker srcFilesInfo = al.sortApiFilesByApiScope(ctx, srcFilesInfo) 2352*333d2b36SAndroid Build Coastguard Worker var srcFiles android.Paths 2353*333d2b36SAndroid Build Coastguard Worker for _, srcFileInfo := range srcFilesInfo { 2354*333d2b36SAndroid Build Coastguard Worker srcFiles = append(srcFiles, android.PathForSource(ctx, srcFileInfo.ApiFile.String())) 2355*333d2b36SAndroid Build Coastguard Worker } 2356*333d2b36SAndroid Build Coastguard Worker 2357*333d2b36SAndroid Build Coastguard Worker if srcFiles == nil && !ctx.Config().AllowMissingDependencies() { 2358*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("Error: %s has an empty api file.", ctx.ModuleName()) 2359*333d2b36SAndroid Build Coastguard Worker } 2360*333d2b36SAndroid Build Coastguard Worker 2361*333d2b36SAndroid Build Coastguard Worker configFiles := android.PathsForModuleSrc(ctx, al.properties.ConfigFiles) 2362*333d2b36SAndroid Build Coastguard Worker 2363*333d2b36SAndroid Build Coastguard Worker combinedPaths := append(([]android.Path)(nil), systemModulesPaths...) 2364*333d2b36SAndroid Build Coastguard Worker combinedPaths = append(combinedPaths, classPaths...) 2365*333d2b36SAndroid Build Coastguard Worker combinedPaths = append(combinedPaths, bootclassPaths...) 2366*333d2b36SAndroid Build Coastguard Worker cmd := metalavaStubCmd(ctx, rule, srcFiles, homeDir, combinedPaths, configFiles) 2367*333d2b36SAndroid Build Coastguard Worker 2368*333d2b36SAndroid Build Coastguard Worker al.stubsFlags(ctx, cmd, stubsDir) 2369*333d2b36SAndroid Build Coastguard Worker 2370*333d2b36SAndroid Build Coastguard Worker previousApi := String(al.properties.Previous_api) 2371*333d2b36SAndroid Build Coastguard Worker if previousApi != "" { 2372*333d2b36SAndroid Build Coastguard Worker previousApiFiles := android.PathsForModuleSrc(ctx, []string{previousApi}) 2373*333d2b36SAndroid Build Coastguard Worker cmd.FlagForEachInput("--migrate-nullness ", previousApiFiles) 2374*333d2b36SAndroid Build Coastguard Worker } 2375*333d2b36SAndroid Build Coastguard Worker 2376*333d2b36SAndroid Build Coastguard Worker al.addValidation(ctx, cmd, al.validationPaths) 2377*333d2b36SAndroid Build Coastguard Worker 2378*333d2b36SAndroid Build Coastguard Worker generateRevertAnnotationArgs(ctx, cmd, al.stubsType, al.aconfigProtoFiles) 2379*333d2b36SAndroid Build Coastguard Worker 2380*333d2b36SAndroid Build Coastguard Worker al.stubsSrcJar = android.PathForModuleOut(ctx, "metalava", ctx.ModuleName()+"-"+"stubs.srcjar") 2381*333d2b36SAndroid Build Coastguard Worker al.stubsJarWithoutStaticLibs = android.PathForModuleOut(ctx, "metalava", "stubs.jar") 2382*333d2b36SAndroid Build Coastguard Worker al.stubsJar = android.PathForModuleOut(ctx, ctx.ModuleName(), fmt.Sprintf("%s.jar", ctx.ModuleName())) 2383*333d2b36SAndroid Build Coastguard Worker 2384*333d2b36SAndroid Build Coastguard Worker rule.Command(). 2385*333d2b36SAndroid Build Coastguard Worker BuiltTool("soong_zip"). 2386*333d2b36SAndroid Build Coastguard Worker Flag("-write_if_changed"). 2387*333d2b36SAndroid Build Coastguard Worker Flag("-jar"). 2388*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", al.stubsSrcJar). 2389*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", stubsDir.String()). 2390*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-D ", stubsDir.String()) 2391*333d2b36SAndroid Build Coastguard Worker 2392*333d2b36SAndroid Build Coastguard Worker rule.Build("metalava", "metalava merged text") 2393*333d2b36SAndroid Build Coastguard Worker 2394*333d2b36SAndroid Build Coastguard Worker javacFlags := javaBuilderFlags{ 2395*333d2b36SAndroid Build Coastguard Worker javaVersion: getStubsJavaVersion(), 2396*333d2b36SAndroid Build Coastguard Worker javacFlags: strings.Join(al.properties.Javacflags, " "), 2397*333d2b36SAndroid Build Coastguard Worker classpath: classpath(classPaths), 2398*333d2b36SAndroid Build Coastguard Worker bootClasspath: classpath(append(systemModulesPaths, bootclassPaths...)), 2399*333d2b36SAndroid Build Coastguard Worker } 2400*333d2b36SAndroid Build Coastguard Worker 2401*333d2b36SAndroid Build Coastguard Worker annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar") 2402*333d2b36SAndroid Build Coastguard Worker 2403*333d2b36SAndroid Build Coastguard Worker TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{}, 2404*333d2b36SAndroid Build Coastguard Worker android.Paths{al.stubsSrcJar}, annoSrcJar, javacFlags, android.Paths{}) 2405*333d2b36SAndroid Build Coastguard Worker 2406*333d2b36SAndroid Build Coastguard Worker builder := android.NewRuleBuilder(pctx, ctx) 2407*333d2b36SAndroid Build Coastguard Worker builder.Command(). 2408*333d2b36SAndroid Build Coastguard Worker BuiltTool("merge_zips"). 2409*333d2b36SAndroid Build Coastguard Worker Output(al.stubsJar). 2410*333d2b36SAndroid Build Coastguard Worker Inputs(android.Paths{al.stubsJarWithoutStaticLibs}). 2411*333d2b36SAndroid Build Coastguard Worker Inputs(staticLibs) 2412*333d2b36SAndroid Build Coastguard Worker builder.Build("merge_zips", "merge jar files") 2413*333d2b36SAndroid Build Coastguard Worker 2414*333d2b36SAndroid Build Coastguard Worker // compile stubs to .dex for hiddenapi processing 2415*333d2b36SAndroid Build Coastguard Worker dexParams := &compileDexParams{ 2416*333d2b36SAndroid Build Coastguard Worker flags: javacFlags, 2417*333d2b36SAndroid Build Coastguard Worker sdkVersion: al.SdkVersion(ctx), 2418*333d2b36SAndroid Build Coastguard Worker minSdkVersion: al.MinSdkVersion(ctx), 2419*333d2b36SAndroid Build Coastguard Worker classesJar: al.stubsJar, 2420*333d2b36SAndroid Build Coastguard Worker jarName: ctx.ModuleName() + ".jar", 2421*333d2b36SAndroid Build Coastguard Worker } 2422*333d2b36SAndroid Build Coastguard Worker dexOutputFile, _ := al.dexer.compileDex(ctx, dexParams) 2423*333d2b36SAndroid Build Coastguard Worker uncompressed := true 2424*333d2b36SAndroid Build Coastguard Worker al.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), al.stubsJar, &uncompressed) 2425*333d2b36SAndroid Build Coastguard Worker dexOutputFile = al.hiddenAPIEncodeDex(ctx, dexOutputFile) 2426*333d2b36SAndroid Build Coastguard Worker al.dexJarFile = makeDexJarPathFromPath(dexOutputFile) 2427*333d2b36SAndroid Build Coastguard Worker 2428*333d2b36SAndroid Build Coastguard Worker ctx.Phony(ctx.ModuleName(), al.stubsJar) 2429*333d2b36SAndroid Build Coastguard Worker 2430*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ 2431*333d2b36SAndroid Build Coastguard Worker HeaderJars: android.PathsIfNonNil(al.stubsJar), 2432*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars: android.PathsIfNonNil(al.stubsJar), 2433*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars: depset.New(depset.PREORDER, android.PathsIfNonNil(al.stubsJar), nil), 2434*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsImplementationJars: depset.New(depset.PREORDER, android.PathsIfNonNil(al.stubsJar), nil), 2435*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars: android.PathsIfNonNil(al.stubsJar), 2436*333d2b36SAndroid Build Coastguard Worker ImplementationJars: android.PathsIfNonNil(al.stubsJar), 2437*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs: android.Paths{}, 2438*333d2b36SAndroid Build Coastguard Worker StubsLinkType: Stubs, 2439*333d2b36SAndroid Build Coastguard Worker // No aconfig libraries on api libraries 2440*333d2b36SAndroid Build Coastguard Worker }) 2441*333d2b36SAndroid Build Coastguard Worker} 2442*333d2b36SAndroid Build Coastguard Worker 2443*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { 2444*333d2b36SAndroid Build Coastguard Worker return al.dexJarFile 2445*333d2b36SAndroid Build Coastguard Worker} 2446*333d2b36SAndroid Build Coastguard Worker 2447*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) DexJarInstallPath() android.Path { 2448*333d2b36SAndroid Build Coastguard Worker return al.dexJarFile.Path() 2449*333d2b36SAndroid Build Coastguard Worker} 2450*333d2b36SAndroid Build Coastguard Worker 2451*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { 2452*333d2b36SAndroid Build Coastguard Worker return nil 2453*333d2b36SAndroid Build Coastguard Worker} 2454*333d2b36SAndroid Build Coastguard Worker 2455*333d2b36SAndroid Build Coastguard Worker// Most java_api_library constitues the sdk, but there are some java_api_library that 2456*333d2b36SAndroid Build Coastguard Worker// does not contribute to the api surface. Such modules are allowed to set sdk_version 2457*333d2b36SAndroid Build Coastguard Worker// other than "none" 2458*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { 2459*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecFrom(ctx, proptools.String(al.properties.Sdk_version)) 2460*333d2b36SAndroid Build Coastguard Worker} 2461*333d2b36SAndroid Build Coastguard Worker 2462*333d2b36SAndroid Build Coastguard Worker// java_api_library is always at "current". Return FutureApiLevel 2463*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 2464*333d2b36SAndroid Build Coastguard Worker return al.SdkVersion(ctx).ApiLevel 2465*333d2b36SAndroid Build Coastguard Worker} 2466*333d2b36SAndroid Build Coastguard Worker 2467*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel { 2468*333d2b36SAndroid Build Coastguard Worker return al.SdkVersion(ctx).ApiLevel 2469*333d2b36SAndroid Build Coastguard Worker} 2470*333d2b36SAndroid Build Coastguard Worker 2471*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) SystemModules() string { 2472*333d2b36SAndroid Build Coastguard Worker return proptools.String(al.properties.System_modules) 2473*333d2b36SAndroid Build Coastguard Worker} 2474*333d2b36SAndroid Build Coastguard Worker 2475*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 2476*333d2b36SAndroid Build Coastguard Worker return al.SdkVersion(ctx).ApiLevel 2477*333d2b36SAndroid Build Coastguard Worker} 2478*333d2b36SAndroid Build Coastguard Worker 2479*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) IDEInfo(ctx android.BaseModuleContext, i *android.IdeInfo) { 2480*333d2b36SAndroid Build Coastguard Worker i.Deps = append(i.Deps, al.ideDeps(ctx)...) 2481*333d2b36SAndroid Build Coastguard Worker i.Libs = append(i.Libs, al.properties.Libs.GetOrDefault(ctx, nil)...) 2482*333d2b36SAndroid Build Coastguard Worker i.Static_libs = append(i.Static_libs, al.properties.Static_libs.GetOrDefault(ctx, nil)...) 2483*333d2b36SAndroid Build Coastguard Worker i.SrcJars = append(i.SrcJars, al.stubsSrcJar.String()) 2484*333d2b36SAndroid Build Coastguard Worker} 2485*333d2b36SAndroid Build Coastguard Worker 2486*333d2b36SAndroid Build Coastguard Worker// deps of java_api_library for module_bp_java_deps.json 2487*333d2b36SAndroid Build Coastguard Workerfunc (al *ApiLibrary) ideDeps(ctx android.BaseModuleContext) []string { 2488*333d2b36SAndroid Build Coastguard Worker ret := []string{} 2489*333d2b36SAndroid Build Coastguard Worker ret = append(ret, al.properties.Libs.GetOrDefault(ctx, nil)...) 2490*333d2b36SAndroid Build Coastguard Worker ret = append(ret, al.properties.Static_libs.GetOrDefault(ctx, nil)...) 2491*333d2b36SAndroid Build Coastguard Worker if proptools.StringDefault(al.properties.System_modules, "none") != "none" { 2492*333d2b36SAndroid Build Coastguard Worker ret = append(ret, proptools.String(al.properties.System_modules)) 2493*333d2b36SAndroid Build Coastguard Worker } 2494*333d2b36SAndroid Build Coastguard Worker // Other non java_library dependencies like java_api_contribution are ignored for now. 2495*333d2b36SAndroid Build Coastguard Worker return ret 2496*333d2b36SAndroid Build Coastguard Worker} 2497*333d2b36SAndroid Build Coastguard Worker 2498*333d2b36SAndroid Build Coastguard Worker// implement the following interfaces for hiddenapi processing 2499*333d2b36SAndroid Build Coastguard Workervar _ hiddenAPIModule = (*ApiLibrary)(nil) 2500*333d2b36SAndroid Build Coastguard Workervar _ UsesLibraryDependency = (*ApiLibrary)(nil) 2501*333d2b36SAndroid Build Coastguard Workervar _ android.SdkContext = (*ApiLibrary)(nil) 2502*333d2b36SAndroid Build Coastguard Worker 2503*333d2b36SAndroid Build Coastguard Worker// implement the following interface for IDE completion. 2504*333d2b36SAndroid Build Coastguard Workervar _ android.IDEInfo = (*ApiLibrary)(nil) 2505*333d2b36SAndroid Build Coastguard Worker 2506*333d2b36SAndroid Build Coastguard Worker// 2507*333d2b36SAndroid Build Coastguard Worker// Java prebuilts 2508*333d2b36SAndroid Build Coastguard Worker// 2509*333d2b36SAndroid Build Coastguard Worker 2510*333d2b36SAndroid Build Coastguard Workertype ImportProperties struct { 2511*333d2b36SAndroid Build Coastguard Worker Jars []string `android:"path,arch_variant"` 2512*333d2b36SAndroid Build Coastguard Worker 2513*333d2b36SAndroid Build Coastguard Worker // The version of the SDK that the source prebuilt file was built against. Defaults to the 2514*333d2b36SAndroid Build Coastguard Worker // current version if not specified. 2515*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 2516*333d2b36SAndroid Build Coastguard Worker 2517*333d2b36SAndroid Build Coastguard Worker // The minimum version of the SDK that this module supports. Defaults to sdk_version if not 2518*333d2b36SAndroid Build Coastguard Worker // specified. 2519*333d2b36SAndroid Build Coastguard Worker Min_sdk_version *string 2520*333d2b36SAndroid Build Coastguard Worker 2521*333d2b36SAndroid Build Coastguard Worker // The max sdk version placeholder used to replace maxSdkVersion attributes on permission 2522*333d2b36SAndroid Build Coastguard Worker // and uses-permission tags in manifest_fixer. 2523*333d2b36SAndroid Build Coastguard Worker Replace_max_sdk_version_placeholder *string 2524*333d2b36SAndroid Build Coastguard Worker 2525*333d2b36SAndroid Build Coastguard Worker Installable *bool 2526*333d2b36SAndroid Build Coastguard Worker 2527*333d2b36SAndroid Build Coastguard Worker // If not empty, classes are restricted to the specified packages and their sub-packages. 2528*333d2b36SAndroid Build Coastguard Worker Permitted_packages []string 2529*333d2b36SAndroid Build Coastguard Worker 2530*333d2b36SAndroid Build Coastguard Worker // List of shared java libs that this module has dependencies to 2531*333d2b36SAndroid Build Coastguard Worker Libs []string 2532*333d2b36SAndroid Build Coastguard Worker 2533*333d2b36SAndroid Build Coastguard Worker // List of static java libs that this module has dependencies to 2534*333d2b36SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] 2535*333d2b36SAndroid Build Coastguard Worker 2536*333d2b36SAndroid Build Coastguard Worker // List of files to remove from the jar file(s) 2537*333d2b36SAndroid Build Coastguard Worker Exclude_files []string 2538*333d2b36SAndroid Build Coastguard Worker 2539*333d2b36SAndroid Build Coastguard Worker // List of directories to remove from the jar file(s) 2540*333d2b36SAndroid Build Coastguard Worker Exclude_dirs []string 2541*333d2b36SAndroid Build Coastguard Worker 2542*333d2b36SAndroid Build Coastguard Worker // if set to true, run Jetifier against .jar file. Defaults to false. 2543*333d2b36SAndroid Build Coastguard Worker Jetifier *bool 2544*333d2b36SAndroid Build Coastguard Worker 2545*333d2b36SAndroid Build Coastguard Worker // set the name of the output 2546*333d2b36SAndroid Build Coastguard Worker Stem *string 2547*333d2b36SAndroid Build Coastguard Worker 2548*333d2b36SAndroid Build Coastguard Worker Aidl struct { 2549*333d2b36SAndroid Build Coastguard Worker // directories that should be added as include directories for any aidl sources of modules 2550*333d2b36SAndroid Build Coastguard Worker // that depend on this module, as well as to aidl for this module. 2551*333d2b36SAndroid Build Coastguard Worker Export_include_dirs []string 2552*333d2b36SAndroid Build Coastguard Worker } 2553*333d2b36SAndroid Build Coastguard Worker 2554*333d2b36SAndroid Build Coastguard Worker // Name of the source soong module that gets shadowed by this prebuilt 2555*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source module of 2556*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 2557*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 2558*333d2b36SAndroid Build Coastguard Worker 2559*333d2b36SAndroid Build Coastguard Worker // Non-nil if this java_import module was dynamically created by a java_sdk_library_import 2560*333d2b36SAndroid Build Coastguard Worker // The name is the undecorated name of the java_sdk_library as it appears in the blueprint file 2561*333d2b36SAndroid Build Coastguard Worker // (without any prebuilt_ prefix) 2562*333d2b36SAndroid Build Coastguard Worker Created_by_java_sdk_library_name *string `blueprint:"mutated"` 2563*333d2b36SAndroid Build Coastguard Worker 2564*333d2b36SAndroid Build Coastguard Worker // Property signifying whether the module provides stubs jar or not. 2565*333d2b36SAndroid Build Coastguard Worker Is_stubs_module *bool 2566*333d2b36SAndroid Build Coastguard Worker} 2567*333d2b36SAndroid Build Coastguard Worker 2568*333d2b36SAndroid Build Coastguard Workertype Import struct { 2569*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 2570*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 2571*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 2572*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 2573*333d2b36SAndroid Build Coastguard Worker 2574*333d2b36SAndroid Build Coastguard Worker // Functionality common to Module and Import. 2575*333d2b36SAndroid Build Coastguard Worker embeddableInModuleAndImport 2576*333d2b36SAndroid Build Coastguard Worker 2577*333d2b36SAndroid Build Coastguard Worker hiddenAPI 2578*333d2b36SAndroid Build Coastguard Worker dexer 2579*333d2b36SAndroid Build Coastguard Worker dexpreopter 2580*333d2b36SAndroid Build Coastguard Worker 2581*333d2b36SAndroid Build Coastguard Worker properties ImportProperties 2582*333d2b36SAndroid Build Coastguard Worker 2583*333d2b36SAndroid Build Coastguard Worker // output file containing classes.dex and resources 2584*333d2b36SAndroid Build Coastguard Worker dexJarFile OptionalDexJarPath 2585*333d2b36SAndroid Build Coastguard Worker dexJarFileErr error 2586*333d2b36SAndroid Build Coastguard Worker dexJarInstallFile android.Path 2587*333d2b36SAndroid Build Coastguard Worker 2588*333d2b36SAndroid Build Coastguard Worker combinedImplementationFile android.Path 2589*333d2b36SAndroid Build Coastguard Worker combinedHeaderFile android.Path 2590*333d2b36SAndroid Build Coastguard Worker classLoaderContexts dexpreopt.ClassLoaderContextMap 2591*333d2b36SAndroid Build Coastguard Worker exportAidlIncludeDirs android.Paths 2592*333d2b36SAndroid Build Coastguard Worker 2593*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 2594*333d2b36SAndroid Build Coastguard Worker 2595*333d2b36SAndroid Build Coastguard Worker sdkVersion android.SdkSpec 2596*333d2b36SAndroid Build Coastguard Worker minSdkVersion android.ApiLevel 2597*333d2b36SAndroid Build Coastguard Worker 2598*333d2b36SAndroid Build Coastguard Worker stubsLinkType StubsLinkType 2599*333d2b36SAndroid Build Coastguard Worker} 2600*333d2b36SAndroid Build Coastguard Worker 2601*333d2b36SAndroid Build Coastguard Workervar _ PermittedPackagesForUpdatableBootJars = (*Import)(nil) 2602*333d2b36SAndroid Build Coastguard Worker 2603*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) PermittedPackagesForUpdatableBootJars() []string { 2604*333d2b36SAndroid Build Coastguard Worker return j.properties.Permitted_packages 2605*333d2b36SAndroid Build Coastguard Worker} 2606*333d2b36SAndroid Build Coastguard Worker 2607*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { 2608*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecFrom(ctx, String(j.properties.Sdk_version)) 2609*333d2b36SAndroid Build Coastguard Worker} 2610*333d2b36SAndroid Build Coastguard Worker 2611*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) SystemModules() string { 2612*333d2b36SAndroid Build Coastguard Worker return "none" 2613*333d2b36SAndroid Build Coastguard Worker} 2614*333d2b36SAndroid Build Coastguard Worker 2615*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 2616*333d2b36SAndroid Build Coastguard Worker if j.properties.Min_sdk_version != nil { 2617*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.properties.Min_sdk_version) 2618*333d2b36SAndroid Build Coastguard Worker } 2619*333d2b36SAndroid Build Coastguard Worker return j.SdkVersion(ctx).ApiLevel 2620*333d2b36SAndroid Build Coastguard Worker} 2621*333d2b36SAndroid Build Coastguard Worker 2622*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ReplaceMaxSdkVersionPlaceholder(ctx android.EarlyModuleContext) android.ApiLevel { 2623*333d2b36SAndroid Build Coastguard Worker if j.properties.Replace_max_sdk_version_placeholder != nil { 2624*333d2b36SAndroid Build Coastguard Worker return android.ApiLevelFrom(ctx, *j.properties.Replace_max_sdk_version_placeholder) 2625*333d2b36SAndroid Build Coastguard Worker } 2626*333d2b36SAndroid Build Coastguard Worker // Default is PrivateApiLevel 2627*333d2b36SAndroid Build Coastguard Worker return android.SdkSpecPrivate.ApiLevel 2628*333d2b36SAndroid Build Coastguard Worker} 2629*333d2b36SAndroid Build Coastguard Worker 2630*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) TargetSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { 2631*333d2b36SAndroid Build Coastguard Worker return j.SdkVersion(ctx).ApiLevel 2632*333d2b36SAndroid Build Coastguard Worker} 2633*333d2b36SAndroid Build Coastguard Worker 2634*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Prebuilt() *android.Prebuilt { 2635*333d2b36SAndroid Build Coastguard Worker return &j.prebuilt 2636*333d2b36SAndroid Build Coastguard Worker} 2637*333d2b36SAndroid Build Coastguard Worker 2638*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) PrebuiltSrcs() []string { 2639*333d2b36SAndroid Build Coastguard Worker return j.properties.Jars 2640*333d2b36SAndroid Build Coastguard Worker} 2641*333d2b36SAndroid Build Coastguard Worker 2642*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) BaseModuleName() string { 2643*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(j.properties.Source_module_name, j.ModuleBase.Name()) 2644*333d2b36SAndroid Build Coastguard Worker} 2645*333d2b36SAndroid Build Coastguard Worker 2646*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Name() string { 2647*333d2b36SAndroid Build Coastguard Worker return j.prebuilt.Name(j.ModuleBase.Name()) 2648*333d2b36SAndroid Build Coastguard Worker} 2649*333d2b36SAndroid Build Coastguard Worker 2650*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) Stem() string { 2651*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(j.properties.Stem, j.BaseModuleName()) 2652*333d2b36SAndroid Build Coastguard Worker} 2653*333d2b36SAndroid Build Coastguard Worker 2654*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) CreatedByJavaSdkLibraryName() *string { 2655*333d2b36SAndroid Build Coastguard Worker return j.properties.Created_by_java_sdk_library_name 2656*333d2b36SAndroid Build Coastguard Worker} 2657*333d2b36SAndroid Build Coastguard Worker 2658*333d2b36SAndroid Build Coastguard Workerfunc (a *Import) JacocoReportClassesFile() android.Path { 2659*333d2b36SAndroid Build Coastguard Worker return nil 2660*333d2b36SAndroid Build Coastguard Worker} 2661*333d2b36SAndroid Build Coastguard Worker 2662*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DepsMutator(ctx android.BottomUpMutatorContext) { 2663*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...) 2664*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs.GetOrDefault(ctx, nil)...) 2665*333d2b36SAndroid Build Coastguard Worker 2666*333d2b36SAndroid Build Coastguard Worker if ctx.Device() && Bool(j.dexProperties.Compile_dex) { 2667*333d2b36SAndroid Build Coastguard Worker sdkDeps(ctx, android.SdkContext(j), j.dexer) 2668*333d2b36SAndroid Build Coastguard Worker } 2669*333d2b36SAndroid Build Coastguard Worker} 2670*333d2b36SAndroid Build Coastguard Worker 2671*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) commonBuildActions(ctx android.ModuleContext) { 2672*333d2b36SAndroid Build Coastguard Worker j.sdkVersion = j.SdkVersion(ctx) 2673*333d2b36SAndroid Build Coastguard Worker j.minSdkVersion = j.MinSdkVersion(ctx) 2674*333d2b36SAndroid Build Coastguard Worker 2675*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 2676*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 2677*333d2b36SAndroid Build Coastguard Worker j.hideApexVariantFromMake = true 2678*333d2b36SAndroid Build Coastguard Worker } 2679*333d2b36SAndroid Build Coastguard Worker 2680*333d2b36SAndroid Build Coastguard Worker if ctx.Windows() { 2681*333d2b36SAndroid Build Coastguard Worker j.HideFromMake() 2682*333d2b36SAndroid Build Coastguard Worker } 2683*333d2b36SAndroid Build Coastguard Worker 2684*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(j.properties.Is_stubs_module) { 2685*333d2b36SAndroid Build Coastguard Worker j.stubsLinkType = Stubs 2686*333d2b36SAndroid Build Coastguard Worker } else { 2687*333d2b36SAndroid Build Coastguard Worker j.stubsLinkType = Implementation 2688*333d2b36SAndroid Build Coastguard Worker } 2689*333d2b36SAndroid Build Coastguard Worker} 2690*333d2b36SAndroid Build Coastguard Worker 2691*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { 2692*333d2b36SAndroid Build Coastguard Worker j.commonBuildActions(ctx) 2693*333d2b36SAndroid Build Coastguard Worker 2694*333d2b36SAndroid Build Coastguard Worker j.classLoaderContexts = make(dexpreopt.ClassLoaderContextMap) 2695*333d2b36SAndroid Build Coastguard Worker 2696*333d2b36SAndroid Build Coastguard Worker var flags javaBuilderFlags 2697*333d2b36SAndroid Build Coastguard Worker 2698*333d2b36SAndroid Build Coastguard Worker var transitiveClasspathHeaderJars []depset.DepSet[android.Path] 2699*333d2b36SAndroid Build Coastguard Worker var transitiveBootClasspathHeaderJars []depset.DepSet[android.Path] 2700*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsHeaderJars []depset.DepSet[android.Path] 2701*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsImplementationJars []depset.DepSet[android.Path] 2702*333d2b36SAndroid Build Coastguard Worker var transitiveStaticLibsResourceJars []depset.DepSet[android.Path] 2703*333d2b36SAndroid Build Coastguard Worker 2704*333d2b36SAndroid Build Coastguard Worker j.collectTransitiveHeaderJarsForR8(ctx) 2705*333d2b36SAndroid Build Coastguard Worker var staticJars android.Paths 2706*333d2b36SAndroid Build Coastguard Worker var staticResourceJars android.Paths 2707*333d2b36SAndroid Build Coastguard Worker var staticHeaderJars android.Paths 2708*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module android.Module) { 2709*333d2b36SAndroid Build Coastguard Worker tag := ctx.OtherModuleDependencyTag(module) 2710*333d2b36SAndroid Build Coastguard Worker if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 2711*333d2b36SAndroid Build Coastguard Worker switch tag { 2712*333d2b36SAndroid Build Coastguard Worker case libTag, sdkLibTag: 2713*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(flags.classpath, dep.HeaderJars...) 2714*333d2b36SAndroid Build Coastguard Worker flags.dexClasspath = append(flags.dexClasspath, dep.HeaderJars...) 2715*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2716*333d2b36SAndroid Build Coastguard Worker case staticLibTag: 2717*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(flags.classpath, dep.HeaderJars...) 2718*333d2b36SAndroid Build Coastguard Worker staticJars = append(staticJars, dep.ImplementationJars...) 2719*333d2b36SAndroid Build Coastguard Worker staticResourceJars = append(staticResourceJars, dep.ResourceJars...) 2720*333d2b36SAndroid Build Coastguard Worker staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...) 2721*333d2b36SAndroid Build Coastguard Worker transitiveClasspathHeaderJars = append(transitiveClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2722*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsHeaderJars = append(transitiveStaticLibsHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2723*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsImplementationJars = append(transitiveStaticLibsImplementationJars, dep.TransitiveStaticLibsImplementationJars) 2724*333d2b36SAndroid Build Coastguard Worker transitiveStaticLibsResourceJars = append(transitiveStaticLibsResourceJars, dep.TransitiveStaticLibsResourceJars) 2725*333d2b36SAndroid Build Coastguard Worker case bootClasspathTag: 2726*333d2b36SAndroid Build Coastguard Worker flags.bootClasspath = append(flags.bootClasspath, dep.HeaderJars...) 2727*333d2b36SAndroid Build Coastguard Worker transitiveBootClasspathHeaderJars = append(transitiveBootClasspathHeaderJars, dep.TransitiveStaticLibsHeaderJars) 2728*333d2b36SAndroid Build Coastguard Worker } 2729*333d2b36SAndroid Build Coastguard Worker } else if _, ok := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider); ok { 2730*333d2b36SAndroid Build Coastguard Worker switch tag { 2731*333d2b36SAndroid Build Coastguard Worker case libTag, sdkLibTag: 2732*333d2b36SAndroid Build Coastguard Worker sdkInfo, _ := android.OtherModuleProvider(ctx, module, SdkLibraryInfoProvider) 2733*333d2b36SAndroid Build Coastguard Worker generatingLibsString := android.PrettyConcat( 2734*333d2b36SAndroid Build Coastguard Worker getGeneratingLibs(ctx, j.SdkVersion(ctx), module.Name(), sdkInfo), true, "or") 2735*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("cannot depend directly on java_sdk_library %q; try depending on %s instead", module.Name(), generatingLibsString) 2736*333d2b36SAndroid Build Coastguard Worker } 2737*333d2b36SAndroid Build Coastguard Worker } 2738*333d2b36SAndroid Build Coastguard Worker 2739*333d2b36SAndroid Build Coastguard Worker addCLCFromDep(ctx, module, j.classLoaderContexts) 2740*333d2b36SAndroid Build Coastguard Worker }) 2741*333d2b36SAndroid Build Coastguard Worker 2742*333d2b36SAndroid Build Coastguard Worker localJars := android.PathsForModuleSrc(ctx, j.properties.Jars) 2743*333d2b36SAndroid Build Coastguard Worker jarName := j.Stem() + ".jar" 2744*333d2b36SAndroid Build Coastguard Worker 2745*333d2b36SAndroid Build Coastguard Worker // Combine only the local jars together for use in transitive classpaths. 2746*333d2b36SAndroid Build Coastguard Worker // Always pass input jar through TransformJarsToJar to strip module-info.class from prebuilts. 2747*333d2b36SAndroid Build Coastguard Worker localCombinedHeaderJar := android.PathForModuleOut(ctx, "local-combined", jarName) 2748*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, localCombinedHeaderJar, "combine local prebuilt implementation jars", localJars, android.OptionalPath{}, 2749*333d2b36SAndroid Build Coastguard Worker false, j.properties.Exclude_files, j.properties.Exclude_dirs) 2750*333d2b36SAndroid Build Coastguard Worker localStrippedJars := android.Paths{localCombinedHeaderJar} 2751*333d2b36SAndroid Build Coastguard Worker 2752*333d2b36SAndroid Build Coastguard Worker completeStaticLibsHeaderJars := depset.New(depset.PREORDER, localStrippedJars, transitiveStaticLibsHeaderJars) 2753*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars := depset.New(depset.PREORDER, localStrippedJars, transitiveStaticLibsImplementationJars) 2754*333d2b36SAndroid Build Coastguard Worker completeStaticLibsResourceJars := depset.New(depset.PREORDER, nil, transitiveStaticLibsResourceJars) 2755*333d2b36SAndroid Build Coastguard Worker 2756*333d2b36SAndroid Build Coastguard Worker // Always pass the input jars to TransformJarsToJar, even if there is only a single jar, we need the output 2757*333d2b36SAndroid Build Coastguard Worker // file of the module to be named jarName. 2758*333d2b36SAndroid Build Coastguard Worker var outputFile android.Path 2759*333d2b36SAndroid Build Coastguard Worker combinedImplementationJar := android.PathForModuleOut(ctx, "combined", jarName) 2760*333d2b36SAndroid Build Coastguard Worker var implementationJars android.Paths 2761*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 2762*333d2b36SAndroid Build Coastguard Worker implementationJars = completeStaticLibsImplementationJars.ToList() 2763*333d2b36SAndroid Build Coastguard Worker } else { 2764*333d2b36SAndroid Build Coastguard Worker implementationJars = append(slices.Clone(localJars), staticJars...) 2765*333d2b36SAndroid Build Coastguard Worker } 2766*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedImplementationJar, "combine prebuilt implementation jars", implementationJars, android.OptionalPath{}, 2767*333d2b36SAndroid Build Coastguard Worker false, j.properties.Exclude_files, j.properties.Exclude_dirs) 2768*333d2b36SAndroid Build Coastguard Worker outputFile = combinedImplementationJar 2769*333d2b36SAndroid Build Coastguard Worker 2770*333d2b36SAndroid Build Coastguard Worker // If no dependencies have separate header jars then there is no need to create a separate 2771*333d2b36SAndroid Build Coastguard Worker // header jar for this module. 2772*333d2b36SAndroid Build Coastguard Worker reuseImplementationJarAsHeaderJar := slices.Equal(staticJars, staticHeaderJars) 2773*333d2b36SAndroid Build Coastguard Worker 2774*333d2b36SAndroid Build Coastguard Worker var resourceJarFile android.Path 2775*333d2b36SAndroid Build Coastguard Worker if len(staticResourceJars) > 1 { 2776*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName) 2777*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{}, 2778*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 2779*333d2b36SAndroid Build Coastguard Worker resourceJarFile = combinedJar 2780*333d2b36SAndroid Build Coastguard Worker } else if len(staticResourceJars) == 1 { 2781*333d2b36SAndroid Build Coastguard Worker resourceJarFile = staticResourceJars[0] 2782*333d2b36SAndroid Build Coastguard Worker } 2783*333d2b36SAndroid Build Coastguard Worker 2784*333d2b36SAndroid Build Coastguard Worker var headerJar android.Path 2785*333d2b36SAndroid Build Coastguard Worker if reuseImplementationJarAsHeaderJar { 2786*333d2b36SAndroid Build Coastguard Worker headerJar = outputFile 2787*333d2b36SAndroid Build Coastguard Worker } else { 2788*333d2b36SAndroid Build Coastguard Worker var headerJars android.Paths 2789*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 2790*333d2b36SAndroid Build Coastguard Worker headerJars = completeStaticLibsHeaderJars.ToList() 2791*333d2b36SAndroid Build Coastguard Worker } else { 2792*333d2b36SAndroid Build Coastguard Worker headerJars = append(slices.Clone(localJars), staticHeaderJars...) 2793*333d2b36SAndroid Build Coastguard Worker } 2794*333d2b36SAndroid Build Coastguard Worker headerOutputFile := android.PathForModuleOut(ctx, "turbine-combined", jarName) 2795*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, headerOutputFile, "combine prebuilt header jars", headerJars, android.OptionalPath{}, 2796*333d2b36SAndroid Build Coastguard Worker false, j.properties.Exclude_files, j.properties.Exclude_dirs) 2797*333d2b36SAndroid Build Coastguard Worker headerJar = headerOutputFile 2798*333d2b36SAndroid Build Coastguard Worker } 2799*333d2b36SAndroid Build Coastguard Worker 2800*333d2b36SAndroid Build Coastguard Worker if Bool(j.properties.Jetifier) { 2801*333d2b36SAndroid Build Coastguard Worker jetifierOutputFile := android.PathForModuleOut(ctx, "jetifier", jarName) 2802*333d2b36SAndroid Build Coastguard Worker TransformJetifier(ctx, jetifierOutputFile, outputFile) 2803*333d2b36SAndroid Build Coastguard Worker outputFile = jetifierOutputFile 2804*333d2b36SAndroid Build Coastguard Worker 2805*333d2b36SAndroid Build Coastguard Worker if !reuseImplementationJarAsHeaderJar { 2806*333d2b36SAndroid Build Coastguard Worker jetifierHeaderJar := android.PathForModuleOut(ctx, "jetifier-headers", jarName) 2807*333d2b36SAndroid Build Coastguard Worker TransformJetifier(ctx, jetifierHeaderJar, headerJar) 2808*333d2b36SAndroid Build Coastguard Worker headerJar = jetifierHeaderJar 2809*333d2b36SAndroid Build Coastguard Worker } else { 2810*333d2b36SAndroid Build Coastguard Worker headerJar = outputFile 2811*333d2b36SAndroid Build Coastguard Worker } 2812*333d2b36SAndroid Build Coastguard Worker 2813*333d2b36SAndroid Build Coastguard Worker // Enabling jetifier requires modifying classes from transitive dependencies, disable transitive 2814*333d2b36SAndroid Build Coastguard Worker // classpath and use the combined header jar instead. 2815*333d2b36SAndroid Build Coastguard Worker completeStaticLibsHeaderJars = depset.New(depset.PREORDER, android.Paths{headerJar}, nil) 2816*333d2b36SAndroid Build Coastguard Worker completeStaticLibsImplementationJars = depset.New(depset.PREORDER, android.Paths{outputFile}, nil) 2817*333d2b36SAndroid Build Coastguard Worker } 2818*333d2b36SAndroid Build Coastguard Worker 2819*333d2b36SAndroid Build Coastguard Worker implementationJarFile := outputFile 2820*333d2b36SAndroid Build Coastguard Worker 2821*333d2b36SAndroid Build Coastguard Worker // merge implementation jar with resources if necessary 2822*333d2b36SAndroid Build Coastguard Worker if resourceJarFile != nil { 2823*333d2b36SAndroid Build Coastguard Worker jars := android.Paths{resourceJarFile, outputFile} 2824*333d2b36SAndroid Build Coastguard Worker combinedJar := android.PathForModuleOut(ctx, "withres", jarName) 2825*333d2b36SAndroid Build Coastguard Worker TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{}, 2826*333d2b36SAndroid Build Coastguard Worker false, nil, nil) 2827*333d2b36SAndroid Build Coastguard Worker outputFile = combinedJar 2828*333d2b36SAndroid Build Coastguard Worker } 2829*333d2b36SAndroid Build Coastguard Worker 2830*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. 2831*333d2b36SAndroid Build Coastguard Worker // Also strip the relative path from the header output file so that the reuseImplementationJarAsHeaderJar check 2832*333d2b36SAndroid Build Coastguard Worker // in a module that depends on this module considers them equal. 2833*333d2b36SAndroid Build Coastguard Worker j.combinedHeaderFile = headerJar.WithoutRel() 2834*333d2b36SAndroid Build Coastguard Worker j.combinedImplementationFile = outputFile.WithoutRel() 2835*333d2b36SAndroid Build Coastguard Worker 2836*333d2b36SAndroid Build Coastguard Worker j.maybeInstall(ctx, jarName, outputFile) 2837*333d2b36SAndroid Build Coastguard Worker 2838*333d2b36SAndroid Build Coastguard Worker j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Aidl.Export_include_dirs) 2839*333d2b36SAndroid Build Coastguard Worker 2840*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UseTransitiveJarsInClasspath() { 2841*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(localJars...) 2842*333d2b36SAndroid Build Coastguard Worker } else { 2843*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(outputFile) 2844*333d2b36SAndroid Build Coastguard Worker } 2845*333d2b36SAndroid Build Coastguard Worker 2846*333d2b36SAndroid Build Coastguard Worker if ctx.Device() { 2847*333d2b36SAndroid Build Coastguard Worker // Shared libraries deapexed from prebuilt apexes are no longer supported. 2848*333d2b36SAndroid Build Coastguard Worker // Set the dexJarBuildPath to a fake path. 2849*333d2b36SAndroid Build Coastguard Worker // This allows soong analysis pass, but will be an error during ninja execution if there are 2850*333d2b36SAndroid Build Coastguard Worker // any rdeps. 2851*333d2b36SAndroid Build Coastguard Worker ai, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 2852*333d2b36SAndroid Build Coastguard Worker if ai.ForPrebuiltApex { 2853*333d2b36SAndroid Build Coastguard Worker j.dexJarFile = makeDexJarPathFromPath(android.PathForModuleInstall(ctx, "intentionally_no_longer_supported")) 2854*333d2b36SAndroid Build Coastguard Worker j.initHiddenAPI(ctx, j.dexJarFile, outputFile, j.dexProperties.Uncompress_dex) 2855*333d2b36SAndroid Build Coastguard Worker } else if Bool(j.dexProperties.Compile_dex) { 2856*333d2b36SAndroid Build Coastguard Worker sdkDep := decodeSdkDep(ctx, android.SdkContext(j)) 2857*333d2b36SAndroid Build Coastguard Worker if sdkDep.invalidVersion { 2858*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies(sdkDep.bootclasspath) 2859*333d2b36SAndroid Build Coastguard Worker ctx.AddMissingDependencies(sdkDep.java9Classpath) 2860*333d2b36SAndroid Build Coastguard Worker } else if sdkDep.useFiles { 2861*333d2b36SAndroid Build Coastguard Worker // sdkDep.jar is actually equivalent to turbine header.jar. 2862*333d2b36SAndroid Build Coastguard Worker flags.classpath = append(flags.classpath, sdkDep.jars...) 2863*333d2b36SAndroid Build Coastguard Worker } 2864*333d2b36SAndroid Build Coastguard Worker 2865*333d2b36SAndroid Build Coastguard Worker // Dex compilation 2866*333d2b36SAndroid Build Coastguard Worker 2867*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.installPath = j.dexpreopter.getInstallPath( 2868*333d2b36SAndroid Build Coastguard Worker ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), android.PathForModuleInstall(ctx, "framework", jarName)) 2869*333d2b36SAndroid Build Coastguard Worker setUncompressDex(ctx, &j.dexpreopter, &j.dexer) 2870*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.uncompressedDex = *j.dexProperties.Uncompress_dex 2871*333d2b36SAndroid Build Coastguard Worker 2872*333d2b36SAndroid Build Coastguard Worker var dexOutputFile android.Path 2873*333d2b36SAndroid Build Coastguard Worker dexParams := &compileDexParams{ 2874*333d2b36SAndroid Build Coastguard Worker flags: flags, 2875*333d2b36SAndroid Build Coastguard Worker sdkVersion: j.SdkVersion(ctx), 2876*333d2b36SAndroid Build Coastguard Worker minSdkVersion: j.MinSdkVersion(ctx), 2877*333d2b36SAndroid Build Coastguard Worker classesJar: outputFile, 2878*333d2b36SAndroid Build Coastguard Worker jarName: jarName, 2879*333d2b36SAndroid Build Coastguard Worker } 2880*333d2b36SAndroid Build Coastguard Worker 2881*333d2b36SAndroid Build Coastguard Worker dexOutputFile, _ = j.dexer.compileDex(ctx, dexParams) 2882*333d2b36SAndroid Build Coastguard Worker if ctx.Failed() { 2883*333d2b36SAndroid Build Coastguard Worker return 2884*333d2b36SAndroid Build Coastguard Worker } 2885*333d2b36SAndroid Build Coastguard Worker ctx.CheckbuildFile(dexOutputFile) 2886*333d2b36SAndroid Build Coastguard Worker 2887*333d2b36SAndroid Build Coastguard Worker // Initialize the hiddenapi structure. 2888*333d2b36SAndroid Build Coastguard Worker j.initHiddenAPI(ctx, makeDexJarPathFromPath(dexOutputFile), outputFile, j.dexProperties.Uncompress_dex) 2889*333d2b36SAndroid Build Coastguard Worker 2890*333d2b36SAndroid Build Coastguard Worker // Encode hidden API flags in dex file. 2891*333d2b36SAndroid Build Coastguard Worker dexOutputFile = j.hiddenAPIEncodeDex(ctx, dexOutputFile) 2892*333d2b36SAndroid Build Coastguard Worker 2893*333d2b36SAndroid Build Coastguard Worker j.dexJarFile = makeDexJarPathFromPath(dexOutputFile) 2894*333d2b36SAndroid Build Coastguard Worker j.dexJarInstallFile = android.PathForModuleInstall(ctx, "framework", jarName) 2895*333d2b36SAndroid Build Coastguard Worker } 2896*333d2b36SAndroid Build Coastguard Worker } 2897*333d2b36SAndroid Build Coastguard Worker 2898*333d2b36SAndroid Build Coastguard Worker android.SetProvider(ctx, JavaInfoProvider, &JavaInfo{ 2899*333d2b36SAndroid Build Coastguard Worker HeaderJars: android.PathsIfNonNil(j.combinedHeaderFile), 2900*333d2b36SAndroid Build Coastguard Worker LocalHeaderJars: android.PathsIfNonNil(j.combinedHeaderFile), 2901*333d2b36SAndroid Build Coastguard Worker TransitiveLibsHeaderJarsForR8: j.transitiveLibsHeaderJarsForR8, 2902*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJarsForR8: j.transitiveStaticLibsHeaderJarsForR8, 2903*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsHeaderJars: completeStaticLibsHeaderJars, 2904*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsImplementationJars: completeStaticLibsImplementationJars, 2905*333d2b36SAndroid Build Coastguard Worker TransitiveStaticLibsResourceJars: completeStaticLibsResourceJars, 2906*333d2b36SAndroid Build Coastguard Worker ImplementationAndResourcesJars: android.PathsIfNonNil(j.combinedImplementationFile), 2907*333d2b36SAndroid Build Coastguard Worker ImplementationJars: android.PathsIfNonNil(implementationJarFile.WithoutRel()), 2908*333d2b36SAndroid Build Coastguard Worker ResourceJars: android.PathsIfNonNil(resourceJarFile), 2909*333d2b36SAndroid Build Coastguard Worker AidlIncludeDirs: j.exportAidlIncludeDirs, 2910*333d2b36SAndroid Build Coastguard Worker StubsLinkType: j.stubsLinkType, 2911*333d2b36SAndroid Build Coastguard Worker // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts 2912*333d2b36SAndroid Build Coastguard Worker }) 2913*333d2b36SAndroid Build Coastguard Worker 2914*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, "") 2915*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, ".jar") 2916*333d2b36SAndroid Build Coastguard Worker} 2917*333d2b36SAndroid Build Coastguard Worker 2918*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) maybeInstall(ctx android.ModuleContext, jarName string, outputFile android.Path) { 2919*333d2b36SAndroid Build Coastguard Worker if !Bool(j.properties.Installable) { 2920*333d2b36SAndroid Build Coastguard Worker return 2921*333d2b36SAndroid Build Coastguard Worker } 2922*333d2b36SAndroid Build Coastguard Worker 2923*333d2b36SAndroid Build Coastguard Worker var installDir android.InstallPath 2924*333d2b36SAndroid Build Coastguard Worker if ctx.InstallInTestcases() { 2925*333d2b36SAndroid Build Coastguard Worker var archDir string 2926*333d2b36SAndroid Build Coastguard Worker if !ctx.Host() { 2927*333d2b36SAndroid Build Coastguard Worker archDir = ctx.DeviceConfig().DeviceArch() 2928*333d2b36SAndroid Build Coastguard Worker } 2929*333d2b36SAndroid Build Coastguard Worker installDir = android.PathForModuleInstall(ctx, ctx.ModuleName(), archDir) 2930*333d2b36SAndroid Build Coastguard Worker } else { 2931*333d2b36SAndroid Build Coastguard Worker installDir = android.PathForModuleInstall(ctx, "framework") 2932*333d2b36SAndroid Build Coastguard Worker } 2933*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, jarName, outputFile) 2934*333d2b36SAndroid Build Coastguard Worker} 2935*333d2b36SAndroid Build Coastguard Worker 2936*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) HeaderJars() android.Paths { 2937*333d2b36SAndroid Build Coastguard Worker return android.PathsIfNonNil(j.combinedHeaderFile) 2938*333d2b36SAndroid Build Coastguard Worker} 2939*333d2b36SAndroid Build Coastguard Worker 2940*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ImplementationAndResourcesJars() android.Paths { 2941*333d2b36SAndroid Build Coastguard Worker return android.PathsIfNonNil(j.combinedImplementationFile) 2942*333d2b36SAndroid Build Coastguard Worker} 2943*333d2b36SAndroid Build Coastguard Worker 2944*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { 2945*333d2b36SAndroid Build Coastguard Worker if j.dexJarFileErr != nil { 2946*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf(j.dexJarFileErr.Error()) 2947*333d2b36SAndroid Build Coastguard Worker } 2948*333d2b36SAndroid Build Coastguard Worker return j.dexJarFile 2949*333d2b36SAndroid Build Coastguard Worker} 2950*333d2b36SAndroid Build Coastguard Worker 2951*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DexJarInstallPath() android.Path { 2952*333d2b36SAndroid Build Coastguard Worker return j.dexJarInstallFile 2953*333d2b36SAndroid Build Coastguard Worker} 2954*333d2b36SAndroid Build Coastguard Worker 2955*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { 2956*333d2b36SAndroid Build Coastguard Worker return j.classLoaderContexts 2957*333d2b36SAndroid Build Coastguard Worker} 2958*333d2b36SAndroid Build Coastguard Worker 2959*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*Import)(nil) 2960*333d2b36SAndroid Build Coastguard Worker 2961*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 2962*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool { 2963*333d2b36SAndroid Build Coastguard Worker return j.depIsInSameApex(ctx, dep) 2964*333d2b36SAndroid Build Coastguard Worker} 2965*333d2b36SAndroid Build Coastguard Worker 2966*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 2967*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 2968*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 2969*333d2b36SAndroid Build Coastguard Worker sdkVersionSpec := j.SdkVersion(ctx) 2970*333d2b36SAndroid Build Coastguard Worker minSdkVersion := j.MinSdkVersion(ctx) 2971*333d2b36SAndroid Build Coastguard Worker if !minSdkVersion.Specified() { 2972*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("min_sdk_version is not specified") 2973*333d2b36SAndroid Build Coastguard Worker } 2974*333d2b36SAndroid Build Coastguard Worker // If the module is compiling against core (via sdk_version), skip comparison check. 2975*333d2b36SAndroid Build Coastguard Worker if sdkVersionSpec.Kind == android.SdkCore { 2976*333d2b36SAndroid Build Coastguard Worker return nil 2977*333d2b36SAndroid Build Coastguard Worker } 2978*333d2b36SAndroid Build Coastguard Worker if minSdkVersion.GreaterThan(sdkVersion) { 2979*333d2b36SAndroid Build Coastguard Worker return fmt.Errorf("newer SDK(%v)", minSdkVersion) 2980*333d2b36SAndroid Build Coastguard Worker } 2981*333d2b36SAndroid Build Coastguard Worker return nil 2982*333d2b36SAndroid Build Coastguard Worker} 2983*333d2b36SAndroid Build Coastguard Worker 2984*333d2b36SAndroid Build Coastguard Worker// requiredFilesFromPrebuiltApexForImport returns information about the files that a java_import or 2985*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_import with the specified base module name requires to be exported from a 2986*333d2b36SAndroid Build Coastguard Worker// prebuilt_apex/apex_set. 2987*333d2b36SAndroid Build Coastguard Workerfunc requiredFilesFromPrebuiltApexForImport(name string, d *dexpreopter) []string { 2988*333d2b36SAndroid Build Coastguard Worker dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(name) 2989*333d2b36SAndroid Build Coastguard Worker // Add the dex implementation jar to the set of exported files. 2990*333d2b36SAndroid Build Coastguard Worker files := []string{ 2991*333d2b36SAndroid Build Coastguard Worker dexJarFileApexRootRelative, 2992*333d2b36SAndroid Build Coastguard Worker } 2993*333d2b36SAndroid Build Coastguard Worker if BoolDefault(d.importDexpreoptProperties.Dex_preopt.Profile_guided, false) { 2994*333d2b36SAndroid Build Coastguard Worker files = append(files, dexJarFileApexRootRelative+".prof") 2995*333d2b36SAndroid Build Coastguard Worker } 2996*333d2b36SAndroid Build Coastguard Worker return files 2997*333d2b36SAndroid Build Coastguard Worker} 2998*333d2b36SAndroid Build Coastguard Worker 2999*333d2b36SAndroid Build Coastguard Worker// ApexRootRelativePathToJavaLib returns the path, relative to the root of the apex's contents, for 3000*333d2b36SAndroid Build Coastguard Worker// the java library with the specified name. 3001*333d2b36SAndroid Build Coastguard Workerfunc ApexRootRelativePathToJavaLib(name string) string { 3002*333d2b36SAndroid Build Coastguard Worker return filepath.Join("javalib", name+".jar") 3003*333d2b36SAndroid Build Coastguard Worker} 3004*333d2b36SAndroid Build Coastguard Worker 3005*333d2b36SAndroid Build Coastguard Workervar _ android.RequiredFilesFromPrebuiltApex = (*Import)(nil) 3006*333d2b36SAndroid Build Coastguard Worker 3007*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) RequiredFilesFromPrebuiltApex(_ android.BaseModuleContext) []string { 3008*333d2b36SAndroid Build Coastguard Worker name := j.BaseModuleName() 3009*333d2b36SAndroid Build Coastguard Worker return requiredFilesFromPrebuiltApexForImport(name, &j.dexpreopter) 3010*333d2b36SAndroid Build Coastguard Worker} 3011*333d2b36SAndroid Build Coastguard Worker 3012*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) UseProfileGuidedDexpreopt() bool { 3013*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(j.importDexpreoptProperties.Dex_preopt.Profile_guided) 3014*333d2b36SAndroid Build Coastguard Worker} 3015*333d2b36SAndroid Build Coastguard Worker 3016*333d2b36SAndroid Build Coastguard Worker// Add compile time check for interface implementation 3017*333d2b36SAndroid Build Coastguard Workervar _ android.IDEInfo = (*Import)(nil) 3018*333d2b36SAndroid Build Coastguard Workervar _ android.IDECustomizedModuleName = (*Import)(nil) 3019*333d2b36SAndroid Build Coastguard Worker 3020*333d2b36SAndroid Build Coastguard Worker// Collect information for opening IDE project files in java/jdeps.go. 3021*333d2b36SAndroid Build Coastguard Worker 3022*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IDEInfo(ctx android.BaseModuleContext, dpInfo *android.IdeInfo) { 3023*333d2b36SAndroid Build Coastguard Worker dpInfo.Jars = append(dpInfo.Jars, j.combinedHeaderFile.String()) 3024*333d2b36SAndroid Build Coastguard Worker} 3025*333d2b36SAndroid Build Coastguard Worker 3026*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IDECustomizedModuleName() string { 3027*333d2b36SAndroid Build Coastguard Worker // TODO(b/113562217): Extract the base module name from the Import name, often the Import name 3028*333d2b36SAndroid Build Coastguard Worker // has a prefix "prebuilt_". Remove the prefix explicitly if needed until we find a better 3029*333d2b36SAndroid Build Coastguard Worker // solution to get the Import name. 3030*333d2b36SAndroid Build Coastguard Worker return android.RemoveOptionalPrebuiltPrefix(j.Name()) 3031*333d2b36SAndroid Build Coastguard Worker} 3032*333d2b36SAndroid Build Coastguard Worker 3033*333d2b36SAndroid Build Coastguard Workervar _ android.PrebuiltInterface = (*Import)(nil) 3034*333d2b36SAndroid Build Coastguard Worker 3035*333d2b36SAndroid Build Coastguard Workerfunc (j *Import) IsInstallable() bool { 3036*333d2b36SAndroid Build Coastguard Worker return Bool(j.properties.Installable) 3037*333d2b36SAndroid Build Coastguard Worker} 3038*333d2b36SAndroid Build Coastguard Worker 3039*333d2b36SAndroid Build Coastguard Workervar _ DexpreopterInterface = (*Import)(nil) 3040*333d2b36SAndroid Build Coastguard Worker 3041*333d2b36SAndroid Build Coastguard Worker// java_import imports one or more `.jar` files into the build graph as if they were built by a java_library module. 3042*333d2b36SAndroid Build Coastguard Worker// 3043*333d2b36SAndroid Build Coastguard Worker// By default, a java_import has a single variant that expects a `.jar` file containing `.class` files that were 3044*333d2b36SAndroid Build Coastguard Worker// compiled against an Android classpath. 3045*333d2b36SAndroid Build Coastguard Worker// 3046*333d2b36SAndroid Build Coastguard Worker// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one 3047*333d2b36SAndroid Build Coastguard Worker// for host modules. 3048*333d2b36SAndroid Build Coastguard Workerfunc ImportFactory() android.Module { 3049*333d2b36SAndroid Build Coastguard Worker module := &Import{} 3050*333d2b36SAndroid Build Coastguard Worker 3051*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 3052*333d2b36SAndroid Build Coastguard Worker &module.properties, 3053*333d2b36SAndroid Build Coastguard Worker &module.dexer.dexProperties, 3054*333d2b36SAndroid Build Coastguard Worker &module.importDexpreoptProperties, 3055*333d2b36SAndroid Build Coastguard Worker ) 3056*333d2b36SAndroid Build Coastguard Worker 3057*333d2b36SAndroid Build Coastguard Worker module.initModuleAndImport(module) 3058*333d2b36SAndroid Build Coastguard Worker 3059*333d2b36SAndroid Build Coastguard Worker module.dexProperties.Optimize.EnabledByDefault = false 3060*333d2b36SAndroid Build Coastguard Worker 3061*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &module.properties.Jars) 3062*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 3063*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostAndDeviceSupported) 3064*333d2b36SAndroid Build Coastguard Worker return module 3065*333d2b36SAndroid Build Coastguard Worker} 3066*333d2b36SAndroid Build Coastguard Worker 3067*333d2b36SAndroid Build Coastguard Worker// java_import imports one or more `.jar` files into the build graph as if they were built by a java_library_host 3068*333d2b36SAndroid Build Coastguard Worker// module. 3069*333d2b36SAndroid Build Coastguard Worker// 3070*333d2b36SAndroid Build Coastguard Worker// A java_import_host has a single variant that expects a `.jar` file containing `.class` files that were 3071*333d2b36SAndroid Build Coastguard Worker// compiled against a host bootclasspath. 3072*333d2b36SAndroid Build Coastguard Workerfunc ImportFactoryHost() android.Module { 3073*333d2b36SAndroid Build Coastguard Worker module := &Import{} 3074*333d2b36SAndroid Build Coastguard Worker 3075*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 3076*333d2b36SAndroid Build Coastguard Worker 3077*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &module.properties.Jars) 3078*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 3079*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.HostSupported) 3080*333d2b36SAndroid Build Coastguard Worker return module 3081*333d2b36SAndroid Build Coastguard Worker} 3082*333d2b36SAndroid Build Coastguard Worker 3083*333d2b36SAndroid Build Coastguard Worker// dex_import module 3084*333d2b36SAndroid Build Coastguard Worker 3085*333d2b36SAndroid Build Coastguard Workertype DexImportProperties struct { 3086*333d2b36SAndroid Build Coastguard Worker Jars []string `android:"path"` 3087*333d2b36SAndroid Build Coastguard Worker 3088*333d2b36SAndroid Build Coastguard Worker // set the name of the output 3089*333d2b36SAndroid Build Coastguard Worker Stem *string 3090*333d2b36SAndroid Build Coastguard Worker} 3091*333d2b36SAndroid Build Coastguard Worker 3092*333d2b36SAndroid Build Coastguard Workertype DexImport struct { 3093*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 3094*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 3095*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 3096*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 3097*333d2b36SAndroid Build Coastguard Worker 3098*333d2b36SAndroid Build Coastguard Worker properties DexImportProperties 3099*333d2b36SAndroid Build Coastguard Worker 3100*333d2b36SAndroid Build Coastguard Worker dexJarFile OptionalDexJarPath 3101*333d2b36SAndroid Build Coastguard Worker 3102*333d2b36SAndroid Build Coastguard Worker dexpreopter 3103*333d2b36SAndroid Build Coastguard Worker 3104*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 3105*333d2b36SAndroid Build Coastguard Worker} 3106*333d2b36SAndroid Build Coastguard Worker 3107*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Prebuilt() *android.Prebuilt { 3108*333d2b36SAndroid Build Coastguard Worker return &j.prebuilt 3109*333d2b36SAndroid Build Coastguard Worker} 3110*333d2b36SAndroid Build Coastguard Worker 3111*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) PrebuiltSrcs() []string { 3112*333d2b36SAndroid Build Coastguard Worker return j.properties.Jars 3113*333d2b36SAndroid Build Coastguard Worker} 3114*333d2b36SAndroid Build Coastguard Worker 3115*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Name() string { 3116*333d2b36SAndroid Build Coastguard Worker return j.prebuilt.Name(j.ModuleBase.Name()) 3117*333d2b36SAndroid Build Coastguard Worker} 3118*333d2b36SAndroid Build Coastguard Worker 3119*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) Stem() string { 3120*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(j.properties.Stem, j.ModuleBase.Name()) 3121*333d2b36SAndroid Build Coastguard Worker} 3122*333d2b36SAndroid Build Coastguard Worker 3123*333d2b36SAndroid Build Coastguard Workerfunc (a *DexImport) JacocoReportClassesFile() android.Path { 3124*333d2b36SAndroid Build Coastguard Worker return nil 3125*333d2b36SAndroid Build Coastguard Worker} 3126*333d2b36SAndroid Build Coastguard Worker 3127*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) IsInstallable() bool { 3128*333d2b36SAndroid Build Coastguard Worker return true 3129*333d2b36SAndroid Build Coastguard Worker} 3130*333d2b36SAndroid Build Coastguard Worker 3131*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 3132*333d2b36SAndroid Build Coastguard Worker if len(j.properties.Jars) != 1 { 3133*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("jars", "exactly one jar must be provided") 3134*333d2b36SAndroid Build Coastguard Worker } 3135*333d2b36SAndroid Build Coastguard Worker 3136*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 3137*333d2b36SAndroid Build Coastguard Worker if !apexInfo.IsForPlatform() { 3138*333d2b36SAndroid Build Coastguard Worker j.hideApexVariantFromMake = true 3139*333d2b36SAndroid Build Coastguard Worker } 3140*333d2b36SAndroid Build Coastguard Worker 3141*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.installPath = j.dexpreopter.getInstallPath( 3142*333d2b36SAndroid Build Coastguard Worker ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), android.PathForModuleInstall(ctx, "framework", j.Stem()+".jar")) 3143*333d2b36SAndroid Build Coastguard Worker j.dexpreopter.uncompressedDex = shouldUncompressDex(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), &j.dexpreopter) 3144*333d2b36SAndroid Build Coastguard Worker 3145*333d2b36SAndroid Build Coastguard Worker inputJar := ctx.ExpandSource(j.properties.Jars[0], "jars") 3146*333d2b36SAndroid Build Coastguard Worker dexOutputFile := android.PathForModuleOut(ctx, ctx.ModuleName()+".jar") 3147*333d2b36SAndroid Build Coastguard Worker 3148*333d2b36SAndroid Build Coastguard Worker if j.dexpreopter.uncompressedDex { 3149*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 3150*333d2b36SAndroid Build Coastguard Worker 3151*333d2b36SAndroid Build Coastguard Worker temporary := android.PathForModuleOut(ctx, ctx.ModuleName()+".jar.unaligned") 3152*333d2b36SAndroid Build Coastguard Worker rule.Temporary(temporary) 3153*333d2b36SAndroid Build Coastguard Worker 3154*333d2b36SAndroid Build Coastguard Worker // use zip2zip to uncompress classes*.dex files 3155*333d2b36SAndroid Build Coastguard Worker rule.Command(). 3156*333d2b36SAndroid Build Coastguard Worker BuiltTool("zip2zip"). 3157*333d2b36SAndroid Build Coastguard Worker FlagWithInput("-i ", inputJar). 3158*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", temporary). 3159*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-0 ", "'classes*.dex'") 3160*333d2b36SAndroid Build Coastguard Worker 3161*333d2b36SAndroid Build Coastguard Worker // use zipalign to align uncompressed classes*.dex files 3162*333d2b36SAndroid Build Coastguard Worker rule.Command(). 3163*333d2b36SAndroid Build Coastguard Worker BuiltTool("zipalign"). 3164*333d2b36SAndroid Build Coastguard Worker Flag("-f"). 3165*333d2b36SAndroid Build Coastguard Worker Text("4"). 3166*333d2b36SAndroid Build Coastguard Worker Input(temporary). 3167*333d2b36SAndroid Build Coastguard Worker Output(dexOutputFile) 3168*333d2b36SAndroid Build Coastguard Worker 3169*333d2b36SAndroid Build Coastguard Worker rule.DeleteTemporaryFiles() 3170*333d2b36SAndroid Build Coastguard Worker 3171*333d2b36SAndroid Build Coastguard Worker rule.Build("uncompress_dex", "uncompress dex") 3172*333d2b36SAndroid Build Coastguard Worker } else { 3173*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 3174*333d2b36SAndroid Build Coastguard Worker Rule: android.Cp, 3175*333d2b36SAndroid Build Coastguard Worker Input: inputJar, 3176*333d2b36SAndroid Build Coastguard Worker Output: dexOutputFile, 3177*333d2b36SAndroid Build Coastguard Worker }) 3178*333d2b36SAndroid Build Coastguard Worker } 3179*333d2b36SAndroid Build Coastguard Worker 3180*333d2b36SAndroid Build Coastguard Worker j.dexJarFile = makeDexJarPathFromPath(dexOutputFile) 3181*333d2b36SAndroid Build Coastguard Worker 3182*333d2b36SAndroid Build Coastguard Worker j.dexpreopt(ctx, android.RemoveOptionalPrebuiltPrefix(ctx.ModuleName()), dexOutputFile) 3183*333d2b36SAndroid Build Coastguard Worker 3184*333d2b36SAndroid Build Coastguard Worker if apexInfo.IsForPlatform() { 3185*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(android.PathForModuleInstall(ctx, "framework"), 3186*333d2b36SAndroid Build Coastguard Worker j.Stem()+".jar", dexOutputFile) 3187*333d2b36SAndroid Build Coastguard Worker } 3188*333d2b36SAndroid Build Coastguard Worker} 3189*333d2b36SAndroid Build Coastguard Worker 3190*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath { 3191*333d2b36SAndroid Build Coastguard Worker return j.dexJarFile 3192*333d2b36SAndroid Build Coastguard Worker} 3193*333d2b36SAndroid Build Coastguard Worker 3194*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*DexImport)(nil) 3195*333d2b36SAndroid Build Coastguard Worker 3196*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 3197*333d2b36SAndroid Build Coastguard Workerfunc (j *DexImport) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 3198*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 3199*333d2b36SAndroid Build Coastguard Worker // we don't check prebuilt modules for sdk_version 3200*333d2b36SAndroid Build Coastguard Worker return nil 3201*333d2b36SAndroid Build Coastguard Worker} 3202*333d2b36SAndroid Build Coastguard Worker 3203*333d2b36SAndroid Build Coastguard Worker// dex_import imports a `.jar` file containing classes.dex files. 3204*333d2b36SAndroid Build Coastguard Worker// 3205*333d2b36SAndroid Build Coastguard Worker// A dex_import module cannot be used as a dependency of a java_* or android_* module, it can only be installed 3206*333d2b36SAndroid Build Coastguard Worker// to the device. 3207*333d2b36SAndroid Build Coastguard Workerfunc DexImportFactory() android.Module { 3208*333d2b36SAndroid Build Coastguard Worker module := &DexImport{} 3209*333d2b36SAndroid Build Coastguard Worker 3210*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 3211*333d2b36SAndroid Build Coastguard Worker 3212*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &module.properties.Jars) 3213*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 3214*333d2b36SAndroid Build Coastguard Worker InitJavaModule(module, android.DeviceSupported) 3215*333d2b36SAndroid Build Coastguard Worker return module 3216*333d2b36SAndroid Build Coastguard Worker} 3217*333d2b36SAndroid Build Coastguard Worker 3218*333d2b36SAndroid Build Coastguard Worker// Defaults 3219*333d2b36SAndroid Build Coastguard Workertype Defaults struct { 3220*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 3221*333d2b36SAndroid Build Coastguard Worker android.DefaultsModuleBase 3222*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 3223*333d2b36SAndroid Build Coastguard Worker} 3224*333d2b36SAndroid Build Coastguard Worker 3225*333d2b36SAndroid Build Coastguard Worker// java_defaults provides a set of properties that can be inherited by other java or android modules. 3226*333d2b36SAndroid Build Coastguard Worker// 3227*333d2b36SAndroid Build Coastguard Worker// A module can use the properties from a java_defaults module using `defaults: ["defaults_module_name"]`. Each 3228*333d2b36SAndroid Build Coastguard Worker// property in the defaults module that exists in the depending module will be prepended to the depending module's 3229*333d2b36SAndroid Build Coastguard Worker// value for that property. 3230*333d2b36SAndroid Build Coastguard Worker// 3231*333d2b36SAndroid Build Coastguard Worker// Example: 3232*333d2b36SAndroid Build Coastguard Worker// 3233*333d2b36SAndroid Build Coastguard Worker// java_defaults { 3234*333d2b36SAndroid Build Coastguard Worker// name: "example_defaults", 3235*333d2b36SAndroid Build Coastguard Worker// srcs: ["common/**/*.java"], 3236*333d2b36SAndroid Build Coastguard Worker// javacflags: ["-Xlint:all"], 3237*333d2b36SAndroid Build Coastguard Worker// aaptflags: ["--auto-add-overlay"], 3238*333d2b36SAndroid Build Coastguard Worker// } 3239*333d2b36SAndroid Build Coastguard Worker// 3240*333d2b36SAndroid Build Coastguard Worker// java_library { 3241*333d2b36SAndroid Build Coastguard Worker// name: "example", 3242*333d2b36SAndroid Build Coastguard Worker// defaults: ["example_defaults"], 3243*333d2b36SAndroid Build Coastguard Worker// srcs: ["example/**/*.java"], 3244*333d2b36SAndroid Build Coastguard Worker// } 3245*333d2b36SAndroid Build Coastguard Worker// 3246*333d2b36SAndroid Build Coastguard Worker// is functionally identical to: 3247*333d2b36SAndroid Build Coastguard Worker// 3248*333d2b36SAndroid Build Coastguard Worker// java_library { 3249*333d2b36SAndroid Build Coastguard Worker// name: "example", 3250*333d2b36SAndroid Build Coastguard Worker// srcs: [ 3251*333d2b36SAndroid Build Coastguard Worker// "common/**/*.java", 3252*333d2b36SAndroid Build Coastguard Worker// "example/**/*.java", 3253*333d2b36SAndroid Build Coastguard Worker// ], 3254*333d2b36SAndroid Build Coastguard Worker// javacflags: ["-Xlint:all"], 3255*333d2b36SAndroid Build Coastguard Worker// } 3256*333d2b36SAndroid Build Coastguard Workerfunc DefaultsFactory() android.Module { 3257*333d2b36SAndroid Build Coastguard Worker module := &Defaults{} 3258*333d2b36SAndroid Build Coastguard Worker 3259*333d2b36SAndroid Build Coastguard Worker module.AddProperties( 3260*333d2b36SAndroid Build Coastguard Worker &CommonProperties{}, 3261*333d2b36SAndroid Build Coastguard Worker &DeviceProperties{}, 3262*333d2b36SAndroid Build Coastguard Worker &OverridableProperties{}, 3263*333d2b36SAndroid Build Coastguard Worker &DexProperties{}, 3264*333d2b36SAndroid Build Coastguard Worker &DexpreoptProperties{}, 3265*333d2b36SAndroid Build Coastguard Worker &android.ProtoProperties{}, 3266*333d2b36SAndroid Build Coastguard Worker &aaptProperties{}, 3267*333d2b36SAndroid Build Coastguard Worker &androidLibraryProperties{}, 3268*333d2b36SAndroid Build Coastguard Worker &appProperties{}, 3269*333d2b36SAndroid Build Coastguard Worker &appTestProperties{}, 3270*333d2b36SAndroid Build Coastguard Worker &overridableAppProperties{}, 3271*333d2b36SAndroid Build Coastguard Worker &hostTestProperties{}, 3272*333d2b36SAndroid Build Coastguard Worker &testProperties{}, 3273*333d2b36SAndroid Build Coastguard Worker &ImportProperties{}, 3274*333d2b36SAndroid Build Coastguard Worker &AARImportProperties{}, 3275*333d2b36SAndroid Build Coastguard Worker &sdkLibraryProperties{}, 3276*333d2b36SAndroid Build Coastguard Worker &commonToSdkLibraryAndImportProperties{}, 3277*333d2b36SAndroid Build Coastguard Worker &DexImportProperties{}, 3278*333d2b36SAndroid Build Coastguard Worker &android.ApexProperties{}, 3279*333d2b36SAndroid Build Coastguard Worker &RuntimeResourceOverlayProperties{}, 3280*333d2b36SAndroid Build Coastguard Worker &LintProperties{}, 3281*333d2b36SAndroid Build Coastguard Worker &appTestHelperAppProperties{}, 3282*333d2b36SAndroid Build Coastguard Worker &JavaApiLibraryProperties{}, 3283*333d2b36SAndroid Build Coastguard Worker &bootclasspathFragmentProperties{}, 3284*333d2b36SAndroid Build Coastguard Worker &SourceOnlyBootclasspathProperties{}, 3285*333d2b36SAndroid Build Coastguard Worker &ravenwoodTestProperties{}, 3286*333d2b36SAndroid Build Coastguard Worker ) 3287*333d2b36SAndroid Build Coastguard Worker 3288*333d2b36SAndroid Build Coastguard Worker android.InitDefaultsModule(module) 3289*333d2b36SAndroid Build Coastguard Worker return module 3290*333d2b36SAndroid Build Coastguard Worker} 3291*333d2b36SAndroid Build Coastguard Worker 3292*333d2b36SAndroid Build Coastguard Workerfunc kytheExtractJavaFactory() android.Singleton { 3293*333d2b36SAndroid Build Coastguard Worker return &kytheExtractJavaSingleton{} 3294*333d2b36SAndroid Build Coastguard Worker} 3295*333d2b36SAndroid Build Coastguard Worker 3296*333d2b36SAndroid Build Coastguard Workertype kytheExtractJavaSingleton struct { 3297*333d2b36SAndroid Build Coastguard Worker} 3298*333d2b36SAndroid Build Coastguard Worker 3299*333d2b36SAndroid Build Coastguard Workerfunc (ks *kytheExtractJavaSingleton) GenerateBuildActions(ctx android.SingletonContext) { 3300*333d2b36SAndroid Build Coastguard Worker var xrefTargets android.Paths 3301*333d2b36SAndroid Build Coastguard Worker var xrefKotlinTargets android.Paths 3302*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module android.Module) { 3303*333d2b36SAndroid Build Coastguard Worker if javaModule, ok := module.(xref); ok { 3304*333d2b36SAndroid Build Coastguard Worker xrefTargets = append(xrefTargets, javaModule.XrefJavaFiles()...) 3305*333d2b36SAndroid Build Coastguard Worker xrefKotlinTargets = append(xrefKotlinTargets, javaModule.XrefKotlinFiles()...) 3306*333d2b36SAndroid Build Coastguard Worker } 3307*333d2b36SAndroid Build Coastguard Worker }) 3308*333d2b36SAndroid Build Coastguard Worker // TODO(asmundak): perhaps emit a rule to output a warning if there were no xrefTargets 3309*333d2b36SAndroid Build Coastguard Worker if len(xrefTargets) > 0 { 3310*333d2b36SAndroid Build Coastguard Worker ctx.Phony("xref_java", xrefTargets...) 3311*333d2b36SAndroid Build Coastguard Worker } 3312*333d2b36SAndroid Build Coastguard Worker if len(xrefKotlinTargets) > 0 { 3313*333d2b36SAndroid Build Coastguard Worker ctx.Phony("xref_kotlin", xrefKotlinTargets...) 3314*333d2b36SAndroid Build Coastguard Worker } 3315*333d2b36SAndroid Build Coastguard Worker} 3316*333d2b36SAndroid Build Coastguard Worker 3317*333d2b36SAndroid Build Coastguard Workervar Bool = proptools.Bool 3318*333d2b36SAndroid Build Coastguard Workervar BoolDefault = proptools.BoolDefault 3319*333d2b36SAndroid Build Coastguard Workervar String = proptools.String 3320*333d2b36SAndroid Build Coastguard Workervar inList = android.InList[string] 3321*333d2b36SAndroid Build Coastguard Worker 3322*333d2b36SAndroid Build Coastguard Worker// Add class loader context (CLC) of a given dependency to the current CLC. 3323*333d2b36SAndroid Build Coastguard Workerfunc addCLCFromDep(ctx android.ModuleContext, depModule android.Module, 3324*333d2b36SAndroid Build Coastguard Worker clcMap dexpreopt.ClassLoaderContextMap) { 3325*333d2b36SAndroid Build Coastguard Worker 3326*333d2b36SAndroid Build Coastguard Worker dep, ok := depModule.(UsesLibraryDependency) 3327*333d2b36SAndroid Build Coastguard Worker if !ok { 3328*333d2b36SAndroid Build Coastguard Worker return 3329*333d2b36SAndroid Build Coastguard Worker } 3330*333d2b36SAndroid Build Coastguard Worker 3331*333d2b36SAndroid Build Coastguard Worker depName := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(depModule)) 3332*333d2b36SAndroid Build Coastguard Worker 3333*333d2b36SAndroid Build Coastguard Worker var sdkLib *string 3334*333d2b36SAndroid Build Coastguard Worker if lib, ok := android.OtherModuleProvider(ctx, depModule, SdkLibraryInfoProvider); ok && lib.SharedLibrary { 3335*333d2b36SAndroid Build Coastguard Worker // A shared SDK library. This should be added as a top-level CLC element. 3336*333d2b36SAndroid Build Coastguard Worker sdkLib = &depName 3337*333d2b36SAndroid Build Coastguard Worker } else if lib, ok := depModule.(SdkLibraryComponentDependency); ok && lib.OptionalSdkLibraryImplementation() != nil { 3338*333d2b36SAndroid Build Coastguard Worker if depModule.Name() == proptools.String(lib.OptionalSdkLibraryImplementation())+".impl" { 3339*333d2b36SAndroid Build Coastguard Worker sdkLib = lib.OptionalSdkLibraryImplementation() 3340*333d2b36SAndroid Build Coastguard Worker } 3341*333d2b36SAndroid Build Coastguard Worker } else if ulib, ok := depModule.(ProvidesUsesLib); ok { 3342*333d2b36SAndroid Build Coastguard Worker // A non-SDK library disguised as an SDK library by the means of `provides_uses_lib` 3343*333d2b36SAndroid Build Coastguard Worker // property. This should be handled in the same way as a shared SDK library. 3344*333d2b36SAndroid Build Coastguard Worker sdkLib = ulib.ProvidesUsesLib() 3345*333d2b36SAndroid Build Coastguard Worker } 3346*333d2b36SAndroid Build Coastguard Worker 3347*333d2b36SAndroid Build Coastguard Worker depTag := ctx.OtherModuleDependencyTag(depModule) 3348*333d2b36SAndroid Build Coastguard Worker if IsLibDepTag(depTag) { 3349*333d2b36SAndroid Build Coastguard Worker // Ok, propagate <uses-library> through non-static library dependencies. 3350*333d2b36SAndroid Build Coastguard Worker } else if tag, ok := depTag.(usesLibraryDependencyTag); ok && tag.sdkVersion == dexpreopt.AnySdkVersion { 3351*333d2b36SAndroid Build Coastguard Worker // Ok, propagate <uses-library> through non-compatibility <uses-library> dependencies. 3352*333d2b36SAndroid Build Coastguard Worker } else if depTag == staticLibTag { 3353*333d2b36SAndroid Build Coastguard Worker // Propagate <uses-library> through static library dependencies, unless it is a component 3354*333d2b36SAndroid Build Coastguard Worker // library (such as stubs). Component libraries have a dependency on their SDK library, 3355*333d2b36SAndroid Build Coastguard Worker // which should not be pulled just because of a static component library. 3356*333d2b36SAndroid Build Coastguard Worker if sdkLib != nil { 3357*333d2b36SAndroid Build Coastguard Worker return 3358*333d2b36SAndroid Build Coastguard Worker } 3359*333d2b36SAndroid Build Coastguard Worker } else { 3360*333d2b36SAndroid Build Coastguard Worker // Don't propagate <uses-library> for other dependency tags. 3361*333d2b36SAndroid Build Coastguard Worker return 3362*333d2b36SAndroid Build Coastguard Worker } 3363*333d2b36SAndroid Build Coastguard Worker 3364*333d2b36SAndroid Build Coastguard Worker // If this is an SDK (or SDK-like) library, then it should be added as a node in the CLC tree, 3365*333d2b36SAndroid Build Coastguard Worker // and its CLC should be added as subtree of that node. Otherwise the library is not a 3366*333d2b36SAndroid Build Coastguard Worker // <uses_library> and should not be added to CLC, but the transitive <uses-library> dependencies 3367*333d2b36SAndroid Build Coastguard Worker // from its CLC should be added to the current CLC. 3368*333d2b36SAndroid Build Coastguard Worker if sdkLib != nil { 3369*333d2b36SAndroid Build Coastguard Worker optional := false 3370*333d2b36SAndroid Build Coastguard Worker if module, ok := ctx.Module().(ModuleWithUsesLibrary); ok { 3371*333d2b36SAndroid Build Coastguard Worker if android.InList(*sdkLib, module.UsesLibrary().usesLibraryProperties.Optional_uses_libs.GetOrDefault(ctx, nil)) { 3372*333d2b36SAndroid Build Coastguard Worker optional = true 3373*333d2b36SAndroid Build Coastguard Worker } 3374*333d2b36SAndroid Build Coastguard Worker } 3375*333d2b36SAndroid Build Coastguard Worker clcMap.AddContext(ctx, dexpreopt.AnySdkVersion, *sdkLib, optional, 3376*333d2b36SAndroid Build Coastguard Worker dep.DexJarBuildPath(ctx).PathOrNil(), dep.DexJarInstallPath(), dep.ClassLoaderContexts()) 3377*333d2b36SAndroid Build Coastguard Worker } else { 3378*333d2b36SAndroid Build Coastguard Worker clcMap.AddContextMap(dep.ClassLoaderContexts(), depName) 3379*333d2b36SAndroid Build Coastguard Worker } 3380*333d2b36SAndroid Build Coastguard Worker} 3381*333d2b36SAndroid Build Coastguard Worker 3382*333d2b36SAndroid Build Coastguard Workerfunc addMissingOptionalUsesLibsFromDep(ctx android.ModuleContext, depModule android.Module, 3383*333d2b36SAndroid Build Coastguard Worker usesLibrary *usesLibrary) { 3384*333d2b36SAndroid Build Coastguard Worker 3385*333d2b36SAndroid Build Coastguard Worker dep, ok := depModule.(ModuleWithUsesLibrary) 3386*333d2b36SAndroid Build Coastguard Worker if !ok { 3387*333d2b36SAndroid Build Coastguard Worker return 3388*333d2b36SAndroid Build Coastguard Worker } 3389*333d2b36SAndroid Build Coastguard Worker 3390*333d2b36SAndroid Build Coastguard Worker for _, lib := range dep.UsesLibrary().usesLibraryProperties.Missing_optional_uses_libs { 3391*333d2b36SAndroid Build Coastguard Worker if !android.InList(lib, usesLibrary.usesLibraryProperties.Missing_optional_uses_libs) { 3392*333d2b36SAndroid Build Coastguard Worker usesLibrary.usesLibraryProperties.Missing_optional_uses_libs = 3393*333d2b36SAndroid Build Coastguard Worker append(usesLibrary.usesLibraryProperties.Missing_optional_uses_libs, lib) 3394*333d2b36SAndroid Build Coastguard Worker } 3395*333d2b36SAndroid Build Coastguard Worker } 3396*333d2b36SAndroid Build Coastguard Worker} 3397*333d2b36SAndroid Build Coastguard Worker 3398*333d2b36SAndroid Build Coastguard Workertype JavaApiContributionImport struct { 3399*333d2b36SAndroid Build Coastguard Worker JavaApiContribution 3400*333d2b36SAndroid Build Coastguard Worker 3401*333d2b36SAndroid Build Coastguard Worker prebuilt android.Prebuilt 3402*333d2b36SAndroid Build Coastguard Worker prebuiltProperties javaApiContributionImportProperties 3403*333d2b36SAndroid Build Coastguard Worker} 3404*333d2b36SAndroid Build Coastguard Worker 3405*333d2b36SAndroid Build Coastguard Workertype javaApiContributionImportProperties struct { 3406*333d2b36SAndroid Build Coastguard Worker // Name of the source soong module that gets shadowed by this prebuilt 3407*333d2b36SAndroid Build Coastguard Worker // If unspecified, follows the naming convention that the source module of 3408*333d2b36SAndroid Build Coastguard Worker // the prebuilt is Name() without "prebuilt_" prefix 3409*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 3410*333d2b36SAndroid Build Coastguard Worker 3411*333d2b36SAndroid Build Coastguard Worker // Non-nil if this java_import module was dynamically created by a java_sdk_library_import 3412*333d2b36SAndroid Build Coastguard Worker // The name is the undecorated name of the java_sdk_library as it appears in the blueprint file 3413*333d2b36SAndroid Build Coastguard Worker // (without any prebuilt_ prefix) 3414*333d2b36SAndroid Build Coastguard Worker Created_by_java_sdk_library_name *string `blueprint:"mutated"` 3415*333d2b36SAndroid Build Coastguard Worker} 3416*333d2b36SAndroid Build Coastguard Worker 3417*333d2b36SAndroid Build Coastguard Workerfunc ApiContributionImportFactory() android.Module { 3418*333d2b36SAndroid Build Coastguard Worker module := &JavaApiContributionImport{} 3419*333d2b36SAndroid Build Coastguard Worker android.InitAndroidModule(module) 3420*333d2b36SAndroid Build Coastguard Worker android.InitDefaultableModule(module) 3421*333d2b36SAndroid Build Coastguard Worker android.InitPrebuiltModule(module, &[]string{""}) 3422*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties, &module.prebuiltProperties) 3423*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.sdkLibraryComponentProperties) 3424*333d2b36SAndroid Build Coastguard Worker return module 3425*333d2b36SAndroid Build Coastguard Worker} 3426*333d2b36SAndroid Build Coastguard Worker 3427*333d2b36SAndroid Build Coastguard Workerfunc (module *JavaApiContributionImport) Prebuilt() *android.Prebuilt { 3428*333d2b36SAndroid Build Coastguard Worker return &module.prebuilt 3429*333d2b36SAndroid Build Coastguard Worker} 3430*333d2b36SAndroid Build Coastguard Worker 3431*333d2b36SAndroid Build Coastguard Workerfunc (module *JavaApiContributionImport) Name() string { 3432*333d2b36SAndroid Build Coastguard Worker return module.prebuilt.Name(module.ModuleBase.Name()) 3433*333d2b36SAndroid Build Coastguard Worker} 3434*333d2b36SAndroid Build Coastguard Worker 3435*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaApiContributionImport) BaseModuleName() string { 3436*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(j.prebuiltProperties.Source_module_name, j.ModuleBase.Name()) 3437*333d2b36SAndroid Build Coastguard Worker} 3438*333d2b36SAndroid Build Coastguard Worker 3439*333d2b36SAndroid Build Coastguard Workerfunc (j *JavaApiContributionImport) CreatedByJavaSdkLibraryName() *string { 3440*333d2b36SAndroid Build Coastguard Worker return j.prebuiltProperties.Created_by_java_sdk_library_name 3441*333d2b36SAndroid Build Coastguard Worker} 3442*333d2b36SAndroid Build Coastguard Worker 3443*333d2b36SAndroid Build Coastguard Workerfunc (ap *JavaApiContributionImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { 3444*333d2b36SAndroid Build Coastguard Worker ap.JavaApiContribution.GenerateAndroidBuildActions(ctx) 3445*333d2b36SAndroid Build Coastguard Worker} 3446