blob: 4527b39d93f0d976b07b2553a077bf663bc15c19 [file] [log] [blame]
Colin Cross2fe66872015-03-30 17:20:39 -07001// Copyright 2015 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
17// This file contains the module types for compiling Java for Android, and converts the properties
18// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
19// is handled in builder.go
20
21import (
22 "fmt"
Colin Cross2fe66872015-03-30 17:20:39 -070023 "strings"
24
25 "github.com/google/blueprint"
Colin Cross2fe66872015-03-30 17:20:39 -070026
Colin Cross635c3b02016-05-18 15:37:25 -070027 "android/soong/android"
Colin Cross0607cf72015-04-28 13:28:51 -070028 "android/soong/genrule"
Colin Cross2fe66872015-03-30 17:20:39 -070029)
30
Colin Cross463a90e2015-06-17 14:20:06 -070031func init() {
Colin Cross798bfce2016-10-12 14:28:16 -070032 android.RegisterModuleType("java_library", JavaLibraryFactory)
33 android.RegisterModuleType("java_library_static", JavaLibraryFactory)
34 android.RegisterModuleType("java_library_host", JavaLibraryHostFactory)
35 android.RegisterModuleType("java_binary", JavaBinaryFactory)
36 android.RegisterModuleType("java_binary_host", JavaBinaryHostFactory)
37 android.RegisterModuleType("prebuilt_java_library", JavaPrebuiltFactory)
38 android.RegisterModuleType("prebuilt_sdk", SdkPrebuiltFactory)
39 android.RegisterModuleType("android_app", AndroidAppFactory)
Colin Cross463a90e2015-06-17 14:20:06 -070040
Colin Cross798bfce2016-10-12 14:28:16 -070041 android.RegisterSingletonType("logtags", LogtagsSingleton)
Colin Cross463a90e2015-06-17 14:20:06 -070042}
43
Colin Cross2fe66872015-03-30 17:20:39 -070044// TODO:
45// Autogenerated files:
Colin Cross2fe66872015-03-30 17:20:39 -070046// Proto
47// Renderscript
48// Post-jar passes:
49// Proguard
50// Emma
51// Jarjar
52// Dex
53// Rmtypedefs
54// Jack
55// DroidDoc
56// Findbugs
57
Colin Cross7d5136f2015-05-11 13:39:40 -070058type javaBaseProperties struct {
59 // list of source files used to compile the Java module. May be .java, .logtags, .proto,
60 // or .aidl files.
Dan Willemsen2ef08f42015-06-30 18:15:24 -070061 Srcs []string `android:"arch_variant"`
62
63 // list of source files that should not be used to build the Java module.
64 // This is most useful in the arch/multilib variants to remove non-common files
65 Exclude_srcs []string `android:"arch_variant"`
Colin Cross7d5136f2015-05-11 13:39:40 -070066
67 // list of directories containing Java resources
68 Java_resource_dirs []string `android:"arch_variant"`
69
Dan Willemsen2ef08f42015-06-30 18:15:24 -070070 // list of directories that should be excluded from java_resource_dirs
71 Exclude_java_resource_dirs []string `android:"arch_variant"`
72
Paul Duffin2b67e3b2016-11-30 16:13:09 +000073 // don't build against the default libraries (legacy-test, core-junit,
Colin Cross7d5136f2015-05-11 13:39:40 -070074 // ext, and framework for device targets)
75 No_standard_libraries bool
76
77 // list of module-specific flags that will be used for javac compiles
78 Javacflags []string `android:"arch_variant"`
79
80 // list of module-specific flags that will be used for jack compiles
81 Jack_flags []string `android:"arch_variant"`
82
83 // list of module-specific flags that will be used for dex compiles
84 Dxflags []string `android:"arch_variant"`
85
86 // list of of java libraries that will be in the classpath
87 Java_libs []string `android:"arch_variant"`
88
89 // list of java libraries that will be compiled into the resulting jar
90 Java_static_libs []string `android:"arch_variant"`
91
92 // manifest file to be included in resulting jar
Dan Willemsen34cc69e2015-09-23 15:26:20 -070093 Manifest *string
Colin Cross7d5136f2015-05-11 13:39:40 -070094
95 // if not blank, set to the version of the sdk to compile against
96 Sdk_version string
97
98 // Set for device java libraries, and for host versions of device java libraries
99 // built for testing
100 Dex bool `blueprint:"mutated"`
101
102 // if not blank, run jarjar using the specified rules file
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700103 Jarjar_rules *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700104
105 // directories to pass to aidl tool
106 Aidl_includes []string
107
108 // directories that should be added as include directories
109 // for any aidl sources of modules that depend on this module
110 Export_aidl_include_dirs []string
111}
112
Colin Cross2fe66872015-03-30 17:20:39 -0700113// javaBase contains the properties and members used by all java module types, and implements
114// the blueprint.Module interface.
115type javaBase struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700116 android.ModuleBase
Colin Cross2fe66872015-03-30 17:20:39 -0700117 module JavaModuleType
118
Colin Cross7d5136f2015-05-11 13:39:40 -0700119 properties javaBaseProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700120
121 // output file suitable for inserting into the classpath of another compile
Colin Cross635c3b02016-05-18 15:37:25 -0700122 classpathFile android.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700123
Colin Crossb7a63242015-04-16 14:09:14 -0700124 // output file suitable for installing or running
Colin Cross635c3b02016-05-18 15:37:25 -0700125 outputFile android.Path
Colin Crossb7a63242015-04-16 14:09:14 -0700126
Colin Cross2fe66872015-03-30 17:20:39 -0700127 // jarSpecs suitable for inserting classes from a static library into another jar
128 classJarSpecs []jarSpec
129
130 // jarSpecs suitable for inserting resources from a static library into another jar
131 resourceJarSpecs []jarSpec
132
Colin Cross635c3b02016-05-18 15:37:25 -0700133 exportAidlIncludeDirs android.Paths
Colin Crossc0b06f12015-04-08 13:03:43 -0700134
Colin Cross635c3b02016-05-18 15:37:25 -0700135 logtagsSrcs android.Paths
Colin Crossf05fe972015-04-10 17:45:20 -0700136
Colin Crossb7a63242015-04-16 14:09:14 -0700137 // filelists of extra source files that should be included in the javac command line,
138 // for example R.java generated by aapt for android apps
Colin Cross635c3b02016-05-18 15:37:25 -0700139 ExtraSrcLists android.Paths
Colin Crossb7a63242015-04-16 14:09:14 -0700140
Colin Cross2fe66872015-03-30 17:20:39 -0700141 // installed file for binary dependency
Colin Cross635c3b02016-05-18 15:37:25 -0700142 installFile android.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700143}
144
Colin Cross635c3b02016-05-18 15:37:25 -0700145type AndroidJavaModuleContext android.BaseContext
Colin Cross6362e272015-10-29 15:25:03 -0700146
Colin Cross2fe66872015-03-30 17:20:39 -0700147type JavaModuleType interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700148 GenerateJavaBuildActions(ctx android.ModuleContext)
Colin Cross6362e272015-10-29 15:25:03 -0700149 JavaDependencies(ctx AndroidJavaModuleContext) []string
Colin Cross2fe66872015-03-30 17:20:39 -0700150}
151
152type JavaDependency interface {
Colin Cross635c3b02016-05-18 15:37:25 -0700153 ClasspathFile() android.Path
Colin Cross2fe66872015-03-30 17:20:39 -0700154 ClassJarSpecs() []jarSpec
155 ResourceJarSpecs() []jarSpec
Colin Cross635c3b02016-05-18 15:37:25 -0700156 AidlIncludeDirs() android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700157}
158
Colin Cross635c3b02016-05-18 15:37:25 -0700159func NewJavaBase(base *javaBase, module JavaModuleType, hod android.HostOrDeviceSupported,
Colin Cross2fe66872015-03-30 17:20:39 -0700160 props ...interface{}) (blueprint.Module, []interface{}) {
161
162 base.module = module
163
164 props = append(props, &base.properties)
165
Colin Cross635c3b02016-05-18 15:37:25 -0700166 return android.InitAndroidArchModule(base, hod, android.MultilibCommon, props...)
Colin Cross2fe66872015-03-30 17:20:39 -0700167}
168
Colin Cross635c3b02016-05-18 15:37:25 -0700169func (j *javaBase) BootClasspath(ctx android.BaseContext) string {
Colin Cross2fe66872015-03-30 17:20:39 -0700170 if ctx.Device() {
171 if j.properties.Sdk_version == "" {
172 return "core-libart"
173 } else if j.properties.Sdk_version == "current" {
174 // TODO: !TARGET_BUILD_APPS
Colin Crossc0b06f12015-04-08 13:03:43 -0700175 // TODO: export preprocessed framework.aidl from android_stubs_current
Colin Cross2fe66872015-03-30 17:20:39 -0700176 return "android_stubs_current"
177 } else if j.properties.Sdk_version == "system_current" {
178 return "android_system_stubs_current"
179 } else {
180 return "sdk_v" + j.properties.Sdk_version
181 }
182 } else {
183 if j.properties.Dex {
184 return "core-libart"
185 } else {
186 return ""
187 }
188 }
189}
190
Paul Duffin2b67e3b2016-11-30 16:13:09 +0000191var defaultJavaLibraries = []string{"core-libart", "legacy-test", "ext", "framework"}
Colin Crossefb9ebe2015-04-16 14:08:06 -0700192
Colin Cross1e676be2016-10-12 14:38:15 -0700193func (j *javaBase) DepsMutator(ctx android.BottomUpMutatorContext) {
Colin Cross6362e272015-10-29 15:25:03 -0700194 if j, ok := ctx.Module().(JavaModuleType); ok {
Colin Crossc99deeb2016-04-11 15:06:20 -0700195 ctx.AddDependency(ctx.Module(), nil, j.JavaDependencies(ctx)...)
Colin Cross6362e272015-10-29 15:25:03 -0700196 }
Colin Crossb7a63242015-04-16 14:09:14 -0700197}
198
Colin Cross6362e272015-10-29 15:25:03 -0700199func (j *javaBase) JavaDependencies(ctx AndroidJavaModuleContext) []string {
Colin Cross2fe66872015-03-30 17:20:39 -0700200 var deps []string
201
202 if !j.properties.No_standard_libraries {
203 bootClasspath := j.BootClasspath(ctx)
204 if bootClasspath != "" {
205 deps = append(deps, bootClasspath)
206 }
Colin Crossefb9ebe2015-04-16 14:08:06 -0700207 if ctx.Device() && j.properties.Sdk_version == "" {
208 deps = append(deps, defaultJavaLibraries...)
209 }
Colin Cross2fe66872015-03-30 17:20:39 -0700210 }
211 deps = append(deps, j.properties.Java_libs...)
212 deps = append(deps, j.properties.Java_static_libs...)
213
214 return deps
215}
216
Colin Cross635c3b02016-05-18 15:37:25 -0700217func (j *javaBase) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
218 aidlIncludeDirs android.Paths) []string {
Colin Crossc0b06f12015-04-08 13:03:43 -0700219
Colin Cross635c3b02016-05-18 15:37:25 -0700220 localAidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl_includes)
Colin Crossc0b06f12015-04-08 13:03:43 -0700221
222 var flags []string
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700223 if aidlPreprocess.Valid() {
224 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Crossc0b06f12015-04-08 13:03:43 -0700225 } else {
Colin Cross635c3b02016-05-18 15:37:25 -0700226 flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
Colin Crossc0b06f12015-04-08 13:03:43 -0700227 }
228
Colin Cross635c3b02016-05-18 15:37:25 -0700229 flags = append(flags, android.JoinWithPrefix(j.exportAidlIncludeDirs.Strings(), "-I"))
230 flags = append(flags, android.JoinWithPrefix(localAidlIncludes.Strings(), "-I"))
231 flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
232 flags = append(flags, "-I"+android.PathForModuleSrc(ctx, "src").String())
Colin Crossc0b06f12015-04-08 13:03:43 -0700233
Colin Crossf03c82b2015-04-13 13:53:40 -0700234 return flags
Colin Crossc0b06f12015-04-08 13:03:43 -0700235}
236
Colin Cross635c3b02016-05-18 15:37:25 -0700237func (j *javaBase) collectDeps(ctx android.ModuleContext) (classpath android.Paths,
238 bootClasspath android.OptionalPath, classJarSpecs, resourceJarSpecs []jarSpec, aidlPreprocess android.OptionalPath,
239 aidlIncludeDirs android.Paths, srcFileLists android.Paths) {
Colin Cross2fe66872015-03-30 17:20:39 -0700240
241 ctx.VisitDirectDeps(func(module blueprint.Module) {
242 otherName := ctx.OtherModuleName(module)
243 if javaDep, ok := module.(JavaDependency); ok {
Colin Cross6cbb1272015-04-08 11:23:01 -0700244 if otherName == j.BootClasspath(ctx) {
Colin Cross635c3b02016-05-18 15:37:25 -0700245 bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile())
Colin Crossb7a63242015-04-16 14:09:14 -0700246 } else if inList(otherName, defaultJavaLibraries) {
247 classpath = append(classpath, javaDep.ClasspathFile())
Colin Cross6cbb1272015-04-08 11:23:01 -0700248 } else if inList(otherName, j.properties.Java_libs) {
Colin Cross2fe66872015-03-30 17:20:39 -0700249 classpath = append(classpath, javaDep.ClasspathFile())
250 } else if inList(otherName, j.properties.Java_static_libs) {
251 classpath = append(classpath, javaDep.ClasspathFile())
252 classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...)
253 resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...)
Colin Crossb7a63242015-04-16 14:09:14 -0700254 } else if otherName == "framework-res" {
255 if ctx.ModuleName() == "framework" {
256 // framework.jar has a one-off dependency on the R.java and Manifest.java files
257 // generated by framework-res.apk
258 srcFileLists = append(srcFileLists, module.(*javaBase).module.(*AndroidApp).aaptJavaFileList)
259 }
Colin Cross2fe66872015-03-30 17:20:39 -0700260 } else {
261 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
262 }
Colin Crossaa8630b2015-04-13 13:52:22 -0700263 aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...)
264 if sdkDep, ok := module.(sdkDependency); ok {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700265 if sdkDep.AidlPreprocessed().Valid() {
266 if aidlPreprocess.Valid() {
Colin Crossaa8630b2015-04-13 13:52:22 -0700267 ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
268 aidlPreprocess, sdkDep.AidlPreprocessed())
269 } else {
270 aidlPreprocess = sdkDep.AidlPreprocessed()
271 }
Colin Crossc0b06f12015-04-08 13:03:43 -0700272 }
273 }
Colin Cross2fe66872015-03-30 17:20:39 -0700274 }
275 })
276
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700277 return classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
278 aidlIncludeDirs, srcFileLists
Colin Cross2fe66872015-03-30 17:20:39 -0700279}
280
Colin Cross635c3b02016-05-18 15:37:25 -0700281func (j *javaBase) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross2fe66872015-03-30 17:20:39 -0700282 j.module.GenerateJavaBuildActions(ctx)
283}
284
Colin Cross635c3b02016-05-18 15:37:25 -0700285func (j *javaBase) GenerateJavaBuildActions(ctx android.ModuleContext) {
Colin Crossc0b06f12015-04-08 13:03:43 -0700286
Colin Cross635c3b02016-05-18 15:37:25 -0700287 j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Export_aidl_include_dirs)
Colin Crossc0b06f12015-04-08 13:03:43 -0700288
289 classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700290 aidlIncludeDirs, srcFileLists := j.collectDeps(ctx)
Colin Crossc0b06f12015-04-08 13:03:43 -0700291
Colin Crossf03c82b2015-04-13 13:53:40 -0700292 var flags javaBuilderFlags
293
294 javacFlags := j.properties.Javacflags
295 if len(javacFlags) > 0 {
296 ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " "))
297 flags.javacFlags = "$javacFlags"
298 }
299
300 aidlFlags := j.aidlFlags(ctx, aidlPreprocess, aidlIncludeDirs)
301 if len(aidlFlags) > 0 {
302 ctx.Variable(pctx, "aidlFlags", strings.Join(aidlFlags, " "))
303 flags.aidlFlags = "$aidlFlags"
Colin Cross2fe66872015-03-30 17:20:39 -0700304 }
305
Colin Cross635c3b02016-05-18 15:37:25 -0700306 var javacDeps android.Paths
Colin Cross2fe66872015-03-30 17:20:39 -0700307
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700308 if bootClasspath.Valid() {
309 flags.bootClasspath = "-bootclasspath " + bootClasspath.String()
310 javacDeps = append(javacDeps, bootClasspath.Path())
Colin Cross2fe66872015-03-30 17:20:39 -0700311 }
312
313 if len(classpath) > 0 {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700314 flags.classpath = "-classpath " + strings.Join(classpath.Strings(), ":")
Colin Cross2fe66872015-03-30 17:20:39 -0700315 javacDeps = append(javacDeps, classpath...)
316 }
317
Dan Willemsen2ef08f42015-06-30 18:15:24 -0700318 srcFiles := ctx.ExpandSources(j.properties.Srcs, j.properties.Exclude_srcs)
Colin Crossc0b06f12015-04-08 13:03:43 -0700319
Colin Crossf05fe972015-04-10 17:45:20 -0700320 srcFiles = j.genSources(ctx, srcFiles, flags)
Colin Crossc0b06f12015-04-08 13:03:43 -0700321
Colin Cross0607cf72015-04-28 13:28:51 -0700322 ctx.VisitDirectDeps(func(module blueprint.Module) {
323 if gen, ok := module.(genrule.SourceFileGenerator); ok {
324 srcFiles = append(srcFiles, gen.GeneratedSourceFiles()...)
325 }
326 })
327
Colin Crossb7a63242015-04-16 14:09:14 -0700328 srcFileLists = append(srcFileLists, j.ExtraSrcLists...)
329
Colin Cross8cf13342015-04-10 15:41:49 -0700330 if len(srcFiles) > 0 {
331 // Compile java sources into .class files
Colin Crosse7a9f3f2015-04-13 14:02:52 -0700332 classes := TransformJavaToClasses(ctx, srcFiles, srcFileLists, flags, javacDeps)
Colin Cross8cf13342015-04-10 15:41:49 -0700333 if ctx.Failed() {
334 return
335 }
336
337 classJarSpecs = append([]jarSpec{classes}, classJarSpecs...)
Colin Cross2fe66872015-03-30 17:20:39 -0700338 }
339
Dan Willemsen2ef08f42015-06-30 18:15:24 -0700340 resourceJarSpecs = append(ResourceDirsToJarSpecs(ctx, j.properties.Java_resource_dirs, j.properties.Exclude_java_resource_dirs),
Colin Cross276284f2015-04-20 13:51:48 -0700341 resourceJarSpecs...)
Colin Cross2fe66872015-03-30 17:20:39 -0700342
Colin Cross635c3b02016-05-18 15:37:25 -0700343 manifest := android.OptionalPathForModuleSrc(ctx, j.properties.Manifest)
Colin Cross2fe66872015-03-30 17:20:39 -0700344
345 allJarSpecs := append([]jarSpec(nil), classJarSpecs...)
346 allJarSpecs = append(allJarSpecs, resourceJarSpecs...)
347
348 // Combine classes + resources into classes-full-debug.jar
349 outputFile := TransformClassesToJar(ctx, allJarSpecs, manifest)
350 if ctx.Failed() {
351 return
352 }
Colin Cross65bf4f22015-04-03 16:54:17 -0700353
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700354 if j.properties.Jarjar_rules != nil {
Colin Cross635c3b02016-05-18 15:37:25 -0700355 jarjar_rules := android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules)
Colin Cross65bf4f22015-04-03 16:54:17 -0700356 // Transform classes-full-debug.jar into classes-jarjar.jar
357 outputFile = TransformJarJar(ctx, outputFile, jarjar_rules)
358 if ctx.Failed() {
359 return
360 }
Colin Cross20978302015-04-10 17:05:07 -0700361
362 classes, _ := TransformPrebuiltJarToClasses(ctx, outputFile)
363 classJarSpecs = []jarSpec{classes}
Colin Cross65bf4f22015-04-03 16:54:17 -0700364 }
365
Colin Cross20978302015-04-10 17:05:07 -0700366 j.resourceJarSpecs = resourceJarSpecs
367 j.classJarSpecs = classJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700368 j.classpathFile = outputFile
369
Colin Cross8cf13342015-04-10 15:41:49 -0700370 if j.properties.Dex && len(srcFiles) > 0 {
Colin Cross2fe66872015-03-30 17:20:39 -0700371 dxFlags := j.properties.Dxflags
372 if false /* emma enabled */ {
373 // If you instrument class files that have local variable debug information in
374 // them emma does not correctly maintain the local variable table.
375 // This will cause an error when you try to convert the class files for Android.
376 // The workaround here is to build different dex file here based on emma switch
377 // then later copy into classes.dex. When emma is on, dx is run with --no-locals
378 // option to remove local variable information
379 dxFlags = append(dxFlags, "--no-locals")
380 }
381
Colin Cross1332b002015-04-07 17:11:30 -0700382 if ctx.AConfig().Getenv("NO_OPTIMIZE_DX") != "" {
Colin Cross2fe66872015-03-30 17:20:39 -0700383 dxFlags = append(dxFlags, "--no-optimize")
384 }
385
Colin Cross1332b002015-04-07 17:11:30 -0700386 if ctx.AConfig().Getenv("GENERATE_DEX_DEBUG") != "" {
Colin Cross2fe66872015-03-30 17:20:39 -0700387 dxFlags = append(dxFlags,
388 "--debug",
389 "--verbose",
Colin Cross635c3b02016-05-18 15:37:25 -0700390 "--dump-to="+android.PathForModuleOut(ctx, "classes.lst").String(),
Colin Cross2fe66872015-03-30 17:20:39 -0700391 "--dump-width=1000")
392 }
393
394 flags.dxFlags = strings.Join(dxFlags, " ")
395
396 // Compile classes.jar into classes.dex
Colin Cross6d1e72d2015-04-10 17:44:24 -0700397 dexJarSpec := TransformClassesJarToDex(ctx, outputFile, flags)
Colin Cross2fe66872015-03-30 17:20:39 -0700398 if ctx.Failed() {
399 return
400 }
401
402 // Combine classes.dex + resources into javalib.jar
Colin Cross6d1e72d2015-04-10 17:44:24 -0700403 outputFile = TransformDexToJavaLib(ctx, resourceJarSpecs, dexJarSpec)
Colin Cross2fe66872015-03-30 17:20:39 -0700404 }
Colin Crossb7a63242015-04-16 14:09:14 -0700405 ctx.CheckbuildFile(outputFile)
406 j.outputFile = outputFile
Colin Cross2fe66872015-03-30 17:20:39 -0700407}
408
409var _ JavaDependency = (*JavaLibrary)(nil)
410
Colin Cross635c3b02016-05-18 15:37:25 -0700411func (j *javaBase) ClasspathFile() android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700412 return j.classpathFile
413}
414
415func (j *javaBase) ClassJarSpecs() []jarSpec {
416 return j.classJarSpecs
417}
418
419func (j *javaBase) ResourceJarSpecs() []jarSpec {
420 return j.resourceJarSpecs
421}
422
Colin Cross635c3b02016-05-18 15:37:25 -0700423func (j *javaBase) AidlIncludeDirs() android.Paths {
Colin Crossc0b06f12015-04-08 13:03:43 -0700424 return j.exportAidlIncludeDirs
425}
426
Colin Crossf05fe972015-04-10 17:45:20 -0700427var _ logtagsProducer = (*javaBase)(nil)
428
Colin Cross635c3b02016-05-18 15:37:25 -0700429func (j *javaBase) logtags() android.Paths {
Colin Crossf05fe972015-04-10 17:45:20 -0700430 return j.logtagsSrcs
431}
432
Colin Cross2fe66872015-03-30 17:20:39 -0700433//
434// Java libraries (.jar file)
435//
436
437type JavaLibrary struct {
438 javaBase
439}
440
Colin Cross635c3b02016-05-18 15:37:25 -0700441func (j *JavaLibrary) GenerateJavaBuildActions(ctx android.ModuleContext) {
Colin Crossb7a63242015-04-16 14:09:14 -0700442 j.javaBase.GenerateJavaBuildActions(ctx)
443
Colin Cross635c3b02016-05-18 15:37:25 -0700444 j.installFile = ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.outputFile)
Colin Crossb7a63242015-04-16 14:09:14 -0700445}
446
Colin Cross2fe66872015-03-30 17:20:39 -0700447func JavaLibraryFactory() (blueprint.Module, []interface{}) {
448 module := &JavaLibrary{}
449
450 module.properties.Dex = true
451
Colin Cross635c3b02016-05-18 15:37:25 -0700452 return NewJavaBase(&module.javaBase, module, android.HostAndDeviceSupported)
Colin Cross2fe66872015-03-30 17:20:39 -0700453}
454
455func JavaLibraryHostFactory() (blueprint.Module, []interface{}) {
456 module := &JavaLibrary{}
457
Colin Cross635c3b02016-05-18 15:37:25 -0700458 return NewJavaBase(&module.javaBase, module, android.HostSupported)
Colin Cross2fe66872015-03-30 17:20:39 -0700459}
460
461//
462// Java Binaries (.jar file plus wrapper script)
463//
464
Colin Cross7d5136f2015-05-11 13:39:40 -0700465type javaBinaryProperties struct {
466 // installable script to execute the resulting jar
467 Wrapper string
468}
469
Colin Cross2fe66872015-03-30 17:20:39 -0700470type JavaBinary struct {
471 JavaLibrary
472
Colin Cross7d5136f2015-05-11 13:39:40 -0700473 binaryProperties javaBinaryProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700474}
475
Colin Cross635c3b02016-05-18 15:37:25 -0700476func (j *JavaBinary) GenerateJavaBuildActions(ctx android.ModuleContext) {
Colin Cross2fe66872015-03-30 17:20:39 -0700477 j.JavaLibrary.GenerateJavaBuildActions(ctx)
478
479 // Depend on the installed jar (j.installFile) so that the wrapper doesn't get executed by
480 // another build rule before the jar has been installed.
Colin Cross635c3b02016-05-18 15:37:25 -0700481 ctx.InstallFile(android.PathForModuleInstall(ctx, "bin"), android.PathForModuleSrc(ctx, j.binaryProperties.Wrapper),
Colin Cross2fe66872015-03-30 17:20:39 -0700482 j.installFile)
483}
484
485func JavaBinaryFactory() (blueprint.Module, []interface{}) {
486 module := &JavaBinary{}
487
488 module.properties.Dex = true
489
Colin Cross635c3b02016-05-18 15:37:25 -0700490 return NewJavaBase(&module.javaBase, module, android.HostAndDeviceSupported, &module.binaryProperties)
Colin Cross2fe66872015-03-30 17:20:39 -0700491}
492
493func JavaBinaryHostFactory() (blueprint.Module, []interface{}) {
494 module := &JavaBinary{}
495
Colin Cross635c3b02016-05-18 15:37:25 -0700496 return NewJavaBase(&module.javaBase, module, android.HostSupported, &module.binaryProperties)
Colin Cross2fe66872015-03-30 17:20:39 -0700497}
498
499//
500// Java prebuilts
501//
502
Colin Cross7d5136f2015-05-11 13:39:40 -0700503type javaPrebuiltProperties struct {
504 Srcs []string
505}
506
Colin Cross2fe66872015-03-30 17:20:39 -0700507type JavaPrebuilt struct {
Colin Cross635c3b02016-05-18 15:37:25 -0700508 android.ModuleBase
Colin Cross2fe66872015-03-30 17:20:39 -0700509
Colin Cross7d5136f2015-05-11 13:39:40 -0700510 properties javaPrebuiltProperties
Colin Cross2fe66872015-03-30 17:20:39 -0700511
Colin Cross635c3b02016-05-18 15:37:25 -0700512 classpathFile android.Path
Colin Crosse1d62a82015-04-03 16:53:05 -0700513 classJarSpecs, resourceJarSpecs []jarSpec
Colin Cross2fe66872015-03-30 17:20:39 -0700514}
515
Colin Cross1e676be2016-10-12 14:38:15 -0700516func (j *JavaPrebuilt) DepsMutator(ctx android.BottomUpMutatorContext) {
517}
518
Colin Cross635c3b02016-05-18 15:37:25 -0700519func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross2fe66872015-03-30 17:20:39 -0700520 if len(j.properties.Srcs) != 1 {
521 ctx.ModuleErrorf("expected exactly one jar in srcs")
522 return
523 }
Colin Cross635c3b02016-05-18 15:37:25 -0700524 prebuilt := android.PathForModuleSrc(ctx, j.properties.Srcs[0])
Colin Crosse1d62a82015-04-03 16:53:05 -0700525
526 classJarSpec, resourceJarSpec := TransformPrebuiltJarToClasses(ctx, prebuilt)
527
528 j.classpathFile = prebuilt
529 j.classJarSpecs = []jarSpec{classJarSpec}
530 j.resourceJarSpecs = []jarSpec{resourceJarSpec}
Colin Cross635c3b02016-05-18 15:37:25 -0700531 ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.classpathFile)
Colin Cross2fe66872015-03-30 17:20:39 -0700532}
533
534var _ JavaDependency = (*JavaPrebuilt)(nil)
535
Colin Cross635c3b02016-05-18 15:37:25 -0700536func (j *JavaPrebuilt) ClasspathFile() android.Path {
Colin Cross2fe66872015-03-30 17:20:39 -0700537 return j.classpathFile
538}
539
540func (j *JavaPrebuilt) ClassJarSpecs() []jarSpec {
Colin Crosse1d62a82015-04-03 16:53:05 -0700541 return j.classJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700542}
543
544func (j *JavaPrebuilt) ResourceJarSpecs() []jarSpec {
Colin Crosse1d62a82015-04-03 16:53:05 -0700545 return j.resourceJarSpecs
Colin Cross2fe66872015-03-30 17:20:39 -0700546}
547
Colin Cross635c3b02016-05-18 15:37:25 -0700548func (j *JavaPrebuilt) AidlIncludeDirs() android.Paths {
Colin Crossc0b06f12015-04-08 13:03:43 -0700549 return nil
550}
551
Colin Cross2fe66872015-03-30 17:20:39 -0700552func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {
553 module := &JavaPrebuilt{}
554
Colin Cross635c3b02016-05-18 15:37:25 -0700555 return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
556 android.MultilibCommon, &module.properties)
Colin Cross2fe66872015-03-30 17:20:39 -0700557}
558
Colin Crossaa8630b2015-04-13 13:52:22 -0700559//
560// SDK java prebuilts (.jar containing resources plus framework.aidl)
561//
562
563type sdkDependency interface {
564 JavaDependency
Colin Cross635c3b02016-05-18 15:37:25 -0700565 AidlPreprocessed() android.OptionalPath
Colin Crossaa8630b2015-04-13 13:52:22 -0700566}
567
568var _ sdkDependency = (*sdkPrebuilt)(nil)
569
Colin Cross7d5136f2015-05-11 13:39:40 -0700570type sdkPrebuiltProperties struct {
Dan Willemsen34cc69e2015-09-23 15:26:20 -0700571 Aidl_preprocessed *string
Colin Cross7d5136f2015-05-11 13:39:40 -0700572}
573
Colin Crossaa8630b2015-04-13 13:52:22 -0700574type sdkPrebuilt struct {
575 JavaPrebuilt
576
Colin Cross7d5136f2015-05-11 13:39:40 -0700577 sdkProperties sdkPrebuiltProperties
Colin Crossaa8630b2015-04-13 13:52:22 -0700578
Colin Cross635c3b02016-05-18 15:37:25 -0700579 aidlPreprocessed android.OptionalPath
Colin Crossaa8630b2015-04-13 13:52:22 -0700580}
581
Colin Cross635c3b02016-05-18 15:37:25 -0700582func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Crossaa8630b2015-04-13 13:52:22 -0700583 j.JavaPrebuilt.GenerateAndroidBuildActions(ctx)
584
Colin Cross635c3b02016-05-18 15:37:25 -0700585 j.aidlPreprocessed = android.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed)
Colin Crossaa8630b2015-04-13 13:52:22 -0700586}
587
Colin Cross635c3b02016-05-18 15:37:25 -0700588func (j *sdkPrebuilt) AidlPreprocessed() android.OptionalPath {
Colin Crossaa8630b2015-04-13 13:52:22 -0700589 return j.aidlPreprocessed
590}
591
592func SdkPrebuiltFactory() (blueprint.Module, []interface{}) {
593 module := &sdkPrebuilt{}
594
Colin Cross635c3b02016-05-18 15:37:25 -0700595 return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
596 android.MultilibCommon, &module.properties, &module.sdkProperties)
Colin Crossaa8630b2015-04-13 13:52:22 -0700597}
598
Colin Cross2fe66872015-03-30 17:20:39 -0700599func inList(s string, l []string) bool {
600 for _, e := range l {
601 if e == s {
602 return true
603 }
604 }
605 return false
606}