1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "path/filepath" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker "android/soong/java/config" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc init() { 28*333d2b36SAndroid Build Coastguard Worker android.RegisterParallelSingletonType("sdk", sdkSingletonFactory) 29*333d2b36SAndroid Build Coastguard Worker android.RegisterMakeVarsProvider(pctx, sdkMakeVars) 30*333d2b36SAndroid Build Coastguard Worker} 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Workervar sdkFrameworkAidlPathKey = android.NewOnceKey("sdkFrameworkAidlPathKey") 33*333d2b36SAndroid Build Coastguard Workervar nonUpdatableFrameworkAidlPathKey = android.NewOnceKey("nonUpdatableFrameworkAidlPathKey") 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workerfunc UseApiFingerprint(ctx android.BaseModuleContext) (useApiFingerprint bool, fingerprintSdkVersion string, fingerprintDeps android.OutputPath) { 36*333d2b36SAndroid Build Coastguard Worker if ctx.Config().UnbundledBuild() && !ctx.Config().AlwaysUsePrebuiltSdks() { 37*333d2b36SAndroid Build Coastguard Worker apiFingerprintTrue := ctx.Config().IsEnvTrue("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT") 38*333d2b36SAndroid Build Coastguard Worker dessertShaIsSet := ctx.Config().Getenv("UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA") != "" 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker // Error when both UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT and UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA are set 41*333d2b36SAndroid Build Coastguard Worker if apiFingerprintTrue && dessertShaIsSet { 42*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT=true cannot be set alongside with UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA") 43*333d2b36SAndroid Build Coastguard Worker } 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker useApiFingerprint = apiFingerprintTrue || dessertShaIsSet 46*333d2b36SAndroid Build Coastguard Worker if apiFingerprintTrue { 47*333d2b36SAndroid Build Coastguard Worker fingerprintSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", android.ApiFingerprintPath(ctx).String()) 48*333d2b36SAndroid Build Coastguard Worker fingerprintDeps = android.ApiFingerprintPath(ctx) 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker if dessertShaIsSet { 51*333d2b36SAndroid Build Coastguard Worker fingerprintSdkVersion = ctx.Config().Getenv("UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA") 52*333d2b36SAndroid Build Coastguard Worker } 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker return useApiFingerprint, fingerprintSdkVersion, fingerprintDeps 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc defaultJavaLanguageVersion(ctx android.EarlyModuleContext, s android.SdkSpec) javaVersion { 58*333d2b36SAndroid Build Coastguard Worker sdk, err := s.EffectiveVersion(ctx) 59*333d2b36SAndroid Build Coastguard Worker if err != nil { 60*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", "%s", err) 61*333d2b36SAndroid Build Coastguard Worker } 62*333d2b36SAndroid Build Coastguard Worker if sdk.FinalOrFutureInt() <= 29 { 63*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_8 64*333d2b36SAndroid Build Coastguard Worker } else if sdk.FinalOrFutureInt() <= 31 { 65*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_9 66*333d2b36SAndroid Build Coastguard Worker } else if sdk.FinalOrFutureInt() <= 33 { 67*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_11 68*333d2b36SAndroid Build Coastguard Worker } else if ctx.Config().TargetsJava21() { 69*333d2b36SAndroid Build Coastguard Worker // Build flag that controls whether Java 21 is used as the 70*333d2b36SAndroid Build Coastguard Worker // default target version, or Java 17. 71*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_21 72*333d2b36SAndroid Build Coastguard Worker } else { 73*333d2b36SAndroid Build Coastguard Worker return JAVA_VERSION_17 74*333d2b36SAndroid Build Coastguard Worker } 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker// systemModuleKind returns the kind of system modules to use for the supplied combination of sdk 78*333d2b36SAndroid Build Coastguard Worker// kind and API level. 79*333d2b36SAndroid Build Coastguard Workerfunc systemModuleKind(sdkKind android.SdkKind, apiLevel android.ApiLevel) android.SdkKind { 80*333d2b36SAndroid Build Coastguard Worker systemModuleKind := sdkKind 81*333d2b36SAndroid Build Coastguard Worker if apiLevel.LessThanOrEqualTo(android.LastWithoutModuleLibCoreSystemModules) { 82*333d2b36SAndroid Build Coastguard Worker // API levels less than or equal to 31 did not provide a core-for-system-modules.jar 83*333d2b36SAndroid Build Coastguard Worker // specifically for the module-lib API. So, always use the public system modules for them. 84*333d2b36SAndroid Build Coastguard Worker systemModuleKind = android.SdkPublic 85*333d2b36SAndroid Build Coastguard Worker } else if systemModuleKind == android.SdkCore { 86*333d2b36SAndroid Build Coastguard Worker // Core is by definition what is included in the system module for the public API so should 87*333d2b36SAndroid Build Coastguard Worker // just use its system modules. 88*333d2b36SAndroid Build Coastguard Worker systemModuleKind = android.SdkPublic 89*333d2b36SAndroid Build Coastguard Worker } else if systemModuleKind == android.SdkSystem || systemModuleKind == android.SdkTest || 90*333d2b36SAndroid Build Coastguard Worker systemModuleKind == android.SdkTestFrameworksCore { 91*333d2b36SAndroid Build Coastguard Worker // The core system and test APIs are currently the same as the public API so they should use 92*333d2b36SAndroid Build Coastguard Worker // its system modules. 93*333d2b36SAndroid Build Coastguard Worker systemModuleKind = android.SdkPublic 94*333d2b36SAndroid Build Coastguard Worker } else if systemModuleKind == android.SdkSystemServer { 95*333d2b36SAndroid Build Coastguard Worker // The core system server API is the same as the core module-lib API. 96*333d2b36SAndroid Build Coastguard Worker systemModuleKind = android.SdkModule 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker return systemModuleKind 100*333d2b36SAndroid Build Coastguard Worker} 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Workerfunc decodeSdkDep(ctx android.EarlyModuleContext, sdkContext android.SdkContext) sdkDep { 103*333d2b36SAndroid Build Coastguard Worker sdkVersion := sdkContext.SdkVersion(ctx) 104*333d2b36SAndroid Build Coastguard Worker if !sdkVersion.Valid() { 105*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", "invalid version %q", sdkVersion.Raw) 106*333d2b36SAndroid Build Coastguard Worker return sdkDep{} 107*333d2b36SAndroid Build Coastguard Worker } 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker if ctx.DeviceSpecific() || ctx.SocSpecific() { 110*333d2b36SAndroid Build Coastguard Worker sdkVersion = sdkVersion.ForVendorPartition(ctx) 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker if !sdkVersion.ValidateSystemSdk(ctx) { 114*333d2b36SAndroid Build Coastguard Worker return sdkDep{} 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker if sdkVersion.UsePrebuilt(ctx) { 118*333d2b36SAndroid Build Coastguard Worker dir := filepath.Join("prebuilts", "sdk", sdkVersion.ApiLevel.String(), sdkVersion.Kind.String()) 119*333d2b36SAndroid Build Coastguard Worker jar := filepath.Join(dir, "android.jar") 120*333d2b36SAndroid Build Coastguard Worker // There's no aidl for other SDKs yet. 121*333d2b36SAndroid Build Coastguard Worker // TODO(77525052): Add aidl files for other SDKs too. 122*333d2b36SAndroid Build Coastguard Worker publicDir := filepath.Join("prebuilts", "sdk", sdkVersion.ApiLevel.String(), "public") 123*333d2b36SAndroid Build Coastguard Worker aidl := filepath.Join(publicDir, "framework.aidl") 124*333d2b36SAndroid Build Coastguard Worker jarPath := android.ExistentPathForSource(ctx, jar) 125*333d2b36SAndroid Build Coastguard Worker aidlPath := android.ExistentPathForSource(ctx, aidl) 126*333d2b36SAndroid Build Coastguard Worker lambdaStubsPath := android.PathForSource(ctx, config.SdkLambdaStubsPath) 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker if (!jarPath.Valid() || !aidlPath.Valid()) && ctx.Config().AllowMissingDependencies() { 129*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 130*333d2b36SAndroid Build Coastguard Worker invalidVersion: true, 131*333d2b36SAndroid Build Coastguard Worker bootclasspath: []string{fmt.Sprintf("sdk_%s_%s_android", sdkVersion.Kind, sdkVersion.ApiLevel.String())}, 132*333d2b36SAndroid Build Coastguard Worker } 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Worker if !jarPath.Valid() { 136*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", sdkVersion.Raw, jar) 137*333d2b36SAndroid Build Coastguard Worker return sdkDep{} 138*333d2b36SAndroid Build Coastguard Worker } 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker if !aidlPath.Valid() { 141*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", sdkVersion.Raw, aidl) 142*333d2b36SAndroid Build Coastguard Worker return sdkDep{} 143*333d2b36SAndroid Build Coastguard Worker } 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker var systemModules string 146*333d2b36SAndroid Build Coastguard Worker if defaultJavaLanguageVersion(ctx, sdkVersion).usesJavaModules() { 147*333d2b36SAndroid Build Coastguard Worker systemModuleKind := systemModuleKind(sdkVersion.Kind, sdkVersion.ApiLevel) 148*333d2b36SAndroid Build Coastguard Worker systemModules = fmt.Sprintf("sdk_%s_%s_system_modules", systemModuleKind, sdkVersion.ApiLevel) 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 152*333d2b36SAndroid Build Coastguard Worker useFiles: true, 153*333d2b36SAndroid Build Coastguard Worker jars: android.Paths{jarPath.Path(), lambdaStubsPath}, 154*333d2b36SAndroid Build Coastguard Worker aidl: android.OptionalPathForPath(aidlPath.Path()), 155*333d2b36SAndroid Build Coastguard Worker systemModules: systemModules, 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker toModule := func(module string, aidl android.Path) sdkDep { 160*333d2b36SAndroid Build Coastguard Worker // Select the kind of system modules needed for the sdk version. 161*333d2b36SAndroid Build Coastguard Worker systemModulesKind := systemModuleKind(sdkVersion.Kind, android.FutureApiLevel) 162*333d2b36SAndroid Build Coastguard Worker systemModules := fmt.Sprintf("core-%s-stubs-system-modules", systemModulesKind) 163*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 164*333d2b36SAndroid Build Coastguard Worker useModule: true, 165*333d2b36SAndroid Build Coastguard Worker bootclasspath: []string{module, config.DefaultLambdaStubsLibrary}, 166*333d2b36SAndroid Build Coastguard Worker systemModules: systemModules, 167*333d2b36SAndroid Build Coastguard Worker java9Classpath: []string{module}, 168*333d2b36SAndroid Build Coastguard Worker frameworkResModule: "framework-res", 169*333d2b36SAndroid Build Coastguard Worker aidl: android.OptionalPathForPath(aidl), 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker } 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker switch sdkVersion.Kind { 174*333d2b36SAndroid Build Coastguard Worker case android.SdkPrivate: 175*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 176*333d2b36SAndroid Build Coastguard Worker useModule: true, 177*333d2b36SAndroid Build Coastguard Worker systemModules: corePlatformSystemModules(ctx), 178*333d2b36SAndroid Build Coastguard Worker bootclasspath: corePlatformBootclasspathLibraries(ctx), 179*333d2b36SAndroid Build Coastguard Worker classpath: config.FrameworkLibraries, 180*333d2b36SAndroid Build Coastguard Worker frameworkResModule: "framework-res", 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker case android.SdkNone: 183*333d2b36SAndroid Build Coastguard Worker systemModules := sdkContext.SystemModules() 184*333d2b36SAndroid Build Coastguard Worker if systemModules == "" { 185*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("sdk_version", 186*333d2b36SAndroid Build Coastguard Worker `system_modules is required to be set to a non-empty value when sdk_version is "none", did you mean sdk_version: "core_platform"?`) 187*333d2b36SAndroid Build Coastguard Worker } else if systemModules == "none" { 188*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 189*333d2b36SAndroid Build Coastguard Worker noStandardLibs: true, 190*333d2b36SAndroid Build Coastguard Worker } 191*333d2b36SAndroid Build Coastguard Worker } 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 194*333d2b36SAndroid Build Coastguard Worker useModule: true, 195*333d2b36SAndroid Build Coastguard Worker noStandardLibs: true, 196*333d2b36SAndroid Build Coastguard Worker systemModules: systemModules, 197*333d2b36SAndroid Build Coastguard Worker bootclasspath: []string{systemModules}, 198*333d2b36SAndroid Build Coastguard Worker } 199*333d2b36SAndroid Build Coastguard Worker case android.SdkCorePlatform: 200*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 201*333d2b36SAndroid Build Coastguard Worker useModule: true, 202*333d2b36SAndroid Build Coastguard Worker systemModules: corePlatformSystemModules(ctx), 203*333d2b36SAndroid Build Coastguard Worker bootclasspath: corePlatformBootclasspathLibraries(ctx), 204*333d2b36SAndroid Build Coastguard Worker noFrameworksLibs: true, 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker case android.SdkPublic, android.SdkSystem, android.SdkTest, android.SdkTestFrameworksCore: 207*333d2b36SAndroid Build Coastguard Worker return toModule(sdkVersion.Kind.DefaultJavaLibraryName(), sdkFrameworkAidlPath(ctx)) 208*333d2b36SAndroid Build Coastguard Worker case android.SdkCore: 209*333d2b36SAndroid Build Coastguard Worker return sdkDep{ 210*333d2b36SAndroid Build Coastguard Worker useModule: true, 211*333d2b36SAndroid Build Coastguard Worker bootclasspath: []string{android.SdkCore.DefaultJavaLibraryName(), config.DefaultLambdaStubsLibrary}, 212*333d2b36SAndroid Build Coastguard Worker systemModules: "core-public-stubs-system-modules", 213*333d2b36SAndroid Build Coastguard Worker noFrameworksLibs: true, 214*333d2b36SAndroid Build Coastguard Worker } 215*333d2b36SAndroid Build Coastguard Worker case android.SdkModule: 216*333d2b36SAndroid Build Coastguard Worker // TODO(146757305): provide .apk and .aidl that have more APIs for modules 217*333d2b36SAndroid Build Coastguard Worker return toModule(sdkVersion.Kind.DefaultJavaLibraryName(), nonUpdatableFrameworkAidlPath(ctx)) 218*333d2b36SAndroid Build Coastguard Worker case android.SdkSystemServer: 219*333d2b36SAndroid Build Coastguard Worker // TODO(146757305): provide .apk and .aidl that have more APIs for modules 220*333d2b36SAndroid Build Coastguard Worker return toModule(sdkVersion.Kind.DefaultJavaLibraryName(), sdkFrameworkAidlPath(ctx)) 221*333d2b36SAndroid Build Coastguard Worker default: 222*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("invalid sdk %q", sdkVersion.Raw)) 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker} 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Workerfunc sdkSingletonFactory() android.Singleton { 227*333d2b36SAndroid Build Coastguard Worker return sdkSingleton{} 228*333d2b36SAndroid Build Coastguard Worker} 229*333d2b36SAndroid Build Coastguard Worker 230*333d2b36SAndroid Build Coastguard Workertype sdkSingleton struct{} 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Workerfunc (sdkSingleton) GenerateBuildActions(ctx android.SingletonContext) { 233*333d2b36SAndroid Build Coastguard Worker if ctx.Config().AlwaysUsePrebuiltSdks() { 234*333d2b36SAndroid Build Coastguard Worker return 235*333d2b36SAndroid Build Coastguard Worker } 236*333d2b36SAndroid Build Coastguard Worker 237*333d2b36SAndroid Build Coastguard Worker createSdkFrameworkAidl(ctx) 238*333d2b36SAndroid Build Coastguard Worker createNonUpdatableFrameworkAidl(ctx) 239*333d2b36SAndroid Build Coastguard Worker createAPIFingerprint(ctx) 240*333d2b36SAndroid Build Coastguard Worker} 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker// Create framework.aidl by extracting anything that implements android.os.Parcelable from the SDK stubs modules. 243*333d2b36SAndroid Build Coastguard Workerfunc createSdkFrameworkAidl(ctx android.SingletonContext) { 244*333d2b36SAndroid Build Coastguard Worker stubsModules := []string{ 245*333d2b36SAndroid Build Coastguard Worker android.SdkPublic.DefaultJavaLibraryName(), 246*333d2b36SAndroid Build Coastguard Worker android.SdkTest.DefaultJavaLibraryName(), 247*333d2b36SAndroid Build Coastguard Worker android.SdkSystem.DefaultJavaLibraryName(), 248*333d2b36SAndroid Build Coastguard Worker } 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Worker combinedAidl := sdkFrameworkAidlPath(ctx) 251*333d2b36SAndroid Build Coastguard Worker tempPath := tempPathForRestat(ctx, combinedAidl) 252*333d2b36SAndroid Build Coastguard Worker 253*333d2b36SAndroid Build Coastguard Worker rule := createFrameworkAidl(stubsModules, tempPath, ctx) 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Worker commitChangeForRestat(rule, tempPath, combinedAidl) 256*333d2b36SAndroid Build Coastguard Worker 257*333d2b36SAndroid Build Coastguard Worker rule.Build("framework_aidl", "generate framework.aidl") 258*333d2b36SAndroid Build Coastguard Worker} 259*333d2b36SAndroid Build Coastguard Worker 260*333d2b36SAndroid Build Coastguard Worker// Creates a version of framework.aidl for the non-updatable part of the platform. 261*333d2b36SAndroid Build Coastguard Workerfunc createNonUpdatableFrameworkAidl(ctx android.SingletonContext) { 262*333d2b36SAndroid Build Coastguard Worker stubsModules := []string{android.SdkModule.DefaultJavaLibraryName()} 263*333d2b36SAndroid Build Coastguard Worker 264*333d2b36SAndroid Build Coastguard Worker combinedAidl := nonUpdatableFrameworkAidlPath(ctx) 265*333d2b36SAndroid Build Coastguard Worker tempPath := tempPathForRestat(ctx, combinedAidl) 266*333d2b36SAndroid Build Coastguard Worker 267*333d2b36SAndroid Build Coastguard Worker rule := createFrameworkAidl(stubsModules, tempPath, ctx) 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Worker commitChangeForRestat(rule, tempPath, combinedAidl) 270*333d2b36SAndroid Build Coastguard Worker 271*333d2b36SAndroid Build Coastguard Worker rule.Build("framework_non_updatable_aidl", "generate framework_non_updatable.aidl") 272*333d2b36SAndroid Build Coastguard Worker} 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Workerfunc createFrameworkAidl(stubsModules []string, path android.WritablePath, ctx android.SingletonContext) *android.RuleBuilder { 275*333d2b36SAndroid Build Coastguard Worker stubsJars := make([]android.Paths, len(stubsModules)) 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module android.Module) { 278*333d2b36SAndroid Build Coastguard Worker // Collect dex jar paths for the modules listed above. 279*333d2b36SAndroid Build Coastguard Worker if j, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { 280*333d2b36SAndroid Build Coastguard Worker name := ctx.ModuleName(module) 281*333d2b36SAndroid Build Coastguard Worker if i := android.IndexList(name, stubsModules); i != -1 { 282*333d2b36SAndroid Build Coastguard Worker stubsJars[i] = j.HeaderJars 283*333d2b36SAndroid Build Coastguard Worker } 284*333d2b36SAndroid Build Coastguard Worker } 285*333d2b36SAndroid Build Coastguard Worker }) 286*333d2b36SAndroid Build Coastguard Worker 287*333d2b36SAndroid Build Coastguard Worker var missingDeps []string 288*333d2b36SAndroid Build Coastguard Worker 289*333d2b36SAndroid Build Coastguard Worker for i := range stubsJars { 290*333d2b36SAndroid Build Coastguard Worker if stubsJars[i] == nil { 291*333d2b36SAndroid Build Coastguard Worker if ctx.Config().AllowMissingDependencies() { 292*333d2b36SAndroid Build Coastguard Worker missingDeps = append(missingDeps, stubsModules[i]) 293*333d2b36SAndroid Build Coastguard Worker } else { 294*333d2b36SAndroid Build Coastguard Worker ctx.Errorf("failed to find dex jar path for module %q", stubsModules[i]) 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker } 297*333d2b36SAndroid Build Coastguard Worker } 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 300*333d2b36SAndroid Build Coastguard Worker rule.MissingDeps(missingDeps) 301*333d2b36SAndroid Build Coastguard Worker 302*333d2b36SAndroid Build Coastguard Worker var aidls android.Paths 303*333d2b36SAndroid Build Coastguard Worker for _, jars := range stubsJars { 304*333d2b36SAndroid Build Coastguard Worker for _, jar := range jars { 305*333d2b36SAndroid Build Coastguard Worker aidl := android.PathForOutput(ctx, "aidl", pathtools.ReplaceExtension(jar.Base(), "aidl")) 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker rule.Command(). 308*333d2b36SAndroid Build Coastguard Worker Text("rm -f").Output(aidl) 309*333d2b36SAndroid Build Coastguard Worker 310*333d2b36SAndroid Build Coastguard Worker rule.Command(). 311*333d2b36SAndroid Build Coastguard Worker BuiltTool("sdkparcelables"). 312*333d2b36SAndroid Build Coastguard Worker Input(jar). 313*333d2b36SAndroid Build Coastguard Worker Output(aidl). 314*333d2b36SAndroid Build Coastguard Worker Flag("--guarantee_stable") 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker aidls = append(aidls, aidl) 317*333d2b36SAndroid Build Coastguard Worker } 318*333d2b36SAndroid Build Coastguard Worker } 319*333d2b36SAndroid Build Coastguard Worker 320*333d2b36SAndroid Build Coastguard Worker rule.Command(). 321*333d2b36SAndroid Build Coastguard Worker Text("rm -f").Output(path) 322*333d2b36SAndroid Build Coastguard Worker rule.Command(). 323*333d2b36SAndroid Build Coastguard Worker Text("cat"). 324*333d2b36SAndroid Build Coastguard Worker Inputs(aidls). 325*333d2b36SAndroid Build Coastguard Worker Text("| sort -u >"). 326*333d2b36SAndroid Build Coastguard Worker Output(path) 327*333d2b36SAndroid Build Coastguard Worker 328*333d2b36SAndroid Build Coastguard Worker return rule 329*333d2b36SAndroid Build Coastguard Worker} 330*333d2b36SAndroid Build Coastguard Worker 331*333d2b36SAndroid Build Coastguard Workerfunc sdkFrameworkAidlPath(ctx android.PathContext) android.OutputPath { 332*333d2b36SAndroid Build Coastguard Worker return ctx.Config().Once(sdkFrameworkAidlPathKey, func() interface{} { 333*333d2b36SAndroid Build Coastguard Worker return android.PathForOutput(ctx, "framework.aidl") 334*333d2b36SAndroid Build Coastguard Worker }).(android.OutputPath) 335*333d2b36SAndroid Build Coastguard Worker} 336*333d2b36SAndroid Build Coastguard Worker 337*333d2b36SAndroid Build Coastguard Workerfunc nonUpdatableFrameworkAidlPath(ctx android.PathContext) android.OutputPath { 338*333d2b36SAndroid Build Coastguard Worker return ctx.Config().Once(nonUpdatableFrameworkAidlPathKey, func() interface{} { 339*333d2b36SAndroid Build Coastguard Worker return android.PathForOutput(ctx, "framework_non_updatable.aidl") 340*333d2b36SAndroid Build Coastguard Worker }).(android.OutputPath) 341*333d2b36SAndroid Build Coastguard Worker} 342*333d2b36SAndroid Build Coastguard Worker 343*333d2b36SAndroid Build Coastguard Worker// Create api_fingerprint.txt 344*333d2b36SAndroid Build Coastguard Workerfunc createAPIFingerprint(ctx android.SingletonContext) { 345*333d2b36SAndroid Build Coastguard Worker out := android.ApiFingerprintPath(ctx) 346*333d2b36SAndroid Build Coastguard Worker 347*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker rule.Command(). 350*333d2b36SAndroid Build Coastguard Worker Text("rm -f").Output(out) 351*333d2b36SAndroid Build Coastguard Worker cmd := rule.Command() 352*333d2b36SAndroid Build Coastguard Worker 353*333d2b36SAndroid Build Coastguard Worker if ctx.Config().PlatformSdkCodename() == "REL" { 354*333d2b36SAndroid Build Coastguard Worker cmd.Text("echo REL >").Output(out) 355*333d2b36SAndroid Build Coastguard Worker } else if ctx.Config().FrameworksBaseDirExists(ctx) && !ctx.Config().AlwaysUsePrebuiltSdks() { 356*333d2b36SAndroid Build Coastguard Worker cmd.Text("cat") 357*333d2b36SAndroid Build Coastguard Worker apiTxtFileModules := []string{ 358*333d2b36SAndroid Build Coastguard Worker "api_fingerprint", 359*333d2b36SAndroid Build Coastguard Worker } 360*333d2b36SAndroid Build Coastguard Worker count := 0 361*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module android.Module) { 362*333d2b36SAndroid Build Coastguard Worker name := ctx.ModuleName(module) 363*333d2b36SAndroid Build Coastguard Worker if android.InList(name, apiTxtFileModules) { 364*333d2b36SAndroid Build Coastguard Worker cmd.Inputs(android.OutputFilesForModule(ctx, module, "")) 365*333d2b36SAndroid Build Coastguard Worker count++ 366*333d2b36SAndroid Build Coastguard Worker } 367*333d2b36SAndroid Build Coastguard Worker }) 368*333d2b36SAndroid Build Coastguard Worker if count != len(apiTxtFileModules) { 369*333d2b36SAndroid Build Coastguard Worker ctx.Errorf("Could not find expected API module %v, found %d\n", apiTxtFileModules, count) 370*333d2b36SAndroid Build Coastguard Worker return 371*333d2b36SAndroid Build Coastguard Worker } 372*333d2b36SAndroid Build Coastguard Worker cmd.Text(">"). 373*333d2b36SAndroid Build Coastguard Worker Output(out) 374*333d2b36SAndroid Build Coastguard Worker } else { 375*333d2b36SAndroid Build Coastguard Worker // Unbundled build 376*333d2b36SAndroid Build Coastguard Worker // TODO: use a prebuilt api_fingerprint.txt from prebuilts/sdk/current.txt once we have one 377*333d2b36SAndroid Build Coastguard Worker cmd.Text("echo"). 378*333d2b36SAndroid Build Coastguard Worker Flag(ctx.Config().PlatformPreviewSdkVersion()). 379*333d2b36SAndroid Build Coastguard Worker Text(">"). 380*333d2b36SAndroid Build Coastguard Worker Output(out) 381*333d2b36SAndroid Build Coastguard Worker } 382*333d2b36SAndroid Build Coastguard Worker 383*333d2b36SAndroid Build Coastguard Worker rule.Build("api_fingerprint", "generate api_fingerprint.txt") 384*333d2b36SAndroid Build Coastguard Worker} 385*333d2b36SAndroid Build Coastguard Worker 386*333d2b36SAndroid Build Coastguard Workerfunc sdkMakeVars(ctx android.MakeVarsContext) { 387*333d2b36SAndroid Build Coastguard Worker if ctx.Config().AlwaysUsePrebuiltSdks() { 388*333d2b36SAndroid Build Coastguard Worker return 389*333d2b36SAndroid Build Coastguard Worker } 390*333d2b36SAndroid Build Coastguard Worker 391*333d2b36SAndroid Build Coastguard Worker ctx.Strict("FRAMEWORK_AIDL", sdkFrameworkAidlPath(ctx).String()) 392*333d2b36SAndroid Build Coastguard Worker ctx.Strict("API_FINGERPRINT", android.ApiFingerprintPath(ctx).String()) 393*333d2b36SAndroid Build Coastguard Worker} 394