1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 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 "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker "android/soong/etc" 20*333d2b36SAndroid Build Coastguard Worker "fmt" 21*333d2b36SAndroid Build Coastguard Worker "path" 22*333d2b36SAndroid Build Coastguard Worker "strings" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 28*333d2b36SAndroid Build Coastguard Worker// Naming scheme of the submodules generated by java_sdk_library and java_sdk_library_import 29*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerconst ( 32*333d2b36SAndroid Build Coastguard Worker sdkXmlFileSuffix = ".xml" 33*333d2b36SAndroid Build Coastguard Worker implLibSuffix = ".impl" 34*333d2b36SAndroid Build Coastguard Worker) 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerfunc implLibraryModuleName(sdkLibName string) string { 37*333d2b36SAndroid Build Coastguard Worker return sdkLibName + implLibSuffix 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker// Module name of the runtime implementation library 41*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) implLibraryModuleName() string { 42*333d2b36SAndroid Build Coastguard Worker return implLibraryModuleName(c.module.RootLibraryName()) 43*333d2b36SAndroid Build Coastguard Worker} 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker// Module name of the XML file for the lib 46*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) xmlPermissionsModuleName() string { 47*333d2b36SAndroid Build Coastguard Worker return c.module.RootLibraryName() + sdkXmlFileSuffix 48*333d2b36SAndroid Build Coastguard Worker} 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the stubs source. 51*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) stubsLibraryModuleName(apiScope *apiScope) string { 52*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 53*333d2b36SAndroid Build Coastguard Worker return apiScope.stubsLibraryModuleName(baseName) 54*333d2b36SAndroid Build Coastguard Worker} 55*333d2b36SAndroid Build Coastguard Worker 56*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the exportable stubs source. 57*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) exportableStubsLibraryModuleName(apiScope *apiScope) string { 58*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 59*333d2b36SAndroid Build Coastguard Worker return apiScope.exportableStubsLibraryModuleName(baseName) 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker// Name of the droidstubs module that generates the stubs source and may also 63*333d2b36SAndroid Build Coastguard Worker// generate/check the API. 64*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) droidstubsModuleName(apiScope *apiScope) string { 65*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 66*333d2b36SAndroid Build Coastguard Worker return apiScope.stubsSourceModuleName(baseName) 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker// Name of the java_api_library module that generates the from-text stubs source 70*333d2b36SAndroid Build Coastguard Worker// and compiles to a jar file. 71*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) fromTextStubsLibraryModuleName(apiScope *apiScope) string { 72*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 73*333d2b36SAndroid Build Coastguard Worker return apiScope.apiLibraryModuleName(baseName) 74*333d2b36SAndroid Build Coastguard Worker} 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the stubs 77*333d2b36SAndroid Build Coastguard Worker// generated from source Java files. 78*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) fromSourceStubsLibraryModuleName(apiScope *apiScope) string { 79*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 80*333d2b36SAndroid Build Coastguard Worker return apiScope.sourceStubsLibraryModuleName(baseName) 81*333d2b36SAndroid Build Coastguard Worker} 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker// Name of the java_library module that compiles the exportable stubs 84*333d2b36SAndroid Build Coastguard Worker// generated from source Java files. 85*333d2b36SAndroid Build Coastguard Workerfunc (c *commonToSdkLibraryAndImport) exportableFromSourceStubsLibraryModuleName(apiScope *apiScope) string { 86*333d2b36SAndroid Build Coastguard Worker baseName := c.module.RootLibraryName() 87*333d2b36SAndroid Build Coastguard Worker return apiScope.exportableSourceStubsLibraryModuleName(baseName) 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 91*333d2b36SAndroid Build Coastguard Worker// Build rules of the submodules generated by java_sdk_library. 92*333d2b36SAndroid Build Coastguard Worker// java_sdk_library "framework-foo" generates the following submodules: 93*333d2b36SAndroid Build Coastguard Worker// 94*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.impl" (type: [Library]): the implementation library, which generates the 95*333d2b36SAndroid Build Coastguard Worker// compilation outputs that include the implementation details and the private apis 96*333d2b36SAndroid Build Coastguard Worker// (i.e. class/methods that are annotated @hide). 97*333d2b36SAndroid Build Coastguard Worker// 98*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>" (type: [Droidstubs]): droidstubs module that 99*333d2b36SAndroid Build Coastguard Worker// generates the stubs and the api files for the given api scope. 100*333d2b36SAndroid Build Coastguard Worker// 101*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>" (type: [Library]): stub library module that 102*333d2b36SAndroid Build Coastguard Worker// provides the compilation output of the stubs to the reverse dependencies. The module 103*333d2b36SAndroid Build Coastguard Worker// itself does not perform any compilation actions; the module statically depends on one of 104*333d2b36SAndroid Build Coastguard Worker// the from-source stub module or the from-text stub configuration based on the build 105*333d2b36SAndroid Build Coastguard Worker// configuration. 106*333d2b36SAndroid Build Coastguard Worker// 107*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>.from-source" (type: [Library]): stub library module 108*333d2b36SAndroid Build Coastguard Worker// that compiles the stubs generated by the droidstubs submodule. This module is a static 109*333d2b36SAndroid Build Coastguard Worker// dependency of the stub library module when 110*333d2b36SAndroid Build Coastguard Worker// [android/soong/android/config.BuildFromTextStub()] is false. 111*333d2b36SAndroid Build Coastguard Worker// 112*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>.from-text" (type: [ApiLibrary]): api library module 113*333d2b36SAndroid Build Coastguard Worker// that generates and compiles the stubs from the api files checked in the tree instead of 114*333d2b36SAndroid Build Coastguard Worker// the source Java files (e.g. *-current.txt files). This module is a static dependency of 115*333d2b36SAndroid Build Coastguard Worker// the stub library module when [android/soong/android/config.BuildFromTextStub()] is true. 116*333d2b36SAndroid Build Coastguard Worker// 117*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.exportable.<[apiScope.name]>" (type: [Library]): stub library module 118*333d2b36SAndroid Build Coastguard Worker// that provides the "exportable" stubs. "exportable" stubs are the stubs that do not 119*333d2b36SAndroid Build Coastguard Worker// include in-development flagged apis. This module is only used for SDK builds to generate 120*333d2b36SAndroid Build Coastguard Worker// the SDK artifacts, and not purposed for consumption for other modules. 121*333d2b36SAndroid Build Coastguard Worker// 122*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.exportable.<[apiScope.name]>.from-source" (type: [Library]): stub 123*333d2b36SAndroid Build Coastguard Worker// library module that compiles the "exportable" stubs generated by the droidstubs 124*333d2b36SAndroid Build Coastguard Worker// submodule. This module is always a static dependency of the "exportable" stub library 125*333d2b36SAndroid Build Coastguard Worker// module given that from-text stubs cannot be used for SDK builds as it does not contain 126*333d2b36SAndroid Build Coastguard Worker// documentations. 127*333d2b36SAndroid Build Coastguard Worker// 128*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.xml" (type: [sdkLibraryXml]): xml library that generates the permission xml 129*333d2b36SAndroid Build Coastguard Worker// file, which allows [SdkLibrary] to be used with <uses-permission> tag in the 130*333d2b36SAndroid Build Coastguard Worker// AndroidManifest.xml files. 131*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Worker// Creates the implementation [Library] with ".impl" suffix. 134*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext) { 135*333d2b36SAndroid Build Coastguard Worker visibility := childModuleVisibility(module.sdkLibraryProperties.Impl_library_visibility) 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker staticLibs := module.properties.Static_libs.Clone() 138*333d2b36SAndroid Build Coastguard Worker staticLibs.AppendSimpleValue(module.sdkLibraryProperties.Impl_only_static_libs) 139*333d2b36SAndroid Build Coastguard Worker props := struct { 140*333d2b36SAndroid Build Coastguard Worker Name *string 141*333d2b36SAndroid Build Coastguard Worker Enabled proptools.Configurable[bool] 142*333d2b36SAndroid Build Coastguard Worker Visibility []string 143*333d2b36SAndroid Build Coastguard Worker Libs []string 144*333d2b36SAndroid Build Coastguard Worker Static_libs proptools.Configurable[[]string] 145*333d2b36SAndroid Build Coastguard Worker Apex_available []string 146*333d2b36SAndroid Build Coastguard Worker Stem *string 147*333d2b36SAndroid Build Coastguard Worker }{ 148*333d2b36SAndroid Build Coastguard Worker Name: proptools.StringPtr(module.implLibraryModuleName()), 149*333d2b36SAndroid Build Coastguard Worker Enabled: module.EnabledProperty(), 150*333d2b36SAndroid Build Coastguard Worker Visibility: visibility, 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker Libs: append(module.properties.Libs, module.sdkLibraryProperties.Impl_only_libs...), 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker Static_libs: staticLibs, 155*333d2b36SAndroid Build Coastguard Worker // Pass the apex_available settings down so that the impl library can be statically 156*333d2b36SAndroid Build Coastguard Worker // embedded within a library that is added to an APEX. Needed for updatable-media. 157*333d2b36SAndroid Build Coastguard Worker Apex_available: module.ApexAvailable(), 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker Stem: proptools.StringPtr(module.Name()), 160*333d2b36SAndroid Build Coastguard Worker } 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker properties := []interface{}{ 163*333d2b36SAndroid Build Coastguard Worker &module.properties, 164*333d2b36SAndroid Build Coastguard Worker &module.protoProperties, 165*333d2b36SAndroid Build Coastguard Worker &module.deviceProperties, 166*333d2b36SAndroid Build Coastguard Worker &module.dexProperties, 167*333d2b36SAndroid Build Coastguard Worker &module.dexpreoptProperties, 168*333d2b36SAndroid Build Coastguard Worker &module.linter.properties, 169*333d2b36SAndroid Build Coastguard Worker &module.overridableProperties, 170*333d2b36SAndroid Build Coastguard Worker &props, 171*333d2b36SAndroid Build Coastguard Worker module.sdkComponentPropertiesForChildLibrary(), 172*333d2b36SAndroid Build Coastguard Worker } 173*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(LibraryFactory, properties...) 174*333d2b36SAndroid Build Coastguard Worker} 175*333d2b36SAndroid Build Coastguard Worker 176*333d2b36SAndroid Build Coastguard Worker// Creates the [Droidstubs] module with ".stubs.source.<[apiScope.name]>" that creates stubs 177*333d2b36SAndroid Build Coastguard Worker// source files from the given full source files and also updates and checks the API 178*333d2b36SAndroid Build Coastguard Worker// specification files (i.e. "*-current.txt", "*-removed.txt" files). 179*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createDroidstubs(mctx android.DefaultableHookContext, apiScope *apiScope, name string, scopeSpecificDroidstubsArgs []string) { 180*333d2b36SAndroid Build Coastguard Worker props := struct { 181*333d2b36SAndroid Build Coastguard Worker Name *string 182*333d2b36SAndroid Build Coastguard Worker Enabled proptools.Configurable[bool] 183*333d2b36SAndroid Build Coastguard Worker Visibility []string 184*333d2b36SAndroid Build Coastguard Worker Srcs []string 185*333d2b36SAndroid Build Coastguard Worker Installable *bool 186*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 187*333d2b36SAndroid Build Coastguard Worker Api_surface *string 188*333d2b36SAndroid Build Coastguard Worker System_modules *string 189*333d2b36SAndroid Build Coastguard Worker Libs proptools.Configurable[[]string] 190*333d2b36SAndroid Build Coastguard Worker Output_javadoc_comments *bool 191*333d2b36SAndroid Build Coastguard Worker Arg_files []string 192*333d2b36SAndroid Build Coastguard Worker Args *string 193*333d2b36SAndroid Build Coastguard Worker Java_version *string 194*333d2b36SAndroid Build Coastguard Worker Annotations_enabled *bool 195*333d2b36SAndroid Build Coastguard Worker Merge_annotations_dirs []string 196*333d2b36SAndroid Build Coastguard Worker Merge_inclusion_annotations_dirs []string 197*333d2b36SAndroid Build Coastguard Worker Generate_stubs *bool 198*333d2b36SAndroid Build Coastguard Worker Previous_api *string 199*333d2b36SAndroid Build Coastguard Worker Aconfig_declarations []string 200*333d2b36SAndroid Build Coastguard Worker Check_api struct { 201*333d2b36SAndroid Build Coastguard Worker Current ApiToCheck 202*333d2b36SAndroid Build Coastguard Worker Last_released ApiToCheck 203*333d2b36SAndroid Build Coastguard Worker 204*333d2b36SAndroid Build Coastguard Worker Api_lint struct { 205*333d2b36SAndroid Build Coastguard Worker Enabled *bool 206*333d2b36SAndroid Build Coastguard Worker New_since *string 207*333d2b36SAndroid Build Coastguard Worker Baseline_file *string 208*333d2b36SAndroid Build Coastguard Worker } 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker Aidl struct { 211*333d2b36SAndroid Build Coastguard Worker Include_dirs []string 212*333d2b36SAndroid Build Coastguard Worker Local_include_dirs []string 213*333d2b36SAndroid Build Coastguard Worker } 214*333d2b36SAndroid Build Coastguard Worker Dists []android.Dist 215*333d2b36SAndroid Build Coastguard Worker }{} 216*333d2b36SAndroid Build Coastguard Worker 217*333d2b36SAndroid Build Coastguard Worker // The stubs source processing uses the same compile time classpath when extracting the 218*333d2b36SAndroid Build Coastguard Worker // API from the implementation library as it does when compiling it. i.e. the same 219*333d2b36SAndroid Build Coastguard Worker // * sdk version 220*333d2b36SAndroid Build Coastguard Worker // * system_modules 221*333d2b36SAndroid Build Coastguard Worker // * libs (static_libs/libs) 222*333d2b36SAndroid Build Coastguard Worker 223*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(name) 224*333d2b36SAndroid Build Coastguard Worker props.Enabled = module.EnabledProperty() 225*333d2b36SAndroid Build Coastguard Worker props.Visibility = childModuleVisibility(module.sdkLibraryProperties.Stubs_source_visibility) 226*333d2b36SAndroid Build Coastguard Worker props.Srcs = append(props.Srcs, module.properties.Srcs...) 227*333d2b36SAndroid Build Coastguard Worker props.Srcs = append(props.Srcs, module.sdkLibraryProperties.Api_srcs...) 228*333d2b36SAndroid Build Coastguard Worker props.Sdk_version = module.deviceProperties.Sdk_version 229*333d2b36SAndroid Build Coastguard Worker props.Api_surface = &apiScope.name 230*333d2b36SAndroid Build Coastguard Worker props.System_modules = module.deviceProperties.System_modules 231*333d2b36SAndroid Build Coastguard Worker props.Installable = proptools.BoolPtr(false) 232*333d2b36SAndroid Build Coastguard Worker // A droiddoc module has only one Libs property and doesn't distinguish between 233*333d2b36SAndroid Build Coastguard Worker // shared libs and static libs. So we need to add both of these libs to Libs property. 234*333d2b36SAndroid Build Coastguard Worker props.Libs = proptools.NewConfigurable[[]string](nil, nil) 235*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.properties.Libs) 236*333d2b36SAndroid Build Coastguard Worker props.Libs.Append(module.properties.Static_libs) 237*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.sdkLibraryProperties.Stub_only_libs) 238*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.scopeToProperties[apiScope].Libs) 239*333d2b36SAndroid Build Coastguard Worker props.Aidl.Include_dirs = module.deviceProperties.Aidl.Include_dirs 240*333d2b36SAndroid Build Coastguard Worker props.Aidl.Local_include_dirs = module.deviceProperties.Aidl.Local_include_dirs 241*333d2b36SAndroid Build Coastguard Worker props.Java_version = module.properties.Java_version 242*333d2b36SAndroid Build Coastguard Worker 243*333d2b36SAndroid Build Coastguard Worker props.Annotations_enabled = module.sdkLibraryProperties.Annotations_enabled 244*333d2b36SAndroid Build Coastguard Worker props.Merge_annotations_dirs = module.sdkLibraryProperties.Merge_annotations_dirs 245*333d2b36SAndroid Build Coastguard Worker props.Merge_inclusion_annotations_dirs = module.sdkLibraryProperties.Merge_inclusion_annotations_dirs 246*333d2b36SAndroid Build Coastguard Worker props.Aconfig_declarations = module.sdkLibraryProperties.Aconfig_declarations 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Worker droidstubsArgs := []string{} 249*333d2b36SAndroid Build Coastguard Worker if len(module.sdkLibraryProperties.Api_packages) != 0 { 250*333d2b36SAndroid Build Coastguard Worker droidstubsArgs = append(droidstubsArgs, "--stub-packages "+strings.Join(module.sdkLibraryProperties.Api_packages, ":")) 251*333d2b36SAndroid Build Coastguard Worker } 252*333d2b36SAndroid Build Coastguard Worker droidstubsArgs = append(droidstubsArgs, module.sdkLibraryProperties.Droiddoc_options...) 253*333d2b36SAndroid Build Coastguard Worker disabledWarnings := []string{"HiddenSuperclass"} 254*333d2b36SAndroid Build Coastguard Worker if proptools.BoolDefault(module.sdkLibraryProperties.Api_lint.Legacy_errors_allowed, true) { 255*333d2b36SAndroid Build Coastguard Worker disabledWarnings = append(disabledWarnings, 256*333d2b36SAndroid Build Coastguard Worker "BroadcastBehavior", 257*333d2b36SAndroid Build Coastguard Worker "DeprecationMismatch", 258*333d2b36SAndroid Build Coastguard Worker "MissingPermission", 259*333d2b36SAndroid Build Coastguard Worker "SdkConstant", 260*333d2b36SAndroid Build Coastguard Worker "Todo", 261*333d2b36SAndroid Build Coastguard Worker ) 262*333d2b36SAndroid Build Coastguard Worker } 263*333d2b36SAndroid Build Coastguard Worker droidstubsArgs = append(droidstubsArgs, android.JoinWithPrefix(disabledWarnings, "--hide ")) 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker // Output Javadoc comments for public scope. 266*333d2b36SAndroid Build Coastguard Worker if apiScope == apiScopePublic { 267*333d2b36SAndroid Build Coastguard Worker props.Output_javadoc_comments = proptools.BoolPtr(true) 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker 270*333d2b36SAndroid Build Coastguard Worker // Add in scope specific arguments. 271*333d2b36SAndroid Build Coastguard Worker droidstubsArgs = append(droidstubsArgs, scopeSpecificDroidstubsArgs...) 272*333d2b36SAndroid Build Coastguard Worker props.Arg_files = module.sdkLibraryProperties.Droiddoc_option_files 273*333d2b36SAndroid Build Coastguard Worker props.Args = proptools.StringPtr(strings.Join(droidstubsArgs, " ")) 274*333d2b36SAndroid Build Coastguard Worker 275*333d2b36SAndroid Build Coastguard Worker // List of APIs identified from the provided source files are created. They are later 276*333d2b36SAndroid Build Coastguard Worker // compared against to the not-yet-released (a.k.a current) list of APIs and to the 277*333d2b36SAndroid Build Coastguard Worker // last-released (a.k.a numbered) list of API. 278*333d2b36SAndroid Build Coastguard Worker currentApiFileName := apiScope.apiFilePrefix + "current.txt" 279*333d2b36SAndroid Build Coastguard Worker removedApiFileName := apiScope.apiFilePrefix + "removed.txt" 280*333d2b36SAndroid Build Coastguard Worker apiDir := module.getApiDir() 281*333d2b36SAndroid Build Coastguard Worker currentApiFileName = path.Join(apiDir, currentApiFileName) 282*333d2b36SAndroid Build Coastguard Worker removedApiFileName = path.Join(apiDir, removedApiFileName) 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker // check against the not-yet-release API 285*333d2b36SAndroid Build Coastguard Worker props.Check_api.Current.Api_file = proptools.StringPtr(currentApiFileName) 286*333d2b36SAndroid Build Coastguard Worker props.Check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName) 287*333d2b36SAndroid Build Coastguard Worker 288*333d2b36SAndroid Build Coastguard Worker if module.compareAgainstLatestApi(apiScope) { 289*333d2b36SAndroid Build Coastguard Worker // check against the latest released API 290*333d2b36SAndroid Build Coastguard Worker latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope)) 291*333d2b36SAndroid Build Coastguard Worker props.Previous_api = latestApiFilegroupName 292*333d2b36SAndroid Build Coastguard Worker props.Check_api.Last_released.Api_file = latestApiFilegroupName 293*333d2b36SAndroid Build Coastguard Worker props.Check_api.Last_released.Removed_api_file = proptools.StringPtr( 294*333d2b36SAndroid Build Coastguard Worker module.latestRemovedApiFilegroupName(apiScope)) 295*333d2b36SAndroid Build Coastguard Worker props.Check_api.Last_released.Baseline_file = proptools.StringPtr( 296*333d2b36SAndroid Build Coastguard Worker module.latestIncompatibilitiesFilegroupName(apiScope)) 297*333d2b36SAndroid Build Coastguard Worker 298*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(module.sdkLibraryProperties.Api_lint.Enabled) { 299*333d2b36SAndroid Build Coastguard Worker // Enable api lint. 300*333d2b36SAndroid Build Coastguard Worker props.Check_api.Api_lint.Enabled = proptools.BoolPtr(true) 301*333d2b36SAndroid Build Coastguard Worker props.Check_api.Api_lint.New_since = latestApiFilegroupName 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker // If it exists then pass a lint-baseline.txt through to droidstubs. 304*333d2b36SAndroid Build Coastguard Worker baselinePath := path.Join(apiDir, apiScope.apiFilePrefix+"lint-baseline.txt") 305*333d2b36SAndroid Build Coastguard Worker baselinePathRelativeToRoot := path.Join(mctx.ModuleDir(), baselinePath) 306*333d2b36SAndroid Build Coastguard Worker paths, err := mctx.GlobWithDeps(baselinePathRelativeToRoot, nil) 307*333d2b36SAndroid Build Coastguard Worker if err != nil { 308*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("error checking for presence of %s: %s", baselinePathRelativeToRoot, err) 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker if len(paths) == 1 { 311*333d2b36SAndroid Build Coastguard Worker props.Check_api.Api_lint.Baseline_file = proptools.StringPtr(baselinePath) 312*333d2b36SAndroid Build Coastguard Worker } else if len(paths) != 0 { 313*333d2b36SAndroid Build Coastguard Worker mctx.ModuleErrorf("error checking for presence of %s: expected one path, found: %v", baselinePathRelativeToRoot, paths) 314*333d2b36SAndroid Build Coastguard Worker } 315*333d2b36SAndroid Build Coastguard Worker } 316*333d2b36SAndroid Build Coastguard Worker } 317*333d2b36SAndroid Build Coastguard Worker 318*333d2b36SAndroid Build Coastguard Worker if !Bool(module.sdkLibraryProperties.No_dist) { 319*333d2b36SAndroid Build Coastguard Worker // Dist the api txt and removed api txt artifacts for sdk builds. 320*333d2b36SAndroid Build Coastguard Worker distDir := proptools.StringPtr(path.Join(module.apiDistPath(apiScope), "api")) 321*333d2b36SAndroid Build Coastguard Worker stubsTypeTagPrefix := "" 322*333d2b36SAndroid Build Coastguard Worker if mctx.Config().ReleaseHiddenApiExportableStubs() { 323*333d2b36SAndroid Build Coastguard Worker stubsTypeTagPrefix = ".exportable" 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker for _, p := range []struct { 326*333d2b36SAndroid Build Coastguard Worker tag string 327*333d2b36SAndroid Build Coastguard Worker pattern string 328*333d2b36SAndroid Build Coastguard Worker }{ 329*333d2b36SAndroid Build Coastguard Worker // "exportable" api files are copied to the dist directory instead of the 330*333d2b36SAndroid Build Coastguard Worker // "everything" api files when "RELEASE_HIDDEN_API_EXPORTABLE_STUBS" build flag 331*333d2b36SAndroid Build Coastguard Worker // is set. Otherwise, the "everything" api files are copied to the dist directory. 332*333d2b36SAndroid Build Coastguard Worker {tag: "%s.api.txt", pattern: "%s.txt"}, 333*333d2b36SAndroid Build Coastguard Worker {tag: "%s.removed-api.txt", pattern: "%s-removed.txt"}, 334*333d2b36SAndroid Build Coastguard Worker } { 335*333d2b36SAndroid Build Coastguard Worker props.Dists = append(props.Dists, android.Dist{ 336*333d2b36SAndroid Build Coastguard Worker Targets: []string{"sdk", "win_sdk"}, 337*333d2b36SAndroid Build Coastguard Worker Dir: distDir, 338*333d2b36SAndroid Build Coastguard Worker Dest: proptools.StringPtr(fmt.Sprintf(p.pattern, module.distStem())), 339*333d2b36SAndroid Build Coastguard Worker Tag: proptools.StringPtr(fmt.Sprintf(p.tag, stubsTypeTagPrefix)), 340*333d2b36SAndroid Build Coastguard Worker }) 341*333d2b36SAndroid Build Coastguard Worker } 342*333d2b36SAndroid Build Coastguard Worker } 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(DroidstubsFactory, &props, module.sdkComponentPropertiesForChildLibrary()).(*Droidstubs).CallHookIfAvailable(mctx) 345*333d2b36SAndroid Build Coastguard Worker} 346*333d2b36SAndroid Build Coastguard Worker 347*333d2b36SAndroid Build Coastguard Workertype libraryProperties struct { 348*333d2b36SAndroid Build Coastguard Worker Name *string 349*333d2b36SAndroid Build Coastguard Worker Enabled proptools.Configurable[bool] 350*333d2b36SAndroid Build Coastguard Worker Visibility []string 351*333d2b36SAndroid Build Coastguard Worker Srcs []string 352*333d2b36SAndroid Build Coastguard Worker Installable *bool 353*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 354*333d2b36SAndroid Build Coastguard Worker System_modules *string 355*333d2b36SAndroid Build Coastguard Worker Patch_module *string 356*333d2b36SAndroid Build Coastguard Worker Libs []string 357*333d2b36SAndroid Build Coastguard Worker Static_libs []string 358*333d2b36SAndroid Build Coastguard Worker Compile_dex *bool 359*333d2b36SAndroid Build Coastguard Worker Java_version *string 360*333d2b36SAndroid Build Coastguard Worker Openjdk9 struct { 361*333d2b36SAndroid Build Coastguard Worker Srcs []string 362*333d2b36SAndroid Build Coastguard Worker Javacflags []string 363*333d2b36SAndroid Build Coastguard Worker } 364*333d2b36SAndroid Build Coastguard Worker Dist struct { 365*333d2b36SAndroid Build Coastguard Worker Targets []string 366*333d2b36SAndroid Build Coastguard Worker Dest *string 367*333d2b36SAndroid Build Coastguard Worker Dir *string 368*333d2b36SAndroid Build Coastguard Worker Tag *string 369*333d2b36SAndroid Build Coastguard Worker } 370*333d2b36SAndroid Build Coastguard Worker Is_stubs_module *bool 371*333d2b36SAndroid Build Coastguard Worker Stub_contributing_api *string 372*333d2b36SAndroid Build Coastguard Worker} 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) stubsLibraryProps(mctx android.DefaultableHookContext, apiScope *apiScope) libraryProperties { 375*333d2b36SAndroid Build Coastguard Worker props := libraryProperties{} 376*333d2b36SAndroid Build Coastguard Worker props.Enabled = module.EnabledProperty() 377*333d2b36SAndroid Build Coastguard Worker props.Visibility = []string{"//visibility:override", "//visibility:private"} 378*333d2b36SAndroid Build Coastguard Worker // sources are generated from the droiddoc 379*333d2b36SAndroid Build Coastguard Worker sdkVersion := module.sdkVersionForStubsLibrary(mctx, apiScope) 380*333d2b36SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr(sdkVersion) 381*333d2b36SAndroid Build Coastguard Worker props.System_modules = module.deviceProperties.System_modules 382*333d2b36SAndroid Build Coastguard Worker props.Patch_module = module.properties.Patch_module 383*333d2b36SAndroid Build Coastguard Worker props.Installable = proptools.BoolPtr(false) 384*333d2b36SAndroid Build Coastguard Worker props.Libs = module.sdkLibraryProperties.Stub_only_libs 385*333d2b36SAndroid Build Coastguard Worker props.Libs = append(props.Libs, module.scopeToProperties[apiScope].Libs...) 386*333d2b36SAndroid Build Coastguard Worker props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs 387*333d2b36SAndroid Build Coastguard Worker // The stub-annotations library contains special versions of the annotations 388*333d2b36SAndroid Build Coastguard Worker // with CLASS retention policy, so that they're kept. 389*333d2b36SAndroid Build Coastguard Worker if proptools.Bool(module.sdkLibraryProperties.Annotations_enabled) { 390*333d2b36SAndroid Build Coastguard Worker props.Libs = append(props.Libs, "stub-annotations") 391*333d2b36SAndroid Build Coastguard Worker } 392*333d2b36SAndroid Build Coastguard Worker props.Openjdk9.Srcs = module.properties.Openjdk9.Srcs 393*333d2b36SAndroid Build Coastguard Worker props.Openjdk9.Javacflags = module.properties.Openjdk9.Javacflags 394*333d2b36SAndroid Build Coastguard Worker // We compile the stubs for 1.8 in line with the main android.jar stubs, and potential 395*333d2b36SAndroid Build Coastguard Worker // interop with older developer tools that don't support 1.9. 396*333d2b36SAndroid Build Coastguard Worker props.Java_version = proptools.StringPtr("1.8") 397*333d2b36SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 398*333d2b36SAndroid Build Coastguard Worker props.Stub_contributing_api = proptools.StringPtr(apiScope.kind.String()) 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Worker return props 401*333d2b36SAndroid Build Coastguard Worker} 402*333d2b36SAndroid Build Coastguard Worker 403*333d2b36SAndroid Build Coastguard Worker// Creates the from-source stub [Library] with ".stubs.<[apiScope.name]>.from-source" suffix. 404*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createFromSourceStubsLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) { 405*333d2b36SAndroid Build Coastguard Worker 406*333d2b36SAndroid Build Coastguard Worker props := module.stubsLibraryProps(mctx, apiScope) 407*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.fromSourceStubsLibraryModuleName(apiScope)) 408*333d2b36SAndroid Build Coastguard Worker props.Srcs = []string{":" + module.droidstubsModuleName(apiScope)} 409*333d2b36SAndroid Build Coastguard Worker 410*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 411*333d2b36SAndroid Build Coastguard Worker} 412*333d2b36SAndroid Build Coastguard Worker 413*333d2b36SAndroid Build Coastguard Worker// Creates the "exportable" from-source stub [Library] with 414*333d2b36SAndroid Build Coastguard Worker// ".stubs.exportable.<[apiScope.name]>" suffix. 415*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createExportableFromSourceStubsLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) { 416*333d2b36SAndroid Build Coastguard Worker props := module.stubsLibraryProps(mctx, apiScope) 417*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.exportableFromSourceStubsLibraryModuleName(apiScope)) 418*333d2b36SAndroid Build Coastguard Worker props.Srcs = []string{":" + module.droidstubsModuleName(apiScope) + "{.exportable}"} 419*333d2b36SAndroid Build Coastguard Worker 420*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 421*333d2b36SAndroid Build Coastguard Worker} 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker// Creates the from-text stub [ApiLibrary] with ".stubs.<[apiScope.name]>.from-text" suffix. 424*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createApiLibrary(mctx android.DefaultableHookContext, apiScope *apiScope) { 425*333d2b36SAndroid Build Coastguard Worker props := struct { 426*333d2b36SAndroid Build Coastguard Worker Name *string 427*333d2b36SAndroid Build Coastguard Worker Enabled proptools.Configurable[bool] 428*333d2b36SAndroid Build Coastguard Worker Visibility []string 429*333d2b36SAndroid Build Coastguard Worker Api_contributions []string 430*333d2b36SAndroid Build Coastguard Worker Libs proptools.Configurable[[]string] 431*333d2b36SAndroid Build Coastguard Worker Static_libs []string 432*333d2b36SAndroid Build Coastguard Worker System_modules *string 433*333d2b36SAndroid Build Coastguard Worker Enable_validation *bool 434*333d2b36SAndroid Build Coastguard Worker Stubs_type *string 435*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 436*333d2b36SAndroid Build Coastguard Worker Previous_api *string 437*333d2b36SAndroid Build Coastguard Worker }{} 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.fromTextStubsLibraryModuleName(apiScope)) 440*333d2b36SAndroid Build Coastguard Worker props.Enabled = module.EnabledProperty() 441*333d2b36SAndroid Build Coastguard Worker props.Visibility = []string{"//visibility:override", "//visibility:private"} 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Worker apiContributions := []string{} 444*333d2b36SAndroid Build Coastguard Worker 445*333d2b36SAndroid Build Coastguard Worker // Api surfaces are not independent of each other, but have subset relationships, 446*333d2b36SAndroid Build Coastguard Worker // and so does the api files. To generate from-text stubs for api surfaces other than public, 447*333d2b36SAndroid Build Coastguard Worker // all subset api domains' api_contriubtions must be added as well. 448*333d2b36SAndroid Build Coastguard Worker scope := apiScope 449*333d2b36SAndroid Build Coastguard Worker for scope != nil { 450*333d2b36SAndroid Build Coastguard Worker apiContributions = append(apiContributions, module.droidstubsModuleName(scope)+".api.contribution") 451*333d2b36SAndroid Build Coastguard Worker scope = scope.extends 452*333d2b36SAndroid Build Coastguard Worker } 453*333d2b36SAndroid Build Coastguard Worker if apiScope == apiScopePublic { 454*333d2b36SAndroid Build Coastguard Worker additionalApiContribution := module.apiLibraryAdditionalApiContribution() 455*333d2b36SAndroid Build Coastguard Worker if additionalApiContribution != "" { 456*333d2b36SAndroid Build Coastguard Worker apiContributions = append(apiContributions, additionalApiContribution) 457*333d2b36SAndroid Build Coastguard Worker } 458*333d2b36SAndroid Build Coastguard Worker } 459*333d2b36SAndroid Build Coastguard Worker 460*333d2b36SAndroid Build Coastguard Worker props.Api_contributions = apiContributions 461*333d2b36SAndroid Build Coastguard Worker 462*333d2b36SAndroid Build Coastguard Worker // Ensure that stub-annotations is added to the classpath before any other libs 463*333d2b36SAndroid Build Coastguard Worker props.Libs = proptools.NewConfigurable[[]string](nil, nil) 464*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue([]string{"stub-annotations"}) 465*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.properties.Libs) 466*333d2b36SAndroid Build Coastguard Worker props.Libs.Append(module.properties.Static_libs) 467*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.sdkLibraryProperties.Stub_only_libs) 468*333d2b36SAndroid Build Coastguard Worker props.Libs.AppendSimpleValue(module.scopeToProperties[apiScope].Libs) 469*333d2b36SAndroid Build Coastguard Worker props.Static_libs = module.sdkLibraryProperties.Stub_only_static_libs 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Worker props.System_modules = module.deviceProperties.System_modules 472*333d2b36SAndroid Build Coastguard Worker props.Enable_validation = proptools.BoolPtr(true) 473*333d2b36SAndroid Build Coastguard Worker props.Stubs_type = proptools.StringPtr("everything") 474*333d2b36SAndroid Build Coastguard Worker 475*333d2b36SAndroid Build Coastguard Worker if module.deviceProperties.Sdk_version != nil { 476*333d2b36SAndroid Build Coastguard Worker props.Sdk_version = module.deviceProperties.Sdk_version 477*333d2b36SAndroid Build Coastguard Worker } 478*333d2b36SAndroid Build Coastguard Worker 479*333d2b36SAndroid Build Coastguard Worker if module.compareAgainstLatestApi(apiScope) { 480*333d2b36SAndroid Build Coastguard Worker // check against the latest released API 481*333d2b36SAndroid Build Coastguard Worker latestApiFilegroupName := proptools.StringPtr(module.latestApiFilegroupName(apiScope)) 482*333d2b36SAndroid Build Coastguard Worker props.Previous_api = latestApiFilegroupName 483*333d2b36SAndroid Build Coastguard Worker } 484*333d2b36SAndroid Build Coastguard Worker 485*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(ApiLibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 486*333d2b36SAndroid Build Coastguard Worker} 487*333d2b36SAndroid Build Coastguard Worker 488*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) topLevelStubsLibraryProps(mctx android.DefaultableHookContext, apiScope *apiScope, doDist bool) libraryProperties { 489*333d2b36SAndroid Build Coastguard Worker props := libraryProperties{} 490*333d2b36SAndroid Build Coastguard Worker 491*333d2b36SAndroid Build Coastguard Worker props.Enabled = module.EnabledProperty() 492*333d2b36SAndroid Build Coastguard Worker props.Visibility = childModuleVisibility(module.sdkLibraryProperties.Stubs_library_visibility) 493*333d2b36SAndroid Build Coastguard Worker sdkVersion := module.sdkVersionForStubsLibrary(mctx, apiScope) 494*333d2b36SAndroid Build Coastguard Worker props.Sdk_version = proptools.StringPtr(sdkVersion) 495*333d2b36SAndroid Build Coastguard Worker 496*333d2b36SAndroid Build Coastguard Worker props.System_modules = module.deviceProperties.System_modules 497*333d2b36SAndroid Build Coastguard Worker 498*333d2b36SAndroid Build Coastguard Worker // The imports need to be compiled to dex if the java_sdk_library requests it. 499*333d2b36SAndroid Build Coastguard Worker compileDex := module.dexProperties.Compile_dex 500*333d2b36SAndroid Build Coastguard Worker if module.stubLibrariesCompiledForDex() { 501*333d2b36SAndroid Build Coastguard Worker compileDex = proptools.BoolPtr(true) 502*333d2b36SAndroid Build Coastguard Worker } 503*333d2b36SAndroid Build Coastguard Worker props.Compile_dex = compileDex 504*333d2b36SAndroid Build Coastguard Worker 505*333d2b36SAndroid Build Coastguard Worker props.Stub_contributing_api = proptools.StringPtr(apiScope.kind.String()) 506*333d2b36SAndroid Build Coastguard Worker 507*333d2b36SAndroid Build Coastguard Worker if !Bool(module.sdkLibraryProperties.No_dist) && doDist { 508*333d2b36SAndroid Build Coastguard Worker props.Dist.Targets = []string{"sdk", "win_sdk"} 509*333d2b36SAndroid Build Coastguard Worker props.Dist.Dest = proptools.StringPtr(fmt.Sprintf("%v.jar", module.distStem())) 510*333d2b36SAndroid Build Coastguard Worker props.Dist.Dir = proptools.StringPtr(module.apiDistPath(apiScope)) 511*333d2b36SAndroid Build Coastguard Worker props.Dist.Tag = proptools.StringPtr(".jar") 512*333d2b36SAndroid Build Coastguard Worker } 513*333d2b36SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 514*333d2b36SAndroid Build Coastguard Worker 515*333d2b36SAndroid Build Coastguard Worker return props 516*333d2b36SAndroid Build Coastguard Worker} 517*333d2b36SAndroid Build Coastguard Worker 518*333d2b36SAndroid Build Coastguard Worker// Creates the stub [Library] with ".stubs.<[apiScope.name]>" suffix. 519*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createTopLevelStubsLibrary( 520*333d2b36SAndroid Build Coastguard Worker mctx android.DefaultableHookContext, apiScope *apiScope) { 521*333d2b36SAndroid Build Coastguard Worker 522*333d2b36SAndroid Build Coastguard Worker // Dist the "everything" stubs when the RELEASE_HIDDEN_API_EXPORTABLE_STUBS build flag is false 523*333d2b36SAndroid Build Coastguard Worker doDist := !mctx.Config().ReleaseHiddenApiExportableStubs() 524*333d2b36SAndroid Build Coastguard Worker props := module.topLevelStubsLibraryProps(mctx, apiScope, doDist) 525*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.stubsLibraryModuleName(apiScope)) 526*333d2b36SAndroid Build Coastguard Worker 527*333d2b36SAndroid Build Coastguard Worker // Add the stub compiling java_library/java_api_library as static lib based on build config 528*333d2b36SAndroid Build Coastguard Worker staticLib := module.fromSourceStubsLibraryModuleName(apiScope) 529*333d2b36SAndroid Build Coastguard Worker if mctx.Config().BuildFromTextStub() && module.ModuleBuildFromTextStubs() { 530*333d2b36SAndroid Build Coastguard Worker staticLib = module.fromTextStubsLibraryModuleName(apiScope) 531*333d2b36SAndroid Build Coastguard Worker } 532*333d2b36SAndroid Build Coastguard Worker props.Static_libs = append(props.Static_libs, staticLib) 533*333d2b36SAndroid Build Coastguard Worker 534*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 535*333d2b36SAndroid Build Coastguard Worker} 536*333d2b36SAndroid Build Coastguard Worker 537*333d2b36SAndroid Build Coastguard Worker// Creates the "exportable" stub [Library] with ".stubs.exportable.<[apiScope.name]>" suffix. 538*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createTopLevelExportableStubsLibrary( 539*333d2b36SAndroid Build Coastguard Worker mctx android.DefaultableHookContext, apiScope *apiScope) { 540*333d2b36SAndroid Build Coastguard Worker 541*333d2b36SAndroid Build Coastguard Worker // Dist the "exportable" stubs when the RELEASE_HIDDEN_API_EXPORTABLE_STUBS build flag is true 542*333d2b36SAndroid Build Coastguard Worker doDist := mctx.Config().ReleaseHiddenApiExportableStubs() 543*333d2b36SAndroid Build Coastguard Worker props := module.topLevelStubsLibraryProps(mctx, apiScope, doDist) 544*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.exportableStubsLibraryModuleName(apiScope)) 545*333d2b36SAndroid Build Coastguard Worker 546*333d2b36SAndroid Build Coastguard Worker staticLib := module.exportableFromSourceStubsLibraryModuleName(apiScope) 547*333d2b36SAndroid Build Coastguard Worker props.Static_libs = append(props.Static_libs, staticLib) 548*333d2b36SAndroid Build Coastguard Worker 549*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(LibraryFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 550*333d2b36SAndroid Build Coastguard Worker} 551*333d2b36SAndroid Build Coastguard Worker 552*333d2b36SAndroid Build Coastguard Worker// Creates the [sdkLibraryXml] with ".xml" suffix. 553*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibrary) createXmlFile(mctx android.DefaultableHookContext) { 554*333d2b36SAndroid Build Coastguard Worker moduleMinApiLevel := module.Library.MinSdkVersion(mctx) 555*333d2b36SAndroid Build Coastguard Worker var moduleMinApiLevelStr = moduleMinApiLevel.String() 556*333d2b36SAndroid Build Coastguard Worker if moduleMinApiLevel == android.NoneApiLevel { 557*333d2b36SAndroid Build Coastguard Worker moduleMinApiLevelStr = "current" 558*333d2b36SAndroid Build Coastguard Worker } 559*333d2b36SAndroid Build Coastguard Worker props := struct { 560*333d2b36SAndroid Build Coastguard Worker Name *string 561*333d2b36SAndroid Build Coastguard Worker Enabled proptools.Configurable[bool] 562*333d2b36SAndroid Build Coastguard Worker Lib_name *string 563*333d2b36SAndroid Build Coastguard Worker Apex_available []string 564*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_since *string 565*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_before *string 566*333d2b36SAndroid Build Coastguard Worker Min_device_sdk *string 567*333d2b36SAndroid Build Coastguard Worker Max_device_sdk *string 568*333d2b36SAndroid Build Coastguard Worker Sdk_library_min_api_level *string 569*333d2b36SAndroid Build Coastguard Worker Uses_libs_dependencies proptools.Configurable[[]string] 570*333d2b36SAndroid Build Coastguard Worker }{ 571*333d2b36SAndroid Build Coastguard Worker Name: proptools.StringPtr(module.xmlPermissionsModuleName()), 572*333d2b36SAndroid Build Coastguard Worker Enabled: module.EnabledProperty(), 573*333d2b36SAndroid Build Coastguard Worker Lib_name: proptools.StringPtr(module.BaseModuleName()), 574*333d2b36SAndroid Build Coastguard Worker Apex_available: module.ApexProperties.Apex_available, 575*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_since: module.commonSdkLibraryProperties.On_bootclasspath_since, 576*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_before: module.commonSdkLibraryProperties.On_bootclasspath_before, 577*333d2b36SAndroid Build Coastguard Worker Min_device_sdk: module.commonSdkLibraryProperties.Min_device_sdk, 578*333d2b36SAndroid Build Coastguard Worker Max_device_sdk: module.commonSdkLibraryProperties.Max_device_sdk, 579*333d2b36SAndroid Build Coastguard Worker Sdk_library_min_api_level: &moduleMinApiLevelStr, 580*333d2b36SAndroid Build Coastguard Worker Uses_libs_dependencies: module.usesLibraryProperties.Uses_libs.Clone(), 581*333d2b36SAndroid Build Coastguard Worker } 582*333d2b36SAndroid Build Coastguard Worker 583*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(sdkLibraryXmlFactory, &props) 584*333d2b36SAndroid Build Coastguard Worker} 585*333d2b36SAndroid Build Coastguard Worker 586*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 587*333d2b36SAndroid Build Coastguard Worker// Build rules of the submodules generated by java_sdk_library_import. 588*333d2b36SAndroid Build Coastguard Worker// Note that the java_sdk_library_import module does not generate the implementation library. 589*333d2b36SAndroid Build Coastguard Worker// Instead, it will create a dependency to the source implemenetation library if one exists. 590*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_import "framework-foo" generates the following submodules: 591*333d2b36SAndroid Build Coastguard Worker// 592*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.<[apiScope.name]>" (type: [Import]): prebuilt stub library module that 593*333d2b36SAndroid Build Coastguard Worker// provides the stub jar file checked in the tree. 594*333d2b36SAndroid Build Coastguard Worker// 595*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>" (type: [PrebuiltStubsSources]): prebuilt 596*333d2b36SAndroid Build Coastguard Worker// droidstubs module that provides the stub source jar file checked in the tree. 597*333d2b36SAndroid Build Coastguard Worker// 598*333d2b36SAndroid Build Coastguard Worker// - "framework-foo.stubs.source.<[apiScope.name]>.api.contribution" 599*333d2b36SAndroid Build Coastguard Worker// (type [JavaApiContributionImport]): prebuilt java_api_contribution module that provides 600*333d2b36SAndroid Build Coastguard Worker// the prebuilt api file for previously released from-text stub generation. 601*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 602*333d2b36SAndroid Build Coastguard Worker 603*333d2b36SAndroid Build Coastguard Worker// Creates the prebuilt stub [Import] with ".stubs.<[apiScope.name]>" suffix. 604*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createJavaImportForStubs(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) { 605*333d2b36SAndroid Build Coastguard Worker // Creates a java import for the jar with ".stubs" suffix 606*333d2b36SAndroid Build Coastguard Worker props := struct { 607*333d2b36SAndroid Build Coastguard Worker Name *string 608*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 609*333d2b36SAndroid Build Coastguard Worker Created_by_java_sdk_library_name *string 610*333d2b36SAndroid Build Coastguard Worker Sdk_version *string 611*333d2b36SAndroid Build Coastguard Worker Libs []string 612*333d2b36SAndroid Build Coastguard Worker Jars []string 613*333d2b36SAndroid Build Coastguard Worker Compile_dex *bool 614*333d2b36SAndroid Build Coastguard Worker Is_stubs_module *bool 615*333d2b36SAndroid Build Coastguard Worker 616*333d2b36SAndroid Build Coastguard Worker android.UserSuppliedPrebuiltProperties 617*333d2b36SAndroid Build Coastguard Worker }{} 618*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.stubsLibraryModuleName(apiScope)) 619*333d2b36SAndroid Build Coastguard Worker props.Source_module_name = proptools.StringPtr(apiScope.stubsLibraryModuleName(module.BaseModuleName())) 620*333d2b36SAndroid Build Coastguard Worker props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName()) 621*333d2b36SAndroid Build Coastguard Worker props.Sdk_version = scopeProperties.Sdk_version 622*333d2b36SAndroid Build Coastguard Worker // Prepend any of the libs from the legacy public properties to the libs for each of the 623*333d2b36SAndroid Build Coastguard Worker // scopes to avoid having to duplicate them in each scope. 624*333d2b36SAndroid Build Coastguard Worker props.Libs = append(module.properties.Libs, scopeProperties.Libs...) 625*333d2b36SAndroid Build Coastguard Worker props.Jars = scopeProperties.Jars 626*333d2b36SAndroid Build Coastguard Worker 627*333d2b36SAndroid Build Coastguard Worker // The imports are preferred if the java_sdk_library_import is preferred. 628*333d2b36SAndroid Build Coastguard Worker props.CopyUserSuppliedPropertiesFromPrebuilt(&module.prebuilt) 629*333d2b36SAndroid Build Coastguard Worker 630*333d2b36SAndroid Build Coastguard Worker // The imports need to be compiled to dex if the java_sdk_library_import requests it. 631*333d2b36SAndroid Build Coastguard Worker compileDex := module.properties.Compile_dex 632*333d2b36SAndroid Build Coastguard Worker if module.stubLibrariesCompiledForDex() { 633*333d2b36SAndroid Build Coastguard Worker compileDex = proptools.BoolPtr(true) 634*333d2b36SAndroid Build Coastguard Worker } 635*333d2b36SAndroid Build Coastguard Worker props.Compile_dex = compileDex 636*333d2b36SAndroid Build Coastguard Worker props.Is_stubs_module = proptools.BoolPtr(true) 637*333d2b36SAndroid Build Coastguard Worker 638*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(ImportFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 639*333d2b36SAndroid Build Coastguard Worker} 640*333d2b36SAndroid Build Coastguard Worker 641*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createPrebuiltStubsSources(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) { 642*333d2b36SAndroid Build Coastguard Worker props := struct { 643*333d2b36SAndroid Build Coastguard Worker Name *string 644*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 645*333d2b36SAndroid Build Coastguard Worker Created_by_java_sdk_library_name *string 646*333d2b36SAndroid Build Coastguard Worker Srcs []string 647*333d2b36SAndroid Build Coastguard Worker 648*333d2b36SAndroid Build Coastguard Worker android.UserSuppliedPrebuiltProperties 649*333d2b36SAndroid Build Coastguard Worker }{} 650*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.droidstubsModuleName(apiScope)) 651*333d2b36SAndroid Build Coastguard Worker props.Source_module_name = proptools.StringPtr(apiScope.stubsSourceModuleName(module.BaseModuleName())) 652*333d2b36SAndroid Build Coastguard Worker props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName()) 653*333d2b36SAndroid Build Coastguard Worker props.Srcs = scopeProperties.Stub_srcs 654*333d2b36SAndroid Build Coastguard Worker 655*333d2b36SAndroid Build Coastguard Worker // The stubs source is preferred if the java_sdk_library_import is preferred. 656*333d2b36SAndroid Build Coastguard Worker props.CopyUserSuppliedPropertiesFromPrebuilt(&module.prebuilt) 657*333d2b36SAndroid Build Coastguard Worker 658*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(PrebuiltStubsSourcesFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 659*333d2b36SAndroid Build Coastguard Worker} 660*333d2b36SAndroid Build Coastguard Worker 661*333d2b36SAndroid Build Coastguard Worker// Creates the prebuilt api contribution [JavaApiContributionImport] with 662*333d2b36SAndroid Build Coastguard Worker// ".stubs.source.<[apiScope.name]>.api.contribution" suffix. 663*333d2b36SAndroid Build Coastguard Workerfunc (module *SdkLibraryImport) createPrebuiltApiContribution(mctx android.DefaultableHookContext, apiScope *apiScope, scopeProperties *sdkLibraryScopeProperties) { 664*333d2b36SAndroid Build Coastguard Worker api_file := scopeProperties.Current_api 665*333d2b36SAndroid Build Coastguard Worker api_surface := &apiScope.name 666*333d2b36SAndroid Build Coastguard Worker 667*333d2b36SAndroid Build Coastguard Worker props := struct { 668*333d2b36SAndroid Build Coastguard Worker Name *string 669*333d2b36SAndroid Build Coastguard Worker Source_module_name *string 670*333d2b36SAndroid Build Coastguard Worker Created_by_java_sdk_library_name *string 671*333d2b36SAndroid Build Coastguard Worker Api_surface *string 672*333d2b36SAndroid Build Coastguard Worker Api_file *string 673*333d2b36SAndroid Build Coastguard Worker Visibility []string 674*333d2b36SAndroid Build Coastguard Worker }{} 675*333d2b36SAndroid Build Coastguard Worker 676*333d2b36SAndroid Build Coastguard Worker props.Name = proptools.StringPtr(module.droidstubsModuleName(apiScope) + ".api.contribution") 677*333d2b36SAndroid Build Coastguard Worker props.Source_module_name = proptools.StringPtr(apiScope.stubsSourceModuleName(module.BaseModuleName()) + ".api.contribution") 678*333d2b36SAndroid Build Coastguard Worker props.Created_by_java_sdk_library_name = proptools.StringPtr(module.RootLibraryName()) 679*333d2b36SAndroid Build Coastguard Worker props.Api_surface = api_surface 680*333d2b36SAndroid Build Coastguard Worker props.Api_file = api_file 681*333d2b36SAndroid Build Coastguard Worker props.Visibility = []string{"//visibility:override", "//visibility:public"} 682*333d2b36SAndroid Build Coastguard Worker 683*333d2b36SAndroid Build Coastguard Worker mctx.CreateModule(ApiContributionImportFactory, &props, module.sdkComponentPropertiesForChildLibrary()) 684*333d2b36SAndroid Build Coastguard Worker} 685*333d2b36SAndroid Build Coastguard Worker 686*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 687*333d2b36SAndroid Build Coastguard Worker// End of the build rules of the submodules generated by java_sdk_library_import. 688*333d2b36SAndroid Build Coastguard Worker// --------------------------------------------------------------------------------------------- 689*333d2b36SAndroid Build Coastguard Worker 690*333d2b36SAndroid Build Coastguard Worker// Definition of the [sdkLibraryXml] module. The module generates the permissions xml file, 691*333d2b36SAndroid Build Coastguard Worker// so that the apps can specify the java_sdk_library using <uses-permission> tag in the 692*333d2b36SAndroid Build Coastguard Worker// AndroidManifest.xml file. 693*333d2b36SAndroid Build Coastguard Workertype sdkLibraryXml struct { 694*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 695*333d2b36SAndroid Build Coastguard Worker android.DefaultableModuleBase 696*333d2b36SAndroid Build Coastguard Worker android.ApexModuleBase 697*333d2b36SAndroid Build Coastguard Worker 698*333d2b36SAndroid Build Coastguard Worker properties sdkLibraryXmlProperties 699*333d2b36SAndroid Build Coastguard Worker 700*333d2b36SAndroid Build Coastguard Worker outputFilePath android.OutputPath 701*333d2b36SAndroid Build Coastguard Worker installDirPath android.InstallPath 702*333d2b36SAndroid Build Coastguard Worker 703*333d2b36SAndroid Build Coastguard Worker hideApexVariantFromMake bool 704*333d2b36SAndroid Build Coastguard Worker} 705*333d2b36SAndroid Build Coastguard Worker 706*333d2b36SAndroid Build Coastguard Workertype sdkLibraryXmlProperties struct { 707*333d2b36SAndroid Build Coastguard Worker // canonical name of the lib 708*333d2b36SAndroid Build Coastguard Worker Lib_name *string 709*333d2b36SAndroid Build Coastguard Worker 710*333d2b36SAndroid Build Coastguard Worker // Signals that this shared library is part of the bootclasspath starting 711*333d2b36SAndroid Build Coastguard Worker // on the version indicated in this attribute. 712*333d2b36SAndroid Build Coastguard Worker // 713*333d2b36SAndroid Build Coastguard Worker // This will make platforms at this level and above to ignore 714*333d2b36SAndroid Build Coastguard Worker // <uses-library> tags with this library name because the library is already 715*333d2b36SAndroid Build Coastguard Worker // available 716*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_since *string 717*333d2b36SAndroid Build Coastguard Worker 718*333d2b36SAndroid Build Coastguard Worker // Signals that this shared library was part of the bootclasspath before 719*333d2b36SAndroid Build Coastguard Worker // (but not including) the version indicated in this attribute. 720*333d2b36SAndroid Build Coastguard Worker // 721*333d2b36SAndroid Build Coastguard Worker // The system will automatically add a <uses-library> tag with this library to 722*333d2b36SAndroid Build Coastguard Worker // apps that target any SDK less than the version indicated in this attribute. 723*333d2b36SAndroid Build Coastguard Worker On_bootclasspath_before *string 724*333d2b36SAndroid Build Coastguard Worker 725*333d2b36SAndroid Build Coastguard Worker // Indicates that PackageManager should ignore this shared library if the 726*333d2b36SAndroid Build Coastguard Worker // platform is below the version indicated in this attribute. 727*333d2b36SAndroid Build Coastguard Worker // 728*333d2b36SAndroid Build Coastguard Worker // This means that the device won't recognise this library as installed. 729*333d2b36SAndroid Build Coastguard Worker Min_device_sdk *string 730*333d2b36SAndroid Build Coastguard Worker 731*333d2b36SAndroid Build Coastguard Worker // Indicates that PackageManager should ignore this shared library if the 732*333d2b36SAndroid Build Coastguard Worker // platform is above the version indicated in this attribute. 733*333d2b36SAndroid Build Coastguard Worker // 734*333d2b36SAndroid Build Coastguard Worker // This means that the device won't recognise this library as installed. 735*333d2b36SAndroid Build Coastguard Worker Max_device_sdk *string 736*333d2b36SAndroid Build Coastguard Worker 737*333d2b36SAndroid Build Coastguard Worker // The SdkLibrary's min api level as a string 738*333d2b36SAndroid Build Coastguard Worker // 739*333d2b36SAndroid Build Coastguard Worker // This value comes from the ApiLevel of the MinSdkVersion property. 740*333d2b36SAndroid Build Coastguard Worker Sdk_library_min_api_level *string 741*333d2b36SAndroid Build Coastguard Worker 742*333d2b36SAndroid Build Coastguard Worker // Uses-libs dependencies that the shared library requires to work correctly. 743*333d2b36SAndroid Build Coastguard Worker // 744*333d2b36SAndroid Build Coastguard Worker // This will add dependency="foo:bar" to the <library> section. 745*333d2b36SAndroid Build Coastguard Worker Uses_libs_dependencies proptools.Configurable[[]string] 746*333d2b36SAndroid Build Coastguard Worker} 747*333d2b36SAndroid Build Coastguard Worker 748*333d2b36SAndroid Build Coastguard Worker// java_sdk_library_xml builds the permission xml file for a java_sdk_library. 749*333d2b36SAndroid Build Coastguard Worker// Not to be used directly by users. java_sdk_library internally uses this. 750*333d2b36SAndroid Build Coastguard Workerfunc sdkLibraryXmlFactory() android.Module { 751*333d2b36SAndroid Build Coastguard Worker module := &sdkLibraryXml{} 752*333d2b36SAndroid Build Coastguard Worker 753*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 754*333d2b36SAndroid Build Coastguard Worker 755*333d2b36SAndroid Build Coastguard Worker android.InitApexModule(module) 756*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 757*333d2b36SAndroid Build Coastguard Worker 758*333d2b36SAndroid Build Coastguard Worker return module 759*333d2b36SAndroid Build Coastguard Worker} 760*333d2b36SAndroid Build Coastguard Worker 761*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) UniqueApexVariations() bool { 762*333d2b36SAndroid Build Coastguard Worker // sdkLibraryXml needs a unique variation per APEX because the generated XML file contains the path to the 763*333d2b36SAndroid Build Coastguard Worker // mounted APEX, which contains the name of the APEX. 764*333d2b36SAndroid Build Coastguard Worker return true 765*333d2b36SAndroid Build Coastguard Worker} 766*333d2b36SAndroid Build Coastguard Worker 767*333d2b36SAndroid Build Coastguard Worker// from android.PrebuiltEtcModule 768*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) BaseDir() string { 769*333d2b36SAndroid Build Coastguard Worker return "etc" 770*333d2b36SAndroid Build Coastguard Worker} 771*333d2b36SAndroid Build Coastguard Worker 772*333d2b36SAndroid Build Coastguard Worker// from android.PrebuiltEtcModule 773*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) SubDir() string { 774*333d2b36SAndroid Build Coastguard Worker return "permissions" 775*333d2b36SAndroid Build Coastguard Worker} 776*333d2b36SAndroid Build Coastguard Worker 777*333d2b36SAndroid Build Coastguard Workervar _ etc.PrebuiltEtcModule = (*sdkLibraryXml)(nil) 778*333d2b36SAndroid Build Coastguard Worker 779*333d2b36SAndroid Build Coastguard Worker// from android.ApexModule 780*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) AvailableFor(what string) bool { 781*333d2b36SAndroid Build Coastguard Worker return true 782*333d2b36SAndroid Build Coastguard Worker} 783*333d2b36SAndroid Build Coastguard Worker 784*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) DepsMutator(ctx android.BottomUpMutatorContext) { 785*333d2b36SAndroid Build Coastguard Worker // do nothing 786*333d2b36SAndroid Build Coastguard Worker} 787*333d2b36SAndroid Build Coastguard Worker 788*333d2b36SAndroid Build Coastguard Workervar _ android.ApexModule = (*sdkLibraryXml)(nil) 789*333d2b36SAndroid Build Coastguard Worker 790*333d2b36SAndroid Build Coastguard Worker// Implements android.ApexModule 791*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) ShouldSupportSdkVersion(ctx android.BaseModuleContext, 792*333d2b36SAndroid Build Coastguard Worker sdkVersion android.ApiLevel) error { 793*333d2b36SAndroid Build Coastguard Worker // sdkLibraryXml doesn't need to be checked separately because java_sdk_library is checked 794*333d2b36SAndroid Build Coastguard Worker return nil 795*333d2b36SAndroid Build Coastguard Worker} 796*333d2b36SAndroid Build Coastguard Worker 797*333d2b36SAndroid Build Coastguard Worker// File path to the runtime implementation library 798*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) implPath(ctx android.ModuleContext) string { 799*333d2b36SAndroid Build Coastguard Worker implName := proptools.String(module.properties.Lib_name) 800*333d2b36SAndroid Build Coastguard Worker if apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider); !apexInfo.IsForPlatform() { 801*333d2b36SAndroid Build Coastguard Worker // TODO(b/146468504): ApexVariationName() is only a soong module name, not apex name. 802*333d2b36SAndroid Build Coastguard Worker // In most cases, this works fine. But when apex_name is set or override_apex is used 803*333d2b36SAndroid Build Coastguard Worker // this can be wrong. 804*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf("/apex/%s/javalib/%s.jar", apexInfo.BaseApexName, implName) 805*333d2b36SAndroid Build Coastguard Worker } 806*333d2b36SAndroid Build Coastguard Worker partition := "system" 807*333d2b36SAndroid Build Coastguard Worker if module.SocSpecific() { 808*333d2b36SAndroid Build Coastguard Worker partition = "vendor" 809*333d2b36SAndroid Build Coastguard Worker } else if module.DeviceSpecific() { 810*333d2b36SAndroid Build Coastguard Worker partition = "odm" 811*333d2b36SAndroid Build Coastguard Worker } else if module.ProductSpecific() { 812*333d2b36SAndroid Build Coastguard Worker partition = "product" 813*333d2b36SAndroid Build Coastguard Worker } else if module.SystemExtSpecific() { 814*333d2b36SAndroid Build Coastguard Worker partition = "system_ext" 815*333d2b36SAndroid Build Coastguard Worker } 816*333d2b36SAndroid Build Coastguard Worker return "/" + partition + "/framework/" + implName + ".jar" 817*333d2b36SAndroid Build Coastguard Worker} 818*333d2b36SAndroid Build Coastguard Worker 819*333d2b36SAndroid Build Coastguard Workerfunc formattedOptionalSdkLevelAttribute(ctx android.ModuleContext, attrName string, value *string) string { 820*333d2b36SAndroid Build Coastguard Worker if value == nil { 821*333d2b36SAndroid Build Coastguard Worker return "" 822*333d2b36SAndroid Build Coastguard Worker } 823*333d2b36SAndroid Build Coastguard Worker apiLevel, err := android.ApiLevelFromUser(ctx, *value) 824*333d2b36SAndroid Build Coastguard Worker if err != nil { 825*333d2b36SAndroid Build Coastguard Worker // attributes in bp files have underscores but in the xml have dashes. 826*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf(strings.ReplaceAll(attrName, "-", "_"), err.Error()) 827*333d2b36SAndroid Build Coastguard Worker return "" 828*333d2b36SAndroid Build Coastguard Worker } 829*333d2b36SAndroid Build Coastguard Worker if apiLevel.IsCurrent() { 830*333d2b36SAndroid Build Coastguard Worker // passing "current" would always mean a future release, never the current (or the current in 831*333d2b36SAndroid Build Coastguard Worker // progress) which means some conditions would never be triggered. 832*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf(strings.ReplaceAll(attrName, "-", "_"), 833*333d2b36SAndroid Build Coastguard Worker `"current" is not an allowed value for this attribute`) 834*333d2b36SAndroid Build Coastguard Worker return "" 835*333d2b36SAndroid Build Coastguard Worker } 836*333d2b36SAndroid Build Coastguard Worker // "safeValue" is safe because it translates finalized codenames to a string 837*333d2b36SAndroid Build Coastguard Worker // with their SDK int. 838*333d2b36SAndroid Build Coastguard Worker safeValue := apiLevel.String() 839*333d2b36SAndroid Build Coastguard Worker return formattedOptionalAttribute(attrName, &safeValue) 840*333d2b36SAndroid Build Coastguard Worker} 841*333d2b36SAndroid Build Coastguard Worker 842*333d2b36SAndroid Build Coastguard Worker// formats an attribute for the xml permissions file if the value is not null 843*333d2b36SAndroid Build Coastguard Worker// returns empty string otherwise 844*333d2b36SAndroid Build Coastguard Workerfunc formattedOptionalAttribute(attrName string, value *string) string { 845*333d2b36SAndroid Build Coastguard Worker if value == nil { 846*333d2b36SAndroid Build Coastguard Worker return "" 847*333d2b36SAndroid Build Coastguard Worker } 848*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf(" %s=\"%s\"\n", attrName, *value) 849*333d2b36SAndroid Build Coastguard Worker} 850*333d2b36SAndroid Build Coastguard Worker 851*333d2b36SAndroid Build Coastguard Workerfunc formattedDependenciesAttribute(dependencies []string) string { 852*333d2b36SAndroid Build Coastguard Worker if dependencies == nil { 853*333d2b36SAndroid Build Coastguard Worker return "" 854*333d2b36SAndroid Build Coastguard Worker } 855*333d2b36SAndroid Build Coastguard Worker return fmt.Sprintf(" dependency=\"%s\"\n", strings.Join(dependencies, ":")) 856*333d2b36SAndroid Build Coastguard Worker} 857*333d2b36SAndroid Build Coastguard Worker 858*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) permissionsContents(ctx android.ModuleContext) string { 859*333d2b36SAndroid Build Coastguard Worker libName := proptools.String(module.properties.Lib_name) 860*333d2b36SAndroid Build Coastguard Worker libNameAttr := formattedOptionalAttribute("name", &libName) 861*333d2b36SAndroid Build Coastguard Worker filePath := module.implPath(ctx) 862*333d2b36SAndroid Build Coastguard Worker filePathAttr := formattedOptionalAttribute("file", &filePath) 863*333d2b36SAndroid Build Coastguard Worker implicitFromAttr := formattedOptionalSdkLevelAttribute(ctx, "on-bootclasspath-since", module.properties.On_bootclasspath_since) 864*333d2b36SAndroid Build Coastguard Worker implicitUntilAttr := formattedOptionalSdkLevelAttribute(ctx, "on-bootclasspath-before", module.properties.On_bootclasspath_before) 865*333d2b36SAndroid Build Coastguard Worker minSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "min-device-sdk", module.properties.Min_device_sdk) 866*333d2b36SAndroid Build Coastguard Worker maxSdkAttr := formattedOptionalSdkLevelAttribute(ctx, "max-device-sdk", module.properties.Max_device_sdk) 867*333d2b36SAndroid Build Coastguard Worker dependenciesAttr := formattedDependenciesAttribute(module.properties.Uses_libs_dependencies.GetOrDefault(ctx, nil)) 868*333d2b36SAndroid Build Coastguard Worker // <library> is understood in all android versions whereas <apex-library> is only understood from API T (and ignored before that). 869*333d2b36SAndroid Build Coastguard Worker // similarly, min_device_sdk is only understood from T. So if a library is using that, we need to use the apex-library to make sure this library is not loaded before T 870*333d2b36SAndroid Build Coastguard Worker var libraryTag string 871*333d2b36SAndroid Build Coastguard Worker if module.properties.Min_device_sdk != nil { 872*333d2b36SAndroid Build Coastguard Worker libraryTag = " <apex-library\n" 873*333d2b36SAndroid Build Coastguard Worker } else { 874*333d2b36SAndroid Build Coastguard Worker libraryTag = " <library\n" 875*333d2b36SAndroid Build Coastguard Worker } 876*333d2b36SAndroid Build Coastguard Worker 877*333d2b36SAndroid Build Coastguard Worker return strings.Join([]string{ 878*333d2b36SAndroid Build Coastguard Worker "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", 879*333d2b36SAndroid Build Coastguard Worker "<!-- Copyright (C) 2018 The Android Open Source Project\n", 880*333d2b36SAndroid Build Coastguard Worker "\n", 881*333d2b36SAndroid Build Coastguard Worker " Licensed under the Apache License, Version 2.0 (the \"License\");\n", 882*333d2b36SAndroid Build Coastguard Worker " you may not use this file except in compliance with the License.\n", 883*333d2b36SAndroid Build Coastguard Worker " You may obtain a copy of the License at\n", 884*333d2b36SAndroid Build Coastguard Worker "\n", 885*333d2b36SAndroid Build Coastguard Worker " http://www.apache.org/licenses/LICENSE-2.0\n", 886*333d2b36SAndroid Build Coastguard Worker "\n", 887*333d2b36SAndroid Build Coastguard Worker " Unless required by applicable law or agreed to in writing, software\n", 888*333d2b36SAndroid Build Coastguard Worker " distributed under the License is distributed on an \"AS IS\" BASIS,\n", 889*333d2b36SAndroid Build Coastguard Worker " WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", 890*333d2b36SAndroid Build Coastguard Worker " See the License for the specific language governing permissions and\n", 891*333d2b36SAndroid Build Coastguard Worker " limitations under the License.\n", 892*333d2b36SAndroid Build Coastguard Worker "-->\n", 893*333d2b36SAndroid Build Coastguard Worker "<permissions>\n", 894*333d2b36SAndroid Build Coastguard Worker libraryTag, 895*333d2b36SAndroid Build Coastguard Worker libNameAttr, 896*333d2b36SAndroid Build Coastguard Worker filePathAttr, 897*333d2b36SAndroid Build Coastguard Worker implicitFromAttr, 898*333d2b36SAndroid Build Coastguard Worker implicitUntilAttr, 899*333d2b36SAndroid Build Coastguard Worker minSdkAttr, 900*333d2b36SAndroid Build Coastguard Worker maxSdkAttr, 901*333d2b36SAndroid Build Coastguard Worker dependenciesAttr, 902*333d2b36SAndroid Build Coastguard Worker " />\n", 903*333d2b36SAndroid Build Coastguard Worker "</permissions>\n", 904*333d2b36SAndroid Build Coastguard Worker }, "") 905*333d2b36SAndroid Build Coastguard Worker} 906*333d2b36SAndroid Build Coastguard Worker 907*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) GenerateAndroidBuildActions(ctx android.ModuleContext) { 908*333d2b36SAndroid Build Coastguard Worker apexInfo, _ := android.ModuleProvider(ctx, android.ApexInfoProvider) 909*333d2b36SAndroid Build Coastguard Worker module.hideApexVariantFromMake = !apexInfo.IsForPlatform() 910*333d2b36SAndroid Build Coastguard Worker 911*333d2b36SAndroid Build Coastguard Worker libName := proptools.String(module.properties.Lib_name) 912*333d2b36SAndroid Build Coastguard Worker module.selfValidate(ctx) 913*333d2b36SAndroid Build Coastguard Worker xmlContent := module.permissionsContents(ctx) 914*333d2b36SAndroid Build Coastguard Worker 915*333d2b36SAndroid Build Coastguard Worker module.outputFilePath = android.PathForModuleOut(ctx, libName+".xml").OutputPath 916*333d2b36SAndroid Build Coastguard Worker android.WriteFileRuleVerbatim(ctx, module.outputFilePath, xmlContent) 917*333d2b36SAndroid Build Coastguard Worker 918*333d2b36SAndroid Build Coastguard Worker module.installDirPath = android.PathForModuleInstall(ctx, "etc", module.SubDir()) 919*333d2b36SAndroid Build Coastguard Worker ctx.PackageFile(module.installDirPath, libName+".xml", module.outputFilePath) 920*333d2b36SAndroid Build Coastguard Worker 921*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(android.OutputPaths{module.outputFilePath}.Paths(), "") 922*333d2b36SAndroid Build Coastguard Worker} 923*333d2b36SAndroid Build Coastguard Worker 924*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) AndroidMkEntries() []android.AndroidMkEntries { 925*333d2b36SAndroid Build Coastguard Worker if module.hideApexVariantFromMake { 926*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{{ 927*333d2b36SAndroid Build Coastguard Worker Disabled: true, 928*333d2b36SAndroid Build Coastguard Worker }} 929*333d2b36SAndroid Build Coastguard Worker } 930*333d2b36SAndroid Build Coastguard Worker 931*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{{ 932*333d2b36SAndroid Build Coastguard Worker Class: "ETC", 933*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(module.outputFilePath), 934*333d2b36SAndroid Build Coastguard Worker ExtraEntries: []android.AndroidMkExtraEntriesFunc{ 935*333d2b36SAndroid Build Coastguard Worker func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { 936*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_TAGS", "optional") 937*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_MODULE_PATH", module.installDirPath.String()) 938*333d2b36SAndroid Build Coastguard Worker entries.SetString("LOCAL_INSTALLED_MODULE_STEM", module.outputFilePath.Base()) 939*333d2b36SAndroid Build Coastguard Worker }, 940*333d2b36SAndroid Build Coastguard Worker }, 941*333d2b36SAndroid Build Coastguard Worker }} 942*333d2b36SAndroid Build Coastguard Worker} 943*333d2b36SAndroid Build Coastguard Worker 944*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) selfValidate(ctx android.ModuleContext) { 945*333d2b36SAndroid Build Coastguard Worker module.validateAtLeastTAttributes(ctx) 946*333d2b36SAndroid Build Coastguard Worker module.validateMinAndMaxDeviceSdk(ctx) 947*333d2b36SAndroid Build Coastguard Worker module.validateMinMaxDeviceSdkAndModuleMinSdk(ctx) 948*333d2b36SAndroid Build Coastguard Worker module.validateOnBootclasspathBeforeRequirements(ctx) 949*333d2b36SAndroid Build Coastguard Worker} 950*333d2b36SAndroid Build Coastguard Worker 951*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateAtLeastTAttributes(ctx android.ModuleContext) { 952*333d2b36SAndroid Build Coastguard Worker t := android.ApiLevelOrPanic(ctx, "Tiramisu") 953*333d2b36SAndroid Build Coastguard Worker module.attrAtLeastT(ctx, t, module.properties.Min_device_sdk, "min_device_sdk") 954*333d2b36SAndroid Build Coastguard Worker module.attrAtLeastT(ctx, t, module.properties.Max_device_sdk, "max_device_sdk") 955*333d2b36SAndroid Build Coastguard Worker module.attrAtLeastT(ctx, t, module.properties.On_bootclasspath_before, "on_bootclasspath_before") 956*333d2b36SAndroid Build Coastguard Worker module.attrAtLeastT(ctx, t, module.properties.On_bootclasspath_since, "on_bootclasspath_since") 957*333d2b36SAndroid Build Coastguard Worker} 958*333d2b36SAndroid Build Coastguard Worker 959*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) attrAtLeastT(ctx android.ModuleContext, t android.ApiLevel, attr *string, attrName string) { 960*333d2b36SAndroid Build Coastguard Worker if attr != nil { 961*333d2b36SAndroid Build Coastguard Worker if level, err := android.ApiLevelFromUser(ctx, *attr); err == nil { 962*333d2b36SAndroid Build Coastguard Worker // we will inform the user of invalid inputs when we try to write the 963*333d2b36SAndroid Build Coastguard Worker // permissions xml file so we don't need to do it here 964*333d2b36SAndroid Build Coastguard Worker if t.GreaterThan(level) { 965*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf(attrName, "Attribute value needs to be at least T") 966*333d2b36SAndroid Build Coastguard Worker } 967*333d2b36SAndroid Build Coastguard Worker } 968*333d2b36SAndroid Build Coastguard Worker } 969*333d2b36SAndroid Build Coastguard Worker} 970*333d2b36SAndroid Build Coastguard Worker 971*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateMinAndMaxDeviceSdk(ctx android.ModuleContext) { 972*333d2b36SAndroid Build Coastguard Worker if module.properties.Min_device_sdk != nil && module.properties.Max_device_sdk != nil { 973*333d2b36SAndroid Build Coastguard Worker min, minErr := android.ApiLevelFromUser(ctx, *module.properties.Min_device_sdk) 974*333d2b36SAndroid Build Coastguard Worker max, maxErr := android.ApiLevelFromUser(ctx, *module.properties.Max_device_sdk) 975*333d2b36SAndroid Build Coastguard Worker if minErr == nil && maxErr == nil { 976*333d2b36SAndroid Build Coastguard Worker // we will inform the user of invalid inputs when we try to write the 977*333d2b36SAndroid Build Coastguard Worker // permissions xml file so we don't need to do it here 978*333d2b36SAndroid Build Coastguard Worker if min.GreaterThan(max) { 979*333d2b36SAndroid Build Coastguard Worker ctx.ModuleErrorf("min_device_sdk can't be greater than max_device_sdk") 980*333d2b36SAndroid Build Coastguard Worker } 981*333d2b36SAndroid Build Coastguard Worker } 982*333d2b36SAndroid Build Coastguard Worker } 983*333d2b36SAndroid Build Coastguard Worker} 984*333d2b36SAndroid Build Coastguard Worker 985*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateMinMaxDeviceSdkAndModuleMinSdk(ctx android.ModuleContext) { 986*333d2b36SAndroid Build Coastguard Worker moduleMinApi := android.ApiLevelOrPanic(ctx, *module.properties.Sdk_library_min_api_level) 987*333d2b36SAndroid Build Coastguard Worker if module.properties.Min_device_sdk != nil { 988*333d2b36SAndroid Build Coastguard Worker api, err := android.ApiLevelFromUser(ctx, *module.properties.Min_device_sdk) 989*333d2b36SAndroid Build Coastguard Worker if err == nil { 990*333d2b36SAndroid Build Coastguard Worker if moduleMinApi.GreaterThan(api) { 991*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("min_device_sdk", "Can't be less than module's min sdk (%s)", moduleMinApi) 992*333d2b36SAndroid Build Coastguard Worker } 993*333d2b36SAndroid Build Coastguard Worker } 994*333d2b36SAndroid Build Coastguard Worker } 995*333d2b36SAndroid Build Coastguard Worker if module.properties.Max_device_sdk != nil { 996*333d2b36SAndroid Build Coastguard Worker api, err := android.ApiLevelFromUser(ctx, *module.properties.Max_device_sdk) 997*333d2b36SAndroid Build Coastguard Worker if err == nil { 998*333d2b36SAndroid Build Coastguard Worker if moduleMinApi.GreaterThan(api) { 999*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("max_device_sdk", "Can't be less than module's min sdk (%s)", moduleMinApi) 1000*333d2b36SAndroid Build Coastguard Worker } 1001*333d2b36SAndroid Build Coastguard Worker } 1002*333d2b36SAndroid Build Coastguard Worker } 1003*333d2b36SAndroid Build Coastguard Worker} 1004*333d2b36SAndroid Build Coastguard Worker 1005*333d2b36SAndroid Build Coastguard Workerfunc (module *sdkLibraryXml) validateOnBootclasspathBeforeRequirements(ctx android.ModuleContext) { 1006*333d2b36SAndroid Build Coastguard Worker moduleMinApi := android.ApiLevelOrPanic(ctx, *module.properties.Sdk_library_min_api_level) 1007*333d2b36SAndroid Build Coastguard Worker if module.properties.On_bootclasspath_before != nil { 1008*333d2b36SAndroid Build Coastguard Worker t := android.ApiLevelOrPanic(ctx, "Tiramisu") 1009*333d2b36SAndroid Build Coastguard Worker // if we use the attribute, then we need to do this validation 1010*333d2b36SAndroid Build Coastguard Worker if moduleMinApi.LessThan(t) { 1011*333d2b36SAndroid Build Coastguard Worker // if minAPi is < T, then we need to have min_device_sdk (which only accepts T+) 1012*333d2b36SAndroid Build Coastguard Worker if module.properties.Min_device_sdk == nil { 1013*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("on_bootclasspath_before", "Using this property requires that the module's min_sdk_version or the shared library's min_device_sdk is at least T") 1014*333d2b36SAndroid Build Coastguard Worker } 1015*333d2b36SAndroid Build Coastguard Worker } 1016*333d2b36SAndroid Build Coastguard Worker } 1017*333d2b36SAndroid Build Coastguard Worker} 1018