blob: 1182b966f7516eaf1c65819ae738a531a3190c7a [file] [log] [blame]
Jiyong Parkc678ad32018-04-10 13:07:10 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
18 "android/soong/android"
19 "android/soong/genrule"
20 "fmt"
Jiyong Park82484c02018-04-23 21:41:26 +090021 "io"
Jiyong Parkc678ad32018-04-10 13:07:10 +090022 "path"
Sundong Ahn054b19a2018-10-19 13:46:09 +090023 "path/filepath"
Jiyong Park82484c02018-04-23 21:41:26 +090024 "sort"
Jiyong Parkc678ad32018-04-10 13:07:10 +090025 "strings"
Jiyong Park82484c02018-04-23 21:41:26 +090026 "sync"
Jiyong Parkc678ad32018-04-10 13:07:10 +090027
28 "github.com/google/blueprint"
29 "github.com/google/blueprint/proptools"
30)
31
32var (
33 sdkStubsLibrarySuffix = ".stubs"
34 sdkSystemApiSuffix = ".system"
Jiyong Parkdf130542018-04-27 16:29:21 +090035 sdkTestApiSuffix = ".test"
Jiyong Parkc678ad32018-04-10 13:07:10 +090036 sdkDocsSuffix = ".docs"
Jiyong Parkc678ad32018-04-10 13:07:10 +090037 sdkXmlFileSuffix = ".xml"
38)
39
40type stubsLibraryDependencyTag struct {
41 blueprint.BaseDependencyTag
42 name string
43}
44
45var (
46 publicApiStubsTag = dependencyTag{name: "public"}
47 systemApiStubsTag = dependencyTag{name: "system"}
Jiyong Parkdf130542018-04-27 16:29:21 +090048 testApiStubsTag = dependencyTag{name: "test"}
Sundong Ahn20e998b2018-07-24 11:19:26 +090049 publicApiFileTag = dependencyTag{name: "publicApi"}
50 systemApiFileTag = dependencyTag{name: "systemApi"}
51 testApiFileTag = dependencyTag{name: "testApi"}
Jiyong Parkdf130542018-04-27 16:29:21 +090052)
53
54type apiScope int
55
56const (
57 apiScopePublic apiScope = iota
58 apiScopeSystem
59 apiScopeTest
Jiyong Parkc678ad32018-04-10 13:07:10 +090060)
61
Jiyong Park82484c02018-04-23 21:41:26 +090062var (
63 javaSdkLibrariesLock sync.Mutex
64)
65
Jiyong Parkc678ad32018-04-10 13:07:10 +090066// TODO: these are big features that are currently missing
Jiyong Park1be96912018-05-28 18:02:19 +090067// 1) disallowing linking to the runtime shared lib
68// 2) HTML generation
Jiyong Parkc678ad32018-04-10 13:07:10 +090069
70func init() {
Inseob Kimc0907f12019-02-08 21:00:45 +090071 android.RegisterModuleType("java_sdk_library", SdkLibraryFactory)
Colin Cross79c7c262019-04-17 11:11:46 -070072 android.RegisterModuleType("java_sdk_library_import", sdkLibraryImportFactory)
Jiyong Parkc678ad32018-04-10 13:07:10 +090073
Jiyong Park82484c02018-04-23 21:41:26 +090074 android.RegisterMakeVarsProvider(pctx, func(ctx android.MakeVarsContext) {
75 javaSdkLibraries := javaSdkLibraries(ctx.Config())
76 sort.Strings(*javaSdkLibraries)
77 ctx.Strict("JAVA_SDK_LIBRARIES", strings.Join(*javaSdkLibraries, " "))
78 })
Jiyong Parkc678ad32018-04-10 13:07:10 +090079}
80
81type sdkLibraryProperties struct {
Jiyong Parkbaaf9dd2018-05-02 01:35:27 +090082 // list of optional source files that are part of API but not part of runtime library.
83 Api_srcs []string `android:"arch_variant"`
84
Sundong Ahnf043cf62018-06-25 16:04:37 +090085 // List of Java libraries that will be in the classpath when building stubs
86 Stub_only_libs []string `android:"arch_variant"`
87
Jiyong Parkc678ad32018-04-10 13:07:10 +090088 // list of package names that will be documented and publicized as API
89 Api_packages []string
90
Jiyong Park5a2c9d72018-05-01 22:25:41 +090091 // list of package names that must be hidden from the API
92 Hidden_api_packages []string
93
Paul Duffin11512472019-02-11 15:55:17 +000094 // local files that are used within user customized droiddoc options.
95 Droiddoc_option_files []string
96
97 // additional droiddoc options
98 // Available variables for substitution:
99 //
100 // $(location <label>): the path to the droiddoc_option_files with name <label>
Sundong Ahndd567f92018-07-31 17:19:11 +0900101 Droiddoc_options []string
102
Sundong Ahnb952ba02019-01-08 16:32:12 +0900103 // the java library (in classpath) for documentation that provides java srcs and srcjars.
104 Srcs_lib *string
105
106 // the base dirs under srcs_lib will be scanned for java srcs.
107 Srcs_lib_whitelist_dirs []string
108
Sundong Ahndd567f92018-07-31 17:19:11 +0900109 // the sub dirs under srcs_lib_whitelist_dirs will be scanned for java srcs.
110 // Defaults to "android.annotation".
111 Srcs_lib_whitelist_pkgs []string
112
Sundong Ahn054b19a2018-10-19 13:46:09 +0900113 // a list of top-level directories containing files to merge qualifier annotations
114 // (i.e. those intended to be included in the stubs written) from.
115 Merge_annotations_dirs []string
116
117 // a list of top-level directories containing Java stub files to merge show/hide annotations from.
118 Merge_inclusion_annotations_dirs []string
119
120 // If set to true, the path of dist files is apistubs/core. Defaults to false.
121 Core_lib *bool
122
Sundong Ahn80a87b32019-05-13 15:02:50 +0900123 // don't create dist rules.
124 No_dist *bool `blueprint:"mutated"`
125
Jiyong Parkc678ad32018-04-10 13:07:10 +0900126 // TODO: determines whether to create HTML doc or not
127 //Html_doc *bool
128}
129
Inseob Kimc0907f12019-02-08 21:00:45 +0900130type SdkLibrary struct {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900131 Library
Jiyong Parkc678ad32018-04-10 13:07:10 +0900132
Sundong Ahn054b19a2018-10-19 13:46:09 +0900133 sdkLibraryProperties sdkLibraryProperties
Jiyong Parkc678ad32018-04-10 13:07:10 +0900134
135 publicApiStubsPath android.Paths
136 systemApiStubsPath android.Paths
Jiyong Parkdf130542018-04-27 16:29:21 +0900137 testApiStubsPath android.Paths
Sundong Ahn241cd372018-07-13 16:16:44 +0900138
139 publicApiStubsImplPath android.Paths
140 systemApiStubsImplPath android.Paths
141 testApiStubsImplPath android.Paths
Sundong Ahn20e998b2018-07-24 11:19:26 +0900142
143 publicApiFilePath android.Path
144 systemApiFilePath android.Path
145 testApiFilePath android.Path
Jiyong Parkc678ad32018-04-10 13:07:10 +0900146}
147
Inseob Kimc0907f12019-02-08 21:00:45 +0900148var _ Dependency = (*SdkLibrary)(nil)
149var _ SdkLibraryDependency = (*SdkLibrary)(nil)
Colin Cross897d2ed2019-02-11 14:03:51 -0800150
Inseob Kimc0907f12019-02-08 21:00:45 +0900151func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900152 // Add dependencies to the stubs library
Colin Cross42d48b72018-08-29 14:10:52 -0700153 ctx.AddVariationDependencies(nil, publicApiStubsTag, module.stubsName(apiScopePublic))
Colin Cross42d48b72018-08-29 14:10:52 -0700154 ctx.AddVariationDependencies(nil, publicApiFileTag, module.docsName(apiScopePublic))
Sundong Ahn054b19a2018-10-19 13:46:09 +0900155
Paul Duffin250e6192019-06-07 10:44:37 +0100156 sdkDep := decodeSdkDep(ctx, sdkContext(&module.Library))
157 if sdkDep.hasStandardLibs() {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900158 ctx.AddVariationDependencies(nil, systemApiStubsTag, module.stubsName(apiScopeSystem))
159 ctx.AddVariationDependencies(nil, systemApiFileTag, module.docsName(apiScopeSystem))
160 ctx.AddVariationDependencies(nil, testApiFileTag, module.docsName(apiScopeTest))
161 ctx.AddVariationDependencies(nil, testApiStubsTag, module.stubsName(apiScopeTest))
162 }
163
164 module.Library.deps(ctx)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900165}
166
Inseob Kimc0907f12019-02-08 21:00:45 +0900167func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900168 module.Library.GenerateAndroidBuildActions(ctx)
169
Sundong Ahn57368eb2018-07-06 11:20:23 +0900170 // Record the paths to the header jars of the library (stubs and impl).
Jiyong Parkc678ad32018-04-10 13:07:10 +0900171 // When this java_sdk_library is dependened from others via "libs" property,
172 // the recorded paths will be returned depending on the link type of the caller.
173 ctx.VisitDirectDeps(func(to android.Module) {
174 otherName := ctx.OtherModuleName(to)
175 tag := ctx.OtherModuleDependencyTag(to)
176
Sundong Ahn57368eb2018-07-06 11:20:23 +0900177 if lib, ok := to.(Dependency); ok {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900178 switch tag {
179 case publicApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900180 module.publicApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900181 module.publicApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900182 case systemApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900183 module.systemApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900184 module.systemApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkdf130542018-04-27 16:29:21 +0900185 case testApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900186 module.testApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900187 module.testApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900188 }
189 }
Sundong Ahn20e998b2018-07-24 11:19:26 +0900190 if doc, ok := to.(ApiFilePath); ok {
191 switch tag {
192 case publicApiFileTag:
193 module.publicApiFilePath = doc.ApiFilePath()
194 case systemApiFileTag:
195 module.systemApiFilePath = doc.ApiFilePath()
196 case testApiFileTag:
197 module.testApiFilePath = doc.ApiFilePath()
198 default:
199 ctx.ModuleErrorf("depends on module %q of unknown tag %q", otherName, tag)
200 }
201 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900202 })
203}
204
Inseob Kimc0907f12019-02-08 21:00:45 +0900205func (module *SdkLibrary) AndroidMk() android.AndroidMkData {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900206 data := module.Library.AndroidMk()
207 data.Required = append(data.Required, module.xmlFileName())
208
209 data.Custom = func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
210 android.WriteAndroidMkData(w, data)
211
212 module.Library.AndroidMkHostDex(w, name, data)
Sundong Ahn80a87b32019-05-13 15:02:50 +0900213 if !Bool(module.sdkLibraryProperties.No_dist) {
214 // Create a phony module that installs the impl library, for the case when this lib is
215 // in PRODUCT_PACKAGES.
216 owner := module.ModuleBase.Owner()
217 if owner == "" {
218 if Bool(module.sdkLibraryProperties.Core_lib) {
219 owner = "core"
220 } else {
221 owner = "android"
222 }
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900223 }
Sundong Ahn80a87b32019-05-13 15:02:50 +0900224 // Create dist rules to install the stubs libs to the dist dir
225 if len(module.publicApiStubsPath) == 1 {
226 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
227 module.publicApiStubsImplPath.Strings()[0]+
228 ":"+path.Join("apistubs", owner, "public",
229 module.BaseModuleName()+".jar")+")")
230 }
231 if len(module.systemApiStubsPath) == 1 {
232 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
233 module.systemApiStubsImplPath.Strings()[0]+
234 ":"+path.Join("apistubs", owner, "system",
235 module.BaseModuleName()+".jar")+")")
236 }
237 if len(module.testApiStubsPath) == 1 {
238 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
239 module.testApiStubsImplPath.Strings()[0]+
240 ":"+path.Join("apistubs", owner, "test",
241 module.BaseModuleName()+".jar")+")")
242 }
243 if module.publicApiFilePath != nil {
244 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
245 module.publicApiFilePath.String()+
246 ":"+path.Join("apistubs", owner, "public", "api",
247 module.BaseModuleName()+".txt")+")")
248 }
249 if module.systemApiFilePath != nil {
250 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
251 module.systemApiFilePath.String()+
252 ":"+path.Join("apistubs", owner, "system", "api",
253 module.BaseModuleName()+".txt")+")")
254 }
255 if module.testApiFilePath != nil {
256 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
257 module.testApiFilePath.String()+
258 ":"+path.Join("apistubs", owner, "test", "api",
259 module.BaseModuleName()+".txt")+")")
260 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900261 }
Jiyong Park82484c02018-04-23 21:41:26 +0900262 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900263 return data
Jiyong Park82484c02018-04-23 21:41:26 +0900264}
265
Jiyong Parkc678ad32018-04-10 13:07:10 +0900266// Module name of the stubs library
Inseob Kimc0907f12019-02-08 21:00:45 +0900267func (module *SdkLibrary) stubsName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900268 stubsName := module.BaseModuleName() + sdkStubsLibrarySuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900269 switch apiScope {
270 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900271 stubsName = stubsName + sdkSystemApiSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900272 case apiScopeTest:
273 stubsName = stubsName + sdkTestApiSuffix
Jiyong Parkc678ad32018-04-10 13:07:10 +0900274 }
275 return stubsName
276}
277
278// Module name of the docs
Inseob Kimc0907f12019-02-08 21:00:45 +0900279func (module *SdkLibrary) docsName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900280 docsName := module.BaseModuleName() + sdkDocsSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900281 switch apiScope {
282 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900283 docsName = docsName + sdkSystemApiSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900284 case apiScopeTest:
285 docsName = docsName + sdkTestApiSuffix
Jiyong Parkc678ad32018-04-10 13:07:10 +0900286 }
287 return docsName
288}
289
290// Module name of the runtime implementation library
Inseob Kimc0907f12019-02-08 21:00:45 +0900291func (module *SdkLibrary) implName() string {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900292 return module.BaseModuleName()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900293}
294
295// File path to the runtime implementation library
Inseob Kimc0907f12019-02-08 21:00:45 +0900296func (module *SdkLibrary) implPath() string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900297 partition := "system"
298 if module.SocSpecific() {
299 partition = "vendor"
300 } else if module.DeviceSpecific() {
301 partition = "odm"
302 } else if module.ProductSpecific() {
303 partition = "product"
304 }
305 return "/" + partition + "/framework/" + module.implName() + ".jar"
306}
307
308// Module name of the XML file for the lib
Inseob Kimc0907f12019-02-08 21:00:45 +0900309func (module *SdkLibrary) xmlFileName() string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900310 return module.BaseModuleName() + sdkXmlFileSuffix
311}
312
313// SDK version that the stubs library is built against. Note that this is always
314// *current. Older stubs library built with a numberd SDK version is created from
315// the prebuilt jar.
Inseob Kimc0907f12019-02-08 21:00:45 +0900316func (module *SdkLibrary) sdkVersion(apiScope apiScope) string {
Jiyong Parkdf130542018-04-27 16:29:21 +0900317 switch apiScope {
318 case apiScopePublic:
319 return "current"
320 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900321 return "system_current"
Jiyong Parkdf130542018-04-27 16:29:21 +0900322 case apiScopeTest:
323 return "test_current"
324 default:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900325 return "current"
326 }
327}
328
329// $(INTERNAL_PLATFORM_<apiTagName>_API_FILE) points to the generated
330// api file for the current source
331// TODO: remove this when apicheck is done in soong
Inseob Kimc0907f12019-02-08 21:00:45 +0900332func (module *SdkLibrary) apiTagName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900333 apiTagName := strings.Replace(strings.ToUpper(module.BaseModuleName()), ".", "_", -1)
Jiyong Parkdf130542018-04-27 16:29:21 +0900334 switch apiScope {
335 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900336 apiTagName = apiTagName + "_SYSTEM"
Jiyong Parkdf130542018-04-27 16:29:21 +0900337 case apiScopeTest:
338 apiTagName = apiTagName + "_TEST"
Jiyong Parkc678ad32018-04-10 13:07:10 +0900339 }
340 return apiTagName
341}
342
Inseob Kimc0907f12019-02-08 21:00:45 +0900343func (module *SdkLibrary) latestApiFilegroupName(apiScope apiScope) string {
Jiyong Park58c518b2018-05-12 22:29:12 +0900344 name := ":" + module.BaseModuleName() + ".api."
Jiyong Parkdf130542018-04-27 16:29:21 +0900345 switch apiScope {
Jiyong Park58c518b2018-05-12 22:29:12 +0900346 case apiScopePublic:
347 name = name + "public"
Jiyong Parkdf130542018-04-27 16:29:21 +0900348 case apiScopeSystem:
Jiyong Park58c518b2018-05-12 22:29:12 +0900349 name = name + "system"
Jiyong Parkdf130542018-04-27 16:29:21 +0900350 case apiScopeTest:
Jiyong Park58c518b2018-05-12 22:29:12 +0900351 name = name + "test"
Jiyong Parkc678ad32018-04-10 13:07:10 +0900352 }
Jiyong Park58c518b2018-05-12 22:29:12 +0900353 name = name + ".latest"
354 return name
355}
Jiyong Parkc678ad32018-04-10 13:07:10 +0900356
Inseob Kimc0907f12019-02-08 21:00:45 +0900357func (module *SdkLibrary) latestRemovedApiFilegroupName(apiScope apiScope) string {
Jiyong Park58c518b2018-05-12 22:29:12 +0900358 name := ":" + module.BaseModuleName() + "-removed.api."
359 switch apiScope {
360 case apiScopePublic:
361 name = name + "public"
362 case apiScopeSystem:
363 name = name + "system"
364 case apiScopeTest:
365 name = name + "test"
366 }
367 name = name + ".latest"
368 return name
Jiyong Parkc678ad32018-04-10 13:07:10 +0900369}
370
371// Creates a static java library that has API stubs
Colin Crossf8b860a2019-04-16 14:43:28 -0700372func (module *SdkLibrary) createStubsLibrary(mctx android.LoadHookContext, apiScope apiScope) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900373 props := struct {
374 Name *string
375 Srcs []string
376 Sdk_version *string
Sundong Ahnf043cf62018-06-25 16:04:37 +0900377 Libs []string
Jiyong Parkc678ad32018-04-10 13:07:10 +0900378 Soc_specific *bool
379 Device_specific *bool
380 Product_specific *bool
Sundong Ahndd567f92018-07-31 17:19:11 +0900381 Compile_dex *bool
Sundong Ahn054b19a2018-10-19 13:46:09 +0900382 System_modules *string
383 Java_version *string
Jiyong Parkc678ad32018-04-10 13:07:10 +0900384 Product_variables struct {
385 Unbundled_build struct {
386 Enabled *bool
387 }
Jiyong Park82484c02018-04-23 21:41:26 +0900388 Pdk struct {
389 Enabled *bool
390 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900391 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900392 Openjdk9 struct {
393 Srcs []string
394 Javacflags []string
395 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900396 }{}
397
Paul Duffin52d398a2019-06-11 12:31:14 +0100398 sdkVersion := module.sdkVersion(apiScope)
Paul Duffin250e6192019-06-07 10:44:37 +0100399 sdkDep := decodeSdkDep(mctx, sdkContext(&module.Library))
Paul Duffin52d398a2019-06-11 12:31:14 +0100400 if !sdkDep.hasStandardLibs() {
401 sdkVersion = "none"
402 }
Paul Duffin250e6192019-06-07 10:44:37 +0100403
Jiyong Parkdf130542018-04-27 16:29:21 +0900404 props.Name = proptools.StringPtr(module.stubsName(apiScope))
Jiyong Parkc678ad32018-04-10 13:07:10 +0900405 // sources are generated from the droiddoc
Jiyong Parkdf130542018-04-27 16:29:21 +0900406 props.Srcs = []string{":" + module.docsName(apiScope)}
Paul Duffin52d398a2019-06-11 12:31:14 +0100407 props.Sdk_version = proptools.StringPtr(sdkVersion)
Sundong Ahn054b19a2018-10-19 13:46:09 +0900408 props.Libs = module.sdkLibraryProperties.Stub_only_libs
Jiyong Parkc678ad32018-04-10 13:07:10 +0900409 // Unbundled apps will use the prebult one from /prebuilts/sdk
Colin Cross10932872019-04-18 14:27:12 -0700410 if mctx.Config().UnbundledBuildUsePrebuiltSdks() {
Colin Cross2c77ceb2019-01-21 11:56:21 -0800411 props.Product_variables.Unbundled_build.Enabled = proptools.BoolPtr(false)
412 }
Jiyong Park82484c02018-04-23 21:41:26 +0900413 props.Product_variables.Pdk.Enabled = proptools.BoolPtr(false)
Sundong Ahn054b19a2018-10-19 13:46:09 +0900414 props.System_modules = module.Library.Module.deviceProperties.System_modules
415 props.Openjdk9.Srcs = module.Library.Module.properties.Openjdk9.Srcs
416 props.Openjdk9.Javacflags = module.Library.Module.properties.Openjdk9.Javacflags
417 props.Java_version = module.Library.Module.properties.Java_version
418 if module.Library.Module.deviceProperties.Compile_dex != nil {
419 props.Compile_dex = module.Library.Module.deviceProperties.Compile_dex
Sundong Ahndd567f92018-07-31 17:19:11 +0900420 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900421
422 if module.SocSpecific() {
423 props.Soc_specific = proptools.BoolPtr(true)
424 } else if module.DeviceSpecific() {
425 props.Device_specific = proptools.BoolPtr(true)
426 } else if module.ProductSpecific() {
427 props.Product_specific = proptools.BoolPtr(true)
428 }
429
Colin Cross9ae1b922018-06-26 17:59:05 -0700430 mctx.CreateModule(android.ModuleFactoryAdaptor(LibraryFactory), &props)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900431}
432
433// Creates a droiddoc module that creates stubs source files from the given full source
434// files
Colin Crossf8b860a2019-04-16 14:43:28 -0700435func (module *SdkLibrary) createDocs(mctx android.LoadHookContext, apiScope apiScope) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900436 props := struct {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900437 Name *string
438 Srcs []string
439 Installable *bool
440 Srcs_lib *string
441 Srcs_lib_whitelist_dirs []string
442 Srcs_lib_whitelist_pkgs []string
Paul Duffin52d398a2019-06-11 12:31:14 +0100443 Sdk_version *string
Sundong Ahn054b19a2018-10-19 13:46:09 +0900444 Libs []string
Paul Duffin11512472019-02-11 15:55:17 +0000445 Arg_files []string
Sundong Ahn054b19a2018-10-19 13:46:09 +0900446 Args *string
447 Api_tag_name *string
448 Api_filename *string
449 Removed_api_filename *string
Sundong Ahn054b19a2018-10-19 13:46:09 +0900450 Java_version *string
451 Merge_annotations_dirs []string
452 Merge_inclusion_annotations_dirs []string
453 Check_api struct {
Inseob Kim38449af2019-02-28 14:24:05 +0900454 Current ApiToCheck
455 Last_released ApiToCheck
456 Ignore_missing_latest_api *bool
Jiyong Park58c518b2018-05-12 22:29:12 +0900457 }
Sundong Ahn1b92c822018-05-29 11:35:17 +0900458 Aidl struct {
459 Include_dirs []string
460 Local_include_dirs []string
461 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900462 }{}
463
Paul Duffin250e6192019-06-07 10:44:37 +0100464 sdkDep := decodeSdkDep(mctx, sdkContext(&module.Library))
Paul Duffin52d398a2019-06-11 12:31:14 +0100465 sdkVersion := ""
466 if !sdkDep.hasStandardLibs() {
467 sdkVersion = "none"
468 }
Paul Duffin250e6192019-06-07 10:44:37 +0100469
Jiyong Parkdf130542018-04-27 16:29:21 +0900470 props.Name = proptools.StringPtr(module.docsName(apiScope))
Sundong Ahn054b19a2018-10-19 13:46:09 +0900471 props.Srcs = append(props.Srcs, module.Library.Module.properties.Srcs...)
472 props.Srcs = append(props.Srcs, module.sdkLibraryProperties.Api_srcs...)
Paul Duffin52d398a2019-06-11 12:31:14 +0100473 props.Sdk_version = proptools.StringPtr(sdkVersion)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900474 props.Installable = proptools.BoolPtr(false)
Sundong Ahne6f0b052018-06-05 16:46:14 +0900475 // A droiddoc module has only one Libs property and doesn't distinguish between
476 // shared libs and static libs. So we need to add both of these libs to Libs property.
Sundong Ahn054b19a2018-10-19 13:46:09 +0900477 props.Libs = module.Library.Module.properties.Libs
478 props.Libs = append(props.Libs, module.Library.Module.properties.Static_libs...)
479 props.Aidl.Include_dirs = module.Library.Module.deviceProperties.Aidl.Include_dirs
480 props.Aidl.Local_include_dirs = module.Library.Module.deviceProperties.Aidl.Local_include_dirs
Sundong Ahn054b19a2018-10-19 13:46:09 +0900481 props.Java_version = module.Library.Module.properties.Java_version
Jiyong Parkc678ad32018-04-10 13:07:10 +0900482
Sundong Ahn054b19a2018-10-19 13:46:09 +0900483 props.Merge_annotations_dirs = module.sdkLibraryProperties.Merge_annotations_dirs
484 props.Merge_inclusion_annotations_dirs = module.sdkLibraryProperties.Merge_inclusion_annotations_dirs
485
486 droiddocArgs := " --stub-packages " + strings.Join(module.sdkLibraryProperties.Api_packages, ":") +
487 " " + android.JoinWithPrefix(module.sdkLibraryProperties.Hidden_api_packages, " --hide-package ") +
488 " " + android.JoinWithPrefix(module.sdkLibraryProperties.Droiddoc_options, " ") +
Sundong Ahn04ef8a32019-01-14 11:36:50 +0900489 " --hide MissingPermission --hide BroadcastBehavior " +
490 "--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +
491 "--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo"
Sundong Ahnfb2721f2018-09-17 13:23:09 +0900492
Jiyong Parkdf130542018-04-27 16:29:21 +0900493 switch apiScope {
494 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900495 droiddocArgs = droiddocArgs + " -showAnnotation android.annotation.SystemApi"
Jiyong Parkdf130542018-04-27 16:29:21 +0900496 case apiScopeTest:
497 droiddocArgs = droiddocArgs + " -showAnnotation android.annotation.TestApi"
Jiyong Parkc678ad32018-04-10 13:07:10 +0900498 }
Paul Duffin11512472019-02-11 15:55:17 +0000499 props.Arg_files = module.sdkLibraryProperties.Droiddoc_option_files
Jiyong Parkc678ad32018-04-10 13:07:10 +0900500 props.Args = proptools.StringPtr(droiddocArgs)
501
502 // List of APIs identified from the provided source files are created. They are later
503 // compared against to the not-yet-released (a.k.a current) list of APIs and to the
504 // last-released (a.k.a numbered) list of API.
Jiyong Parkc678ad32018-04-10 13:07:10 +0900505 currentApiFileName := "current.txt"
506 removedApiFileName := "removed.txt"
Jiyong Parkdf130542018-04-27 16:29:21 +0900507 switch apiScope {
508 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900509 currentApiFileName = "system-" + currentApiFileName
510 removedApiFileName = "system-" + removedApiFileName
Jiyong Parkdf130542018-04-27 16:29:21 +0900511 case apiScopeTest:
512 currentApiFileName = "test-" + currentApiFileName
513 removedApiFileName = "test-" + removedApiFileName
Jiyong Parkc678ad32018-04-10 13:07:10 +0900514 }
515 currentApiFileName = path.Join("api", currentApiFileName)
516 removedApiFileName = path.Join("api", removedApiFileName)
Jiyong Park58c518b2018-05-12 22:29:12 +0900517 // TODO(jiyong): remove these three props
Jiyong Parkdf130542018-04-27 16:29:21 +0900518 props.Api_tag_name = proptools.StringPtr(module.apiTagName(apiScope))
Jiyong Parkc678ad32018-04-10 13:07:10 +0900519 props.Api_filename = proptools.StringPtr(currentApiFileName)
520 props.Removed_api_filename = proptools.StringPtr(removedApiFileName)
521
Jiyong Park58c518b2018-05-12 22:29:12 +0900522 // check against the not-yet-release API
523 props.Check_api.Current.Api_file = proptools.StringPtr(currentApiFileName)
524 props.Check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName)
Jiyong Park58c518b2018-05-12 22:29:12 +0900525
526 // check against the latest released API
527 props.Check_api.Last_released.Api_file = proptools.StringPtr(
528 module.latestApiFilegroupName(apiScope))
529 props.Check_api.Last_released.Removed_api_file = proptools.StringPtr(
530 module.latestRemovedApiFilegroupName(apiScope))
Inseob Kim38449af2019-02-28 14:24:05 +0900531 props.Check_api.Ignore_missing_latest_api = proptools.BoolPtr(true)
Sundong Ahn054b19a2018-10-19 13:46:09 +0900532 props.Srcs_lib = module.sdkLibraryProperties.Srcs_lib
533 props.Srcs_lib_whitelist_dirs = module.sdkLibraryProperties.Srcs_lib_whitelist_dirs
534 props.Srcs_lib_whitelist_pkgs = module.sdkLibraryProperties.Srcs_lib_whitelist_pkgs
Jiyong Park58c518b2018-05-12 22:29:12 +0900535
Sundong Ahn04ef8a32019-01-14 11:36:50 +0900536 mctx.CreateModule(android.ModuleFactoryAdaptor(DroidstubsFactory), &props)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900537}
538
Jiyong Parkc678ad32018-04-10 13:07:10 +0900539// Creates the xml file that publicizes the runtime library
Colin Crossf8b860a2019-04-16 14:43:28 -0700540func (module *SdkLibrary) createXmlFile(mctx android.LoadHookContext) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900541 template := `
542<?xml version="1.0" encoding="utf-8"?>
543<!-- Copyright (C) 2018 The Android Open Source Project
544
545 Licensed under the Apache License, Version 2.0 (the "License");
546 you may not use this file except in compliance with the License.
547 You may obtain a copy of the License at
548
549 http://www.apache.org/licenses/LICENSE-2.0
550
551 Unless required by applicable law or agreed to in writing, software
552 distributed under the License is distributed on an "AS IS" BASIS,
553 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
554 See the License for the specific language governing permissions and
555 limitations under the License.
556-->
557
558<permissions>
559 <library name="%s" file="%s"/>
560</permissions>
561`
562 // genrule to generate the xml file content from the template above
563 // TODO: preserve newlines in the generate xml file. Newlines are being squashed
564 // in the ninja file. Do we need to have an external tool for this?
565 xmlContent := fmt.Sprintf(template, module.BaseModuleName(), module.implPath())
566 genruleProps := struct {
567 Name *string
568 Cmd *string
569 Out []string
570 }{}
571 genruleProps.Name = proptools.StringPtr(module.xmlFileName() + "-gen")
572 genruleProps.Cmd = proptools.StringPtr("echo '" + xmlContent + "' > $(out)")
573 genruleProps.Out = []string{module.xmlFileName()}
574 mctx.CreateModule(android.ModuleFactoryAdaptor(genrule.GenRuleFactory), &genruleProps)
575
576 // creates a prebuilt_etc module to actually place the xml file under
577 // <partition>/etc/permissions
578 etcProps := struct {
579 Name *string
Jiyong Park5a8d1be2018-04-25 22:57:34 +0900580 Src *string
Jiyong Parkc678ad32018-04-10 13:07:10 +0900581 Sub_dir *string
582 Soc_specific *bool
583 Device_specific *bool
584 Product_specific *bool
585 }{}
586 etcProps.Name = proptools.StringPtr(module.xmlFileName())
Jiyong Park5a8d1be2018-04-25 22:57:34 +0900587 etcProps.Src = proptools.StringPtr(":" + module.xmlFileName() + "-gen")
Jiyong Parkc678ad32018-04-10 13:07:10 +0900588 etcProps.Sub_dir = proptools.StringPtr("permissions")
589 if module.SocSpecific() {
590 etcProps.Soc_specific = proptools.BoolPtr(true)
591 } else if module.DeviceSpecific() {
592 etcProps.Device_specific = proptools.BoolPtr(true)
593 } else if module.ProductSpecific() {
594 etcProps.Product_specific = proptools.BoolPtr(true)
595 }
596 mctx.CreateModule(android.ModuleFactoryAdaptor(android.PrebuiltEtcFactory), &etcProps)
597}
598
Colin Cross0ea8ba82019-06-06 14:33:29 -0700599func (module *SdkLibrary) PrebuiltJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900600 var api, v string
Paul Duffin52d398a2019-06-11 12:31:14 +0100601 if sdkVersion == "" || sdkVersion == "none" {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900602 api = "system"
603 v = "current"
604 } else if strings.Contains(sdkVersion, "_") {
605 t := strings.Split(sdkVersion, "_")
606 api = t[0]
607 v = t[1]
Jiyong Parkc678ad32018-04-10 13:07:10 +0900608 } else {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900609 api = "public"
610 v = sdkVersion
611 }
612 dir := filepath.Join("prebuilts", "sdk", v, api)
613 jar := filepath.Join(dir, module.BaseModuleName()+".jar")
614 jarPath := android.ExistentPathForSource(ctx, jar)
Sundong Ahnae418ac2019-02-28 15:01:28 +0900615 if !jarPath.Valid() {
616 ctx.PropertyErrorf("sdk_library", "invalid sdk version %q, %q does not exist", v, jar)
617 return nil
618 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900619 return android.Paths{jarPath.Path()}
620}
621
622// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700623func (module *SdkLibrary) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900624 // This module is just a wrapper for the stubs.
Colin Cross10932872019-04-18 14:27:12 -0700625 if ctx.Config().UnbundledBuildUsePrebuiltSdks() {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900626 return module.PrebuiltJars(ctx, sdkVersion)
627 } else {
628 if strings.HasPrefix(sdkVersion, "system_") {
629 return module.systemApiStubsPath
630 } else if sdkVersion == "" {
631 return module.Library.HeaderJars()
632 } else {
633 return module.publicApiStubsPath
634 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900635 }
636}
637
Sundong Ahn241cd372018-07-13 16:16:44 +0900638// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700639func (module *SdkLibrary) SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Sundong Ahn241cd372018-07-13 16:16:44 +0900640 // This module is just a wrapper for the stubs.
Colin Cross10932872019-04-18 14:27:12 -0700641 if ctx.Config().UnbundledBuildUsePrebuiltSdks() {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900642 return module.PrebuiltJars(ctx, sdkVersion)
Sundong Ahn241cd372018-07-13 16:16:44 +0900643 } else {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900644 if strings.HasPrefix(sdkVersion, "system_") {
645 return module.systemApiStubsImplPath
646 } else if sdkVersion == "" {
647 return module.Library.ImplementationJars()
648 } else {
649 return module.publicApiStubsImplPath
650 }
Sundong Ahn241cd372018-07-13 16:16:44 +0900651 }
652}
653
Sundong Ahn80a87b32019-05-13 15:02:50 +0900654func (module *SdkLibrary) SetNoDist() {
655 module.sdkLibraryProperties.No_dist = proptools.BoolPtr(true)
656}
657
Colin Cross571cccf2019-02-04 11:22:08 -0800658var javaSdkLibrariesKey = android.NewOnceKey("javaSdkLibraries")
659
Jiyong Park82484c02018-04-23 21:41:26 +0900660func javaSdkLibraries(config android.Config) *[]string {
Colin Cross571cccf2019-02-04 11:22:08 -0800661 return config.Once(javaSdkLibrariesKey, func() interface{} {
Jiyong Park82484c02018-04-23 21:41:26 +0900662 return &[]string{}
663 }).(*[]string)
664}
665
Jiyong Parkc678ad32018-04-10 13:07:10 +0900666// For a java_sdk_library module, create internal modules for stubs, docs,
667// runtime libs and xml file. If requested, the stubs and docs are created twice
668// once for public API level and once for system API level
Colin Crossf8b860a2019-04-16 14:43:28 -0700669func (module *SdkLibrary) CreateInternalModules(mctx android.LoadHookContext) {
Inseob Kim6e93ac92019-03-21 17:43:49 +0900670 if len(module.Library.Module.properties.Srcs) == 0 {
Inseob Kimc0907f12019-02-08 21:00:45 +0900671 mctx.PropertyErrorf("srcs", "java_sdk_library must specify srcs")
672 }
673
Inseob Kim6e93ac92019-03-21 17:43:49 +0900674 if len(module.sdkLibraryProperties.Api_packages) == 0 {
Inseob Kimc0907f12019-02-08 21:00:45 +0900675 mctx.PropertyErrorf("api_packages", "java_sdk_library must specify api_packages")
676 }
Inseob Kim8098faa2019-03-18 10:19:51 +0900677
678 missing_current_api := false
679
680 for _, scope := range []string{"", "system-", "test-"} {
681 for _, api := range []string{"current.txt", "removed.txt"} {
682 path := path.Join(mctx.ModuleDir(), "api", scope+api)
683 p := android.ExistentPathForSource(mctx, path)
684 if !p.Valid() {
685 mctx.ModuleErrorf("Current api file %#v doesn't exist", path)
686 missing_current_api = true
687 }
688 }
689 }
690
691 if missing_current_api {
692 script := "build/soong/scripts/gen-java-current-api-files.sh"
693 p := android.ExistentPathForSource(mctx, script)
694
695 if !p.Valid() {
696 panic(fmt.Sprintf("script file %s doesn't exist", script))
697 }
698
699 mctx.ModuleErrorf("One or more current api files are missing. "+
700 "You can update them by:\n"+
701 "%s %q && m update-api", script, mctx.ModuleDir())
702 return
703 }
704
Inseob Kimc0907f12019-02-08 21:00:45 +0900705 // for public API stubs
706 module.createStubsLibrary(mctx, apiScopePublic)
707 module.createDocs(mctx, apiScopePublic)
708
Paul Duffin250e6192019-06-07 10:44:37 +0100709 sdkDep := decodeSdkDep(mctx, sdkContext(&module.Library))
710 if sdkDep.hasStandardLibs() {
Inseob Kimc0907f12019-02-08 21:00:45 +0900711 // for system API stubs
712 module.createStubsLibrary(mctx, apiScopeSystem)
713 module.createDocs(mctx, apiScopeSystem)
714
715 // for test API stubs
716 module.createStubsLibrary(mctx, apiScopeTest)
717 module.createDocs(mctx, apiScopeTest)
718
719 // for runtime
720 module.createXmlFile(mctx)
721 }
722
723 // record java_sdk_library modules so that they are exported to make
724 javaSdkLibraries := javaSdkLibraries(mctx.Config())
725 javaSdkLibrariesLock.Lock()
726 defer javaSdkLibrariesLock.Unlock()
727 *javaSdkLibraries = append(*javaSdkLibraries, module.BaseModuleName())
728}
729
730func (module *SdkLibrary) InitSdkLibraryProperties() {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900731 module.AddProperties(
732 &module.sdkLibraryProperties,
733 &module.Library.Module.properties,
734 &module.Library.Module.dexpreoptProperties,
735 &module.Library.Module.deviceProperties,
736 &module.Library.Module.protoProperties,
737 )
738
739 module.Library.Module.properties.Installable = proptools.BoolPtr(true)
740 module.Library.Module.deviceProperties.IsSDKLibrary = true
Inseob Kimc0907f12019-02-08 21:00:45 +0900741}
Sundong Ahn054b19a2018-10-19 13:46:09 +0900742
Jaewoong Jung4f158ee2019-07-11 10:05:35 -0700743// java_sdk_library is a special Java library that provides optional platform APIs to apps.
744// In practice, it can be viewed as a combination of several modules: 1) stubs library that clients
745// are linked against to, 2) droiddoc module that internally generates API stubs source files,
746// 3) the real runtime shared library that implements the APIs, and 4) XML file for adding
747// the runtime lib to the classpath at runtime if requested via <uses-library>.
Inseob Kimc0907f12019-02-08 21:00:45 +0900748func SdkLibraryFactory() android.Module {
749 module := &SdkLibrary{}
750 module.InitSdkLibraryProperties()
Sundong Ahn054b19a2018-10-19 13:46:09 +0900751 InitJavaModule(module, android.HostAndDeviceSupported)
Colin Crossf8b860a2019-04-16 14:43:28 -0700752 android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.CreateInternalModules(ctx) })
Jiyong Parkc678ad32018-04-10 13:07:10 +0900753 return module
754}
Colin Cross79c7c262019-04-17 11:11:46 -0700755
756//
757// SDK library prebuilts
758//
759
760type sdkLibraryImportProperties struct {
761 Jars []string `android:"path"`
762
763 Sdk_version *string
764
765 Installable *bool
766
767 // List of shared java libs that this module has dependencies to
768 Libs []string
769
770 // List of files to remove from the jar file(s)
771 Exclude_files []string
772
773 // List of directories to remove from the jar file(s)
774 Exclude_dirs []string
775}
776
777type sdkLibraryImport struct {
778 android.ModuleBase
779 android.DefaultableModuleBase
780 prebuilt android.Prebuilt
781
782 properties sdkLibraryImportProperties
783
784 stubsPath android.Paths
785}
786
787var _ SdkLibraryDependency = (*sdkLibraryImport)(nil)
788
Jaewoong Jung4f158ee2019-07-11 10:05:35 -0700789// java_sdk_library_import imports a prebuilt java_sdk_library.
Colin Cross79c7c262019-04-17 11:11:46 -0700790func sdkLibraryImportFactory() android.Module {
791 module := &sdkLibraryImport{}
792
793 module.AddProperties(&module.properties)
794
795 android.InitPrebuiltModule(module, &module.properties.Jars)
796 InitJavaModule(module, android.HostAndDeviceSupported)
797
798 android.AddLoadHook(module, func(mctx android.LoadHookContext) { module.createInternalModules(mctx) })
799 return module
800}
801
802func (module *sdkLibraryImport) Prebuilt() *android.Prebuilt {
803 return &module.prebuilt
804}
805
806func (module *sdkLibraryImport) Name() string {
807 return module.prebuilt.Name(module.ModuleBase.Name())
808}
809
810func (module *sdkLibraryImport) createInternalModules(mctx android.LoadHookContext) {
811 // Creates a java import for the jar with ".stubs" suffix
812 props := struct {
813 Name *string
814 Soc_specific *bool
815 Device_specific *bool
816 Product_specific *bool
817 }{}
818
819 props.Name = proptools.StringPtr(module.BaseModuleName() + sdkStubsLibrarySuffix)
820
821 if module.SocSpecific() {
822 props.Soc_specific = proptools.BoolPtr(true)
823 } else if module.DeviceSpecific() {
824 props.Device_specific = proptools.BoolPtr(true)
825 } else if module.ProductSpecific() {
826 props.Product_specific = proptools.BoolPtr(true)
827 }
828
829 mctx.CreateModule(android.ModuleFactoryAdaptor(ImportFactory), &props, &module.properties)
830
831 javaSdkLibraries := javaSdkLibraries(mctx.Config())
832 javaSdkLibrariesLock.Lock()
833 defer javaSdkLibrariesLock.Unlock()
834 *javaSdkLibraries = append(*javaSdkLibraries, module.BaseModuleName())
835}
836
837func (module *sdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) {
838 // Add dependencies to the prebuilt stubs library
839 ctx.AddVariationDependencies(nil, publicApiStubsTag, module.BaseModuleName()+sdkStubsLibrarySuffix)
840}
841
842func (module *sdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
843 // Record the paths to the prebuilt stubs library.
844 ctx.VisitDirectDeps(func(to android.Module) {
845 tag := ctx.OtherModuleDependencyTag(to)
846
847 switch tag {
848 case publicApiStubsTag:
849 module.stubsPath = to.(Dependency).HeaderJars()
850 }
851 })
852}
853
854// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700855func (module *sdkLibraryImport) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Colin Cross79c7c262019-04-17 11:11:46 -0700856 // This module is just a wrapper for the prebuilt stubs.
857 return module.stubsPath
858}
859
860// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700861func (module *sdkLibraryImport) SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Colin Cross79c7c262019-04-17 11:11:46 -0700862 // This module is just a wrapper for the stubs.
863 return module.stubsPath
864}