blob: 05c7e814de1cd8487e2ed7fba02065d96cf550b5 [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// java_sdk_library is to make a Java library that implements optional platform APIs to apps.
67// It is actually a wrapper of several modules: 1) stubs library that clients are linked against
68// to, 2) droiddoc module that internally generates API stubs source files, 3) the real runtime
69// shared library that implements the APIs, and 4) XML file for adding the runtime lib to the
70// classpath at runtime if requested via <uses-library>.
71//
72// TODO: these are big features that are currently missing
Jiyong Park1be96912018-05-28 18:02:19 +090073// 1) disallowing linking to the runtime shared lib
74// 2) HTML generation
Jiyong Parkc678ad32018-04-10 13:07:10 +090075
76func init() {
Inseob Kimc0907f12019-02-08 21:00:45 +090077 android.RegisterModuleType("java_sdk_library", SdkLibraryFactory)
Colin Cross79c7c262019-04-17 11:11:46 -070078 android.RegisterModuleType("java_sdk_library_import", sdkLibraryImportFactory)
Jiyong Parkc678ad32018-04-10 13:07:10 +090079
Jiyong Park82484c02018-04-23 21:41:26 +090080 android.RegisterMakeVarsProvider(pctx, func(ctx android.MakeVarsContext) {
81 javaSdkLibraries := javaSdkLibraries(ctx.Config())
82 sort.Strings(*javaSdkLibraries)
83 ctx.Strict("JAVA_SDK_LIBRARIES", strings.Join(*javaSdkLibraries, " "))
84 })
Jiyong Parkc678ad32018-04-10 13:07:10 +090085}
86
87type sdkLibraryProperties struct {
Jiyong Parkbaaf9dd2018-05-02 01:35:27 +090088 // list of optional source files that are part of API but not part of runtime library.
89 Api_srcs []string `android:"arch_variant"`
90
Sundong Ahnf043cf62018-06-25 16:04:37 +090091 // List of Java libraries that will be in the classpath when building stubs
92 Stub_only_libs []string `android:"arch_variant"`
93
Jiyong Parkc678ad32018-04-10 13:07:10 +090094 // list of package names that will be documented and publicized as API
95 Api_packages []string
96
Jiyong Park5a2c9d72018-05-01 22:25:41 +090097 // list of package names that must be hidden from the API
98 Hidden_api_packages []string
99
Paul Duffin11512472019-02-11 15:55:17 +0000100 // local files that are used within user customized droiddoc options.
101 Droiddoc_option_files []string
102
103 // additional droiddoc options
104 // Available variables for substitution:
105 //
106 // $(location <label>): the path to the droiddoc_option_files with name <label>
Sundong Ahndd567f92018-07-31 17:19:11 +0900107 Droiddoc_options []string
108
Sundong Ahnb952ba02019-01-08 16:32:12 +0900109 // the java library (in classpath) for documentation that provides java srcs and srcjars.
110 Srcs_lib *string
111
112 // the base dirs under srcs_lib will be scanned for java srcs.
113 Srcs_lib_whitelist_dirs []string
114
Sundong Ahndd567f92018-07-31 17:19:11 +0900115 // the sub dirs under srcs_lib_whitelist_dirs will be scanned for java srcs.
116 // Defaults to "android.annotation".
117 Srcs_lib_whitelist_pkgs []string
118
Sundong Ahn054b19a2018-10-19 13:46:09 +0900119 // a list of top-level directories containing files to merge qualifier annotations
120 // (i.e. those intended to be included in the stubs written) from.
121 Merge_annotations_dirs []string
122
123 // a list of top-level directories containing Java stub files to merge show/hide annotations from.
124 Merge_inclusion_annotations_dirs []string
125
126 // If set to true, the path of dist files is apistubs/core. Defaults to false.
127 Core_lib *bool
128
Sundong Ahn80a87b32019-05-13 15:02:50 +0900129 // don't create dist rules.
130 No_dist *bool `blueprint:"mutated"`
131
Jiyong Parkc678ad32018-04-10 13:07:10 +0900132 // TODO: determines whether to create HTML doc or not
133 //Html_doc *bool
134}
135
Inseob Kimc0907f12019-02-08 21:00:45 +0900136type SdkLibrary struct {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900137 Library
Jiyong Parkc678ad32018-04-10 13:07:10 +0900138
Sundong Ahn054b19a2018-10-19 13:46:09 +0900139 sdkLibraryProperties sdkLibraryProperties
Jiyong Parkc678ad32018-04-10 13:07:10 +0900140
141 publicApiStubsPath android.Paths
142 systemApiStubsPath android.Paths
Jiyong Parkdf130542018-04-27 16:29:21 +0900143 testApiStubsPath android.Paths
Sundong Ahn241cd372018-07-13 16:16:44 +0900144
145 publicApiStubsImplPath android.Paths
146 systemApiStubsImplPath android.Paths
147 testApiStubsImplPath android.Paths
Sundong Ahn20e998b2018-07-24 11:19:26 +0900148
149 publicApiFilePath android.Path
150 systemApiFilePath android.Path
151 testApiFilePath android.Path
Jiyong Parkc678ad32018-04-10 13:07:10 +0900152}
153
Inseob Kimc0907f12019-02-08 21:00:45 +0900154var _ Dependency = (*SdkLibrary)(nil)
155var _ SdkLibraryDependency = (*SdkLibrary)(nil)
Colin Cross897d2ed2019-02-11 14:03:51 -0800156
Inseob Kimc0907f12019-02-08 21:00:45 +0900157func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900158 // Add dependencies to the stubs library
Colin Cross42d48b72018-08-29 14:10:52 -0700159 ctx.AddVariationDependencies(nil, publicApiStubsTag, module.stubsName(apiScopePublic))
Colin Cross42d48b72018-08-29 14:10:52 -0700160 ctx.AddVariationDependencies(nil, publicApiFileTag, module.docsName(apiScopePublic))
Sundong Ahn054b19a2018-10-19 13:46:09 +0900161
Paul Duffin250e6192019-06-07 10:44:37 +0100162 sdkDep := decodeSdkDep(ctx, sdkContext(&module.Library))
163 if sdkDep.hasStandardLibs() {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900164 ctx.AddVariationDependencies(nil, systemApiStubsTag, module.stubsName(apiScopeSystem))
165 ctx.AddVariationDependencies(nil, systemApiFileTag, module.docsName(apiScopeSystem))
166 ctx.AddVariationDependencies(nil, testApiFileTag, module.docsName(apiScopeTest))
167 ctx.AddVariationDependencies(nil, testApiStubsTag, module.stubsName(apiScopeTest))
168 }
169
170 module.Library.deps(ctx)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900171}
172
Inseob Kimc0907f12019-02-08 21:00:45 +0900173func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900174 module.Library.GenerateAndroidBuildActions(ctx)
175
Sundong Ahn57368eb2018-07-06 11:20:23 +0900176 // Record the paths to the header jars of the library (stubs and impl).
Jiyong Parkc678ad32018-04-10 13:07:10 +0900177 // When this java_sdk_library is dependened from others via "libs" property,
178 // the recorded paths will be returned depending on the link type of the caller.
179 ctx.VisitDirectDeps(func(to android.Module) {
180 otherName := ctx.OtherModuleName(to)
181 tag := ctx.OtherModuleDependencyTag(to)
182
Sundong Ahn57368eb2018-07-06 11:20:23 +0900183 if lib, ok := to.(Dependency); ok {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900184 switch tag {
185 case publicApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900186 module.publicApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900187 module.publicApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900188 case systemApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900189 module.systemApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900190 module.systemApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkdf130542018-04-27 16:29:21 +0900191 case testApiStubsTag:
Sundong Ahn57368eb2018-07-06 11:20:23 +0900192 module.testApiStubsPath = lib.HeaderJars()
Sundong Ahn241cd372018-07-13 16:16:44 +0900193 module.testApiStubsImplPath = lib.ImplementationJars()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900194 }
195 }
Sundong Ahn20e998b2018-07-24 11:19:26 +0900196 if doc, ok := to.(ApiFilePath); ok {
197 switch tag {
198 case publicApiFileTag:
199 module.publicApiFilePath = doc.ApiFilePath()
200 case systemApiFileTag:
201 module.systemApiFilePath = doc.ApiFilePath()
202 case testApiFileTag:
203 module.testApiFilePath = doc.ApiFilePath()
204 default:
205 ctx.ModuleErrorf("depends on module %q of unknown tag %q", otherName, tag)
206 }
207 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900208 })
209}
210
Inseob Kimc0907f12019-02-08 21:00:45 +0900211func (module *SdkLibrary) AndroidMk() android.AndroidMkData {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900212 data := module.Library.AndroidMk()
213 data.Required = append(data.Required, module.xmlFileName())
214
215 data.Custom = func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
216 android.WriteAndroidMkData(w, data)
217
218 module.Library.AndroidMkHostDex(w, name, data)
Sundong Ahn80a87b32019-05-13 15:02:50 +0900219 if !Bool(module.sdkLibraryProperties.No_dist) {
220 // Create a phony module that installs the impl library, for the case when this lib is
221 // in PRODUCT_PACKAGES.
222 owner := module.ModuleBase.Owner()
223 if owner == "" {
224 if Bool(module.sdkLibraryProperties.Core_lib) {
225 owner = "core"
226 } else {
227 owner = "android"
228 }
Sundong Ahn4fd04bb2018-08-31 18:01:37 +0900229 }
Sundong Ahn80a87b32019-05-13 15:02:50 +0900230 // Create dist rules to install the stubs libs to the dist dir
231 if len(module.publicApiStubsPath) == 1 {
232 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
233 module.publicApiStubsImplPath.Strings()[0]+
234 ":"+path.Join("apistubs", owner, "public",
235 module.BaseModuleName()+".jar")+")")
236 }
237 if len(module.systemApiStubsPath) == 1 {
238 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
239 module.systemApiStubsImplPath.Strings()[0]+
240 ":"+path.Join("apistubs", owner, "system",
241 module.BaseModuleName()+".jar")+")")
242 }
243 if len(module.testApiStubsPath) == 1 {
244 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
245 module.testApiStubsImplPath.Strings()[0]+
246 ":"+path.Join("apistubs", owner, "test",
247 module.BaseModuleName()+".jar")+")")
248 }
249 if module.publicApiFilePath != nil {
250 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
251 module.publicApiFilePath.String()+
252 ":"+path.Join("apistubs", owner, "public", "api",
253 module.BaseModuleName()+".txt")+")")
254 }
255 if module.systemApiFilePath != nil {
256 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
257 module.systemApiFilePath.String()+
258 ":"+path.Join("apistubs", owner, "system", "api",
259 module.BaseModuleName()+".txt")+")")
260 }
261 if module.testApiFilePath != nil {
262 fmt.Fprintln(w, "$(call dist-for-goals,sdk win_sdk,"+
263 module.testApiFilePath.String()+
264 ":"+path.Join("apistubs", owner, "test", "api",
265 module.BaseModuleName()+".txt")+")")
266 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900267 }
Jiyong Park82484c02018-04-23 21:41:26 +0900268 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900269 return data
Jiyong Park82484c02018-04-23 21:41:26 +0900270}
271
Jiyong Parkc678ad32018-04-10 13:07:10 +0900272// Module name of the stubs library
Inseob Kimc0907f12019-02-08 21:00:45 +0900273func (module *SdkLibrary) stubsName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900274 stubsName := module.BaseModuleName() + sdkStubsLibrarySuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900275 switch apiScope {
276 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900277 stubsName = stubsName + sdkSystemApiSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900278 case apiScopeTest:
279 stubsName = stubsName + sdkTestApiSuffix
Jiyong Parkc678ad32018-04-10 13:07:10 +0900280 }
281 return stubsName
282}
283
284// Module name of the docs
Inseob Kimc0907f12019-02-08 21:00:45 +0900285func (module *SdkLibrary) docsName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900286 docsName := module.BaseModuleName() + sdkDocsSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900287 switch apiScope {
288 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900289 docsName = docsName + sdkSystemApiSuffix
Jiyong Parkdf130542018-04-27 16:29:21 +0900290 case apiScopeTest:
291 docsName = docsName + sdkTestApiSuffix
Jiyong Parkc678ad32018-04-10 13:07:10 +0900292 }
293 return docsName
294}
295
296// Module name of the runtime implementation library
Inseob Kimc0907f12019-02-08 21:00:45 +0900297func (module *SdkLibrary) implName() string {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900298 return module.BaseModuleName()
Jiyong Parkc678ad32018-04-10 13:07:10 +0900299}
300
301// File path to the runtime implementation library
Inseob Kimc0907f12019-02-08 21:00:45 +0900302func (module *SdkLibrary) implPath() string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900303 partition := "system"
304 if module.SocSpecific() {
305 partition = "vendor"
306 } else if module.DeviceSpecific() {
307 partition = "odm"
308 } else if module.ProductSpecific() {
309 partition = "product"
310 }
311 return "/" + partition + "/framework/" + module.implName() + ".jar"
312}
313
314// Module name of the XML file for the lib
Inseob Kimc0907f12019-02-08 21:00:45 +0900315func (module *SdkLibrary) xmlFileName() string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900316 return module.BaseModuleName() + sdkXmlFileSuffix
317}
318
319// SDK version that the stubs library is built against. Note that this is always
320// *current. Older stubs library built with a numberd SDK version is created from
321// the prebuilt jar.
Inseob Kimc0907f12019-02-08 21:00:45 +0900322func (module *SdkLibrary) sdkVersion(apiScope apiScope) string {
Jiyong Parkdf130542018-04-27 16:29:21 +0900323 switch apiScope {
324 case apiScopePublic:
325 return "current"
326 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900327 return "system_current"
Jiyong Parkdf130542018-04-27 16:29:21 +0900328 case apiScopeTest:
329 return "test_current"
330 default:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900331 return "current"
332 }
333}
334
335// $(INTERNAL_PLATFORM_<apiTagName>_API_FILE) points to the generated
336// api file for the current source
337// TODO: remove this when apicheck is done in soong
Inseob Kimc0907f12019-02-08 21:00:45 +0900338func (module *SdkLibrary) apiTagName(apiScope apiScope) string {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900339 apiTagName := strings.Replace(strings.ToUpper(module.BaseModuleName()), ".", "_", -1)
Jiyong Parkdf130542018-04-27 16:29:21 +0900340 switch apiScope {
341 case apiScopeSystem:
Jiyong Parkc678ad32018-04-10 13:07:10 +0900342 apiTagName = apiTagName + "_SYSTEM"
Jiyong Parkdf130542018-04-27 16:29:21 +0900343 case apiScopeTest:
344 apiTagName = apiTagName + "_TEST"
Jiyong Parkc678ad32018-04-10 13:07:10 +0900345 }
346 return apiTagName
347}
348
Inseob Kimc0907f12019-02-08 21:00:45 +0900349func (module *SdkLibrary) latestApiFilegroupName(apiScope apiScope) string {
Jiyong Park58c518b2018-05-12 22:29:12 +0900350 name := ":" + module.BaseModuleName() + ".api."
Jiyong Parkdf130542018-04-27 16:29:21 +0900351 switch apiScope {
Jiyong Park58c518b2018-05-12 22:29:12 +0900352 case apiScopePublic:
353 name = name + "public"
Jiyong Parkdf130542018-04-27 16:29:21 +0900354 case apiScopeSystem:
Jiyong Park58c518b2018-05-12 22:29:12 +0900355 name = name + "system"
Jiyong Parkdf130542018-04-27 16:29:21 +0900356 case apiScopeTest:
Jiyong Park58c518b2018-05-12 22:29:12 +0900357 name = name + "test"
Jiyong Parkc678ad32018-04-10 13:07:10 +0900358 }
Jiyong Park58c518b2018-05-12 22:29:12 +0900359 name = name + ".latest"
360 return name
361}
Jiyong Parkc678ad32018-04-10 13:07:10 +0900362
Inseob Kimc0907f12019-02-08 21:00:45 +0900363func (module *SdkLibrary) latestRemovedApiFilegroupName(apiScope apiScope) string {
Jiyong Park58c518b2018-05-12 22:29:12 +0900364 name := ":" + module.BaseModuleName() + "-removed.api."
365 switch apiScope {
366 case apiScopePublic:
367 name = name + "public"
368 case apiScopeSystem:
369 name = name + "system"
370 case apiScopeTest:
371 name = name + "test"
372 }
373 name = name + ".latest"
374 return name
Jiyong Parkc678ad32018-04-10 13:07:10 +0900375}
376
377// Creates a static java library that has API stubs
Colin Crossf8b860a2019-04-16 14:43:28 -0700378func (module *SdkLibrary) createStubsLibrary(mctx android.LoadHookContext, apiScope apiScope) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900379 props := struct {
380 Name *string
381 Srcs []string
382 Sdk_version *string
Sundong Ahnf043cf62018-06-25 16:04:37 +0900383 Libs []string
Jiyong Parkc678ad32018-04-10 13:07:10 +0900384 Soc_specific *bool
385 Device_specific *bool
386 Product_specific *bool
Sundong Ahndd567f92018-07-31 17:19:11 +0900387 Compile_dex *bool
Sundong Ahn054b19a2018-10-19 13:46:09 +0900388 No_standard_libs *bool
389 System_modules *string
390 Java_version *string
Jiyong Parkc678ad32018-04-10 13:07:10 +0900391 Product_variables struct {
392 Unbundled_build struct {
393 Enabled *bool
394 }
Jiyong Park82484c02018-04-23 21:41:26 +0900395 Pdk struct {
396 Enabled *bool
397 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900398 }
Sundong Ahn054b19a2018-10-19 13:46:09 +0900399 Openjdk9 struct {
400 Srcs []string
401 Javacflags []string
402 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900403 }{}
404
Paul Duffin250e6192019-06-07 10:44:37 +0100405 sdkDep := decodeSdkDep(mctx, sdkContext(&module.Library))
406
Jiyong Parkdf130542018-04-27 16:29:21 +0900407 props.Name = proptools.StringPtr(module.stubsName(apiScope))
Jiyong Parkc678ad32018-04-10 13:07:10 +0900408 // sources are generated from the droiddoc
Jiyong Parkdf130542018-04-27 16:29:21 +0900409 props.Srcs = []string{":" + module.docsName(apiScope)}
410 props.Sdk_version = proptools.StringPtr(module.sdkVersion(apiScope))
Sundong Ahn054b19a2018-10-19 13:46:09 +0900411 props.Libs = module.sdkLibraryProperties.Stub_only_libs
Jiyong Parkc678ad32018-04-10 13:07:10 +0900412 // Unbundled apps will use the prebult one from /prebuilts/sdk
Colin Cross10932872019-04-18 14:27:12 -0700413 if mctx.Config().UnbundledBuildUsePrebuiltSdks() {
Colin Cross2c77ceb2019-01-21 11:56:21 -0800414 props.Product_variables.Unbundled_build.Enabled = proptools.BoolPtr(false)
415 }
Jiyong Park82484c02018-04-23 21:41:26 +0900416 props.Product_variables.Pdk.Enabled = proptools.BoolPtr(false)
Paul Duffin250e6192019-06-07 10:44:37 +0100417 props.No_standard_libs = proptools.BoolPtr(!sdkDep.hasStandardLibs())
Sundong Ahn054b19a2018-10-19 13:46:09 +0900418 props.System_modules = module.Library.Module.deviceProperties.System_modules
419 props.Openjdk9.Srcs = module.Library.Module.properties.Openjdk9.Srcs
420 props.Openjdk9.Javacflags = module.Library.Module.properties.Openjdk9.Javacflags
421 props.Java_version = module.Library.Module.properties.Java_version
422 if module.Library.Module.deviceProperties.Compile_dex != nil {
423 props.Compile_dex = module.Library.Module.deviceProperties.Compile_dex
Sundong Ahndd567f92018-07-31 17:19:11 +0900424 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900425
426 if module.SocSpecific() {
427 props.Soc_specific = proptools.BoolPtr(true)
428 } else if module.DeviceSpecific() {
429 props.Device_specific = proptools.BoolPtr(true)
430 } else if module.ProductSpecific() {
431 props.Product_specific = proptools.BoolPtr(true)
432 }
433
Colin Cross9ae1b922018-06-26 17:59:05 -0700434 mctx.CreateModule(android.ModuleFactoryAdaptor(LibraryFactory), &props)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900435}
436
437// Creates a droiddoc module that creates stubs source files from the given full source
438// files
Colin Crossf8b860a2019-04-16 14:43:28 -0700439func (module *SdkLibrary) createDocs(mctx android.LoadHookContext, apiScope apiScope) {
Jiyong Parkc678ad32018-04-10 13:07:10 +0900440 props := struct {
Sundong Ahn054b19a2018-10-19 13:46:09 +0900441 Name *string
442 Srcs []string
443 Installable *bool
444 Srcs_lib *string
445 Srcs_lib_whitelist_dirs []string
446 Srcs_lib_whitelist_pkgs []string
447 Libs []string
Paul Duffin11512472019-02-11 15:55:17 +0000448 Arg_files []string
Sundong Ahn054b19a2018-10-19 13:46:09 +0900449 Args *string
450 Api_tag_name *string
451 Api_filename *string
452 Removed_api_filename *string
453 No_standard_libs *bool
454 Java_version *string
455 Merge_annotations_dirs []string
456 Merge_inclusion_annotations_dirs []string
457 Check_api struct {
Inseob Kim38449af2019-02-28 14:24:05 +0900458 Current ApiToCheck
459 Last_released ApiToCheck
460 Ignore_missing_latest_api *bool
Jiyong Park58c518b2018-05-12 22:29:12 +0900461 }
Sundong Ahn1b92c822018-05-29 11:35:17 +0900462 Aidl struct {
463 Include_dirs []string
464 Local_include_dirs []string
465 }
Jiyong Parkc678ad32018-04-10 13:07:10 +0900466 }{}
467
Paul Duffin250e6192019-06-07 10:44:37 +0100468 sdkDep := decodeSdkDep(mctx, sdkContext(&module.Library))
469
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...)
Jiyong Parkc678ad32018-04-10 13:07:10 +0900473 props.Installable = proptools.BoolPtr(false)
Sundong Ahne6f0b052018-06-05 16:46:14 +0900474 // A droiddoc module has only one Libs property and doesn't distinguish between
475 // shared libs and static libs. So we need to add both of these libs to Libs property.
Sundong Ahn054b19a2018-10-19 13:46:09 +0900476 props.Libs = module.Library.Module.properties.Libs
477 props.Libs = append(props.Libs, module.Library.Module.properties.Static_libs...)
478 props.Aidl.Include_dirs = module.Library.Module.deviceProperties.Aidl.Include_dirs
479 props.Aidl.Local_include_dirs = module.Library.Module.deviceProperties.Aidl.Local_include_dirs
Paul Duffin250e6192019-06-07 10:44:37 +0100480 props.No_standard_libs = proptools.BoolPtr(!sdkDep.hasStandardLibs())
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
601 if sdkVersion == "" {
602 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
Inseob Kimc0907f12019-02-08 21:00:45 +0900743func SdkLibraryFactory() android.Module {
744 module := &SdkLibrary{}
745 module.InitSdkLibraryProperties()
Sundong Ahn054b19a2018-10-19 13:46:09 +0900746 InitJavaModule(module, android.HostAndDeviceSupported)
Colin Crossf8b860a2019-04-16 14:43:28 -0700747 android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.CreateInternalModules(ctx) })
Jiyong Parkc678ad32018-04-10 13:07:10 +0900748 return module
749}
Colin Cross79c7c262019-04-17 11:11:46 -0700750
751//
752// SDK library prebuilts
753//
754
755type sdkLibraryImportProperties struct {
756 Jars []string `android:"path"`
757
758 Sdk_version *string
759
760 Installable *bool
761
762 // List of shared java libs that this module has dependencies to
763 Libs []string
764
765 // List of files to remove from the jar file(s)
766 Exclude_files []string
767
768 // List of directories to remove from the jar file(s)
769 Exclude_dirs []string
770}
771
772type sdkLibraryImport struct {
773 android.ModuleBase
774 android.DefaultableModuleBase
775 prebuilt android.Prebuilt
776
777 properties sdkLibraryImportProperties
778
779 stubsPath android.Paths
780}
781
782var _ SdkLibraryDependency = (*sdkLibraryImport)(nil)
783
784func sdkLibraryImportFactory() android.Module {
785 module := &sdkLibraryImport{}
786
787 module.AddProperties(&module.properties)
788
789 android.InitPrebuiltModule(module, &module.properties.Jars)
790 InitJavaModule(module, android.HostAndDeviceSupported)
791
792 android.AddLoadHook(module, func(mctx android.LoadHookContext) { module.createInternalModules(mctx) })
793 return module
794}
795
796func (module *sdkLibraryImport) Prebuilt() *android.Prebuilt {
797 return &module.prebuilt
798}
799
800func (module *sdkLibraryImport) Name() string {
801 return module.prebuilt.Name(module.ModuleBase.Name())
802}
803
804func (module *sdkLibraryImport) createInternalModules(mctx android.LoadHookContext) {
805 // Creates a java import for the jar with ".stubs" suffix
806 props := struct {
807 Name *string
808 Soc_specific *bool
809 Device_specific *bool
810 Product_specific *bool
811 }{}
812
813 props.Name = proptools.StringPtr(module.BaseModuleName() + sdkStubsLibrarySuffix)
814
815 if module.SocSpecific() {
816 props.Soc_specific = proptools.BoolPtr(true)
817 } else if module.DeviceSpecific() {
818 props.Device_specific = proptools.BoolPtr(true)
819 } else if module.ProductSpecific() {
820 props.Product_specific = proptools.BoolPtr(true)
821 }
822
823 mctx.CreateModule(android.ModuleFactoryAdaptor(ImportFactory), &props, &module.properties)
824
825 javaSdkLibraries := javaSdkLibraries(mctx.Config())
826 javaSdkLibrariesLock.Lock()
827 defer javaSdkLibrariesLock.Unlock()
828 *javaSdkLibraries = append(*javaSdkLibraries, module.BaseModuleName())
829}
830
831func (module *sdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) {
832 // Add dependencies to the prebuilt stubs library
833 ctx.AddVariationDependencies(nil, publicApiStubsTag, module.BaseModuleName()+sdkStubsLibrarySuffix)
834}
835
836func (module *sdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
837 // Record the paths to the prebuilt stubs library.
838 ctx.VisitDirectDeps(func(to android.Module) {
839 tag := ctx.OtherModuleDependencyTag(to)
840
841 switch tag {
842 case publicApiStubsTag:
843 module.stubsPath = to.(Dependency).HeaderJars()
844 }
845 })
846}
847
848// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700849func (module *sdkLibraryImport) SdkHeaderJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Colin Cross79c7c262019-04-17 11:11:46 -0700850 // This module is just a wrapper for the prebuilt stubs.
851 return module.stubsPath
852}
853
854// to satisfy SdkLibraryDependency interface
Colin Cross0ea8ba82019-06-06 14:33:29 -0700855func (module *sdkLibraryImport) SdkImplementationJars(ctx android.BaseModuleContext, sdkVersion string) android.Paths {
Colin Cross79c7c262019-04-17 11:11:46 -0700856 // This module is just a wrapper for the stubs.
857 return module.stubsPath
858}