2015-03-31 02:20:39 +02:00
|
|
|
// Copyright 2015 Google Inc. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package java
|
|
|
|
|
|
|
|
// This file contains the module types for compiling Java for Android, and converts the properties
|
|
|
|
// into the flags and filenames necessary to pass to the compiler. The final creation of the rules
|
|
|
|
// is handled in builder.go
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/google/blueprint"
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
"android/soong/android"
|
2015-04-28 22:28:51 +02:00
|
|
|
"android/soong/genrule"
|
2015-03-31 02:20:39 +02:00
|
|
|
)
|
|
|
|
|
2015-06-17 23:20:06 +02:00
|
|
|
func init() {
|
2016-10-12 23:28:16 +02:00
|
|
|
android.RegisterModuleType("java_library", JavaLibraryFactory)
|
|
|
|
android.RegisterModuleType("java_library_static", JavaLibraryFactory)
|
|
|
|
android.RegisterModuleType("java_library_host", JavaLibraryHostFactory)
|
|
|
|
android.RegisterModuleType("java_binary", JavaBinaryFactory)
|
|
|
|
android.RegisterModuleType("java_binary_host", JavaBinaryHostFactory)
|
|
|
|
android.RegisterModuleType("prebuilt_java_library", JavaPrebuiltFactory)
|
|
|
|
android.RegisterModuleType("prebuilt_sdk", SdkPrebuiltFactory)
|
|
|
|
android.RegisterModuleType("android_app", AndroidAppFactory)
|
|
|
|
|
|
|
|
android.RegisterSingletonType("logtags", LogtagsSingleton)
|
2015-06-17 23:20:06 +02:00
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
// TODO:
|
|
|
|
// Autogenerated files:
|
|
|
|
// Proto
|
|
|
|
// Renderscript
|
|
|
|
// Post-jar passes:
|
|
|
|
// Proguard
|
|
|
|
// Emma
|
|
|
|
// Jarjar
|
|
|
|
// Dex
|
|
|
|
// Rmtypedefs
|
|
|
|
// Jack
|
|
|
|
// DroidDoc
|
|
|
|
// Findbugs
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
type javaBaseProperties struct {
|
|
|
|
// list of source files used to compile the Java module. May be .java, .logtags, .proto,
|
|
|
|
// or .aidl files.
|
2015-07-01 03:15:24 +02:00
|
|
|
Srcs []string `android:"arch_variant"`
|
|
|
|
|
|
|
|
// list of source files that should not be used to build the Java module.
|
|
|
|
// This is most useful in the arch/multilib variants to remove non-common files
|
|
|
|
Exclude_srcs []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of directories containing Java resources
|
|
|
|
Java_resource_dirs []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-07-01 03:15:24 +02:00
|
|
|
// list of directories that should be excluded from java_resource_dirs
|
|
|
|
Exclude_java_resource_dirs []string `android:"arch_variant"`
|
|
|
|
|
2016-11-30 17:13:09 +01:00
|
|
|
// don't build against the default libraries (legacy-test, core-junit,
|
2015-05-11 22:39:40 +02:00
|
|
|
// ext, and framework for device targets)
|
|
|
|
No_standard_libraries bool
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of module-specific flags that will be used for javac compiles
|
|
|
|
Javacflags []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of module-specific flags that will be used for jack compiles
|
|
|
|
Jack_flags []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of module-specific flags that will be used for dex compiles
|
|
|
|
Dxflags []string `android:"arch_variant"`
|
2015-04-28 22:30:13 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of of java libraries that will be in the classpath
|
|
|
|
Java_libs []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// list of java libraries that will be compiled into the resulting jar
|
|
|
|
Java_static_libs []string `android:"arch_variant"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// manifest file to be included in resulting jar
|
2015-09-24 00:26:20 +02:00
|
|
|
Manifest *string
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// if not blank, set to the version of the sdk to compile against
|
|
|
|
Sdk_version string
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// Set for device java libraries, and for host versions of device java libraries
|
|
|
|
// built for testing
|
|
|
|
Dex bool `blueprint:"mutated"`
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// if not blank, run jarjar using the specified rules file
|
2015-09-24 00:26:20 +02:00
|
|
|
Jarjar_rules *string
|
2015-04-04 01:54:17 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// directories to pass to aidl tool
|
|
|
|
Aidl_includes []string
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// directories that should be added as include directories
|
|
|
|
// for any aidl sources of modules that depend on this module
|
|
|
|
Export_aidl_include_dirs []string
|
|
|
|
}
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
// javaBase contains the properties and members used by all java module types, and implements
|
|
|
|
// the blueprint.Module interface.
|
|
|
|
type javaBase struct {
|
2016-05-19 00:37:25 +02:00
|
|
|
android.ModuleBase
|
2015-05-11 22:39:40 +02:00
|
|
|
module JavaModuleType
|
|
|
|
|
|
|
|
properties javaBaseProperties
|
2015-03-31 02:20:39 +02:00
|
|
|
|
|
|
|
// output file suitable for inserting into the classpath of another compile
|
2016-05-19 00:37:25 +02:00
|
|
|
classpathFile android.Path
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-04-16 23:09:14 +02:00
|
|
|
// output file suitable for installing or running
|
2016-05-19 00:37:25 +02:00
|
|
|
outputFile android.Path
|
2015-04-16 23:09:14 +02:00
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
// jarSpecs suitable for inserting classes from a static library into another jar
|
|
|
|
classJarSpecs []jarSpec
|
|
|
|
|
|
|
|
// jarSpecs suitable for inserting resources from a static library into another jar
|
|
|
|
resourceJarSpecs []jarSpec
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
exportAidlIncludeDirs android.Paths
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
logtagsSrcs android.Paths
|
2015-04-11 02:45:20 +02:00
|
|
|
|
2015-04-16 23:09:14 +02:00
|
|
|
// filelists of extra source files that should be included in the javac command line,
|
|
|
|
// for example R.java generated by aapt for android apps
|
2016-05-19 00:37:25 +02:00
|
|
|
ExtraSrcLists android.Paths
|
2015-04-16 23:09:14 +02:00
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
// installed file for binary dependency
|
2016-05-19 00:37:25 +02:00
|
|
|
installFile android.Path
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
type AndroidJavaModuleContext android.BaseContext
|
2015-10-29 23:25:03 +01:00
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
type JavaModuleType interface {
|
2016-05-19 00:37:25 +02:00
|
|
|
GenerateJavaBuildActions(ctx android.ModuleContext)
|
2015-10-29 23:25:03 +01:00
|
|
|
JavaDependencies(ctx AndroidJavaModuleContext) []string
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type JavaDependency interface {
|
2016-05-19 00:37:25 +02:00
|
|
|
ClasspathFile() android.Path
|
2015-03-31 02:20:39 +02:00
|
|
|
ClassJarSpecs() []jarSpec
|
|
|
|
ResourceJarSpecs() []jarSpec
|
2016-05-19 00:37:25 +02:00
|
|
|
AidlIncludeDirs() android.Paths
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func NewJavaBase(base *javaBase, module JavaModuleType, hod android.HostOrDeviceSupported,
|
2015-03-31 02:20:39 +02:00
|
|
|
props ...interface{}) (blueprint.Module, []interface{}) {
|
|
|
|
|
|
|
|
base.module = module
|
|
|
|
|
|
|
|
props = append(props, &base.properties)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return android.InitAndroidArchModule(base, hod, android.MultilibCommon, props...)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) BootClasspath(ctx android.BaseContext) string {
|
2015-03-31 02:20:39 +02:00
|
|
|
if ctx.Device() {
|
|
|
|
if j.properties.Sdk_version == "" {
|
|
|
|
return "core-libart"
|
|
|
|
} else if j.properties.Sdk_version == "current" {
|
|
|
|
// TODO: !TARGET_BUILD_APPS
|
2015-04-08 22:03:43 +02:00
|
|
|
// TODO: export preprocessed framework.aidl from android_stubs_current
|
2015-03-31 02:20:39 +02:00
|
|
|
return "android_stubs_current"
|
|
|
|
} else if j.properties.Sdk_version == "system_current" {
|
|
|
|
return "android_system_stubs_current"
|
|
|
|
} else {
|
|
|
|
return "sdk_v" + j.properties.Sdk_version
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if j.properties.Dex {
|
|
|
|
return "core-libart"
|
|
|
|
} else {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-30 17:13:09 +01:00
|
|
|
var defaultJavaLibraries = []string{"core-libart", "legacy-test", "ext", "framework"}
|
2015-04-16 23:08:06 +02:00
|
|
|
|
2016-10-12 23:38:15 +02:00
|
|
|
func (j *javaBase) DepsMutator(ctx android.BottomUpMutatorContext) {
|
2015-10-29 23:25:03 +01:00
|
|
|
if j, ok := ctx.Module().(JavaModuleType); ok {
|
2016-04-12 00:06:20 +02:00
|
|
|
ctx.AddDependency(ctx.Module(), nil, j.JavaDependencies(ctx)...)
|
2015-10-29 23:25:03 +01:00
|
|
|
}
|
2015-04-16 23:09:14 +02:00
|
|
|
}
|
|
|
|
|
2015-10-29 23:25:03 +01:00
|
|
|
func (j *javaBase) JavaDependencies(ctx AndroidJavaModuleContext) []string {
|
2015-03-31 02:20:39 +02:00
|
|
|
var deps []string
|
|
|
|
|
|
|
|
if !j.properties.No_standard_libraries {
|
|
|
|
bootClasspath := j.BootClasspath(ctx)
|
|
|
|
if bootClasspath != "" {
|
|
|
|
deps = append(deps, bootClasspath)
|
|
|
|
}
|
2015-04-16 23:08:06 +02:00
|
|
|
if ctx.Device() && j.properties.Sdk_version == "" {
|
|
|
|
deps = append(deps, defaultJavaLibraries...)
|
|
|
|
}
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
deps = append(deps, j.properties.Java_libs...)
|
|
|
|
deps = append(deps, j.properties.Java_static_libs...)
|
|
|
|
|
|
|
|
return deps
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
|
|
|
|
aidlIncludeDirs android.Paths) []string {
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
localAidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl_includes)
|
2015-04-08 22:03:43 +02:00
|
|
|
|
|
|
|
var flags []string
|
2015-09-24 00:26:20 +02:00
|
|
|
if aidlPreprocess.Valid() {
|
|
|
|
flags = append(flags, "-p"+aidlPreprocess.String())
|
2015-04-08 22:03:43 +02:00
|
|
|
} else {
|
2016-05-19 00:37:25 +02:00
|
|
|
flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
|
2015-04-08 22:03:43 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
flags = append(flags, android.JoinWithPrefix(j.exportAidlIncludeDirs.Strings(), "-I"))
|
|
|
|
flags = append(flags, android.JoinWithPrefix(localAidlIncludes.Strings(), "-I"))
|
|
|
|
flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
|
|
|
|
flags = append(flags, "-I"+android.PathForModuleSrc(ctx, "src").String())
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-04-13 22:53:40 +02:00
|
|
|
return flags
|
2015-04-08 22:03:43 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) collectDeps(ctx android.ModuleContext) (classpath android.Paths,
|
|
|
|
bootClasspath android.OptionalPath, classJarSpecs, resourceJarSpecs []jarSpec, aidlPreprocess android.OptionalPath,
|
|
|
|
aidlIncludeDirs android.Paths, srcFileLists android.Paths) {
|
2015-03-31 02:20:39 +02:00
|
|
|
|
|
|
|
ctx.VisitDirectDeps(func(module blueprint.Module) {
|
|
|
|
otherName := ctx.OtherModuleName(module)
|
|
|
|
if javaDep, ok := module.(JavaDependency); ok {
|
2015-04-08 20:23:01 +02:00
|
|
|
if otherName == j.BootClasspath(ctx) {
|
2016-05-19 00:37:25 +02:00
|
|
|
bootClasspath = android.OptionalPathForPath(javaDep.ClasspathFile())
|
2015-04-16 23:09:14 +02:00
|
|
|
} else if inList(otherName, defaultJavaLibraries) {
|
|
|
|
classpath = append(classpath, javaDep.ClasspathFile())
|
2015-04-08 20:23:01 +02:00
|
|
|
} else if inList(otherName, j.properties.Java_libs) {
|
2015-03-31 02:20:39 +02:00
|
|
|
classpath = append(classpath, javaDep.ClasspathFile())
|
|
|
|
} else if inList(otherName, j.properties.Java_static_libs) {
|
|
|
|
classpath = append(classpath, javaDep.ClasspathFile())
|
|
|
|
classJarSpecs = append(classJarSpecs, javaDep.ClassJarSpecs()...)
|
|
|
|
resourceJarSpecs = append(resourceJarSpecs, javaDep.ResourceJarSpecs()...)
|
2015-04-16 23:09:14 +02:00
|
|
|
} else if otherName == "framework-res" {
|
|
|
|
if ctx.ModuleName() == "framework" {
|
|
|
|
// framework.jar has a one-off dependency on the R.java and Manifest.java files
|
|
|
|
// generated by framework-res.apk
|
|
|
|
srcFileLists = append(srcFileLists, module.(*javaBase).module.(*AndroidApp).aaptJavaFileList)
|
|
|
|
}
|
2015-03-31 02:20:39 +02:00
|
|
|
} else {
|
|
|
|
panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
|
|
|
|
}
|
2015-04-13 22:52:22 +02:00
|
|
|
aidlIncludeDirs = append(aidlIncludeDirs, javaDep.AidlIncludeDirs()...)
|
|
|
|
if sdkDep, ok := module.(sdkDependency); ok {
|
2015-09-24 00:26:20 +02:00
|
|
|
if sdkDep.AidlPreprocessed().Valid() {
|
|
|
|
if aidlPreprocess.Valid() {
|
2015-04-13 22:52:22 +02:00
|
|
|
ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
|
|
|
|
aidlPreprocess, sdkDep.AidlPreprocessed())
|
|
|
|
} else {
|
|
|
|
aidlPreprocess = sdkDep.AidlPreprocessed()
|
|
|
|
}
|
2015-04-08 22:03:43 +02:00
|
|
|
}
|
|
|
|
}
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2015-04-13 23:02:52 +02:00
|
|
|
return classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
|
|
|
|
aidlIncludeDirs, srcFileLists
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
2015-03-31 02:20:39 +02:00
|
|
|
j.module.GenerateJavaBuildActions(ctx)
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) GenerateJavaBuildActions(ctx android.ModuleContext) {
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.properties.Export_aidl_include_dirs)
|
2015-04-08 22:03:43 +02:00
|
|
|
|
|
|
|
classpath, bootClasspath, classJarSpecs, resourceJarSpecs, aidlPreprocess,
|
2015-04-13 23:02:52 +02:00
|
|
|
aidlIncludeDirs, srcFileLists := j.collectDeps(ctx)
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-04-13 22:53:40 +02:00
|
|
|
var flags javaBuilderFlags
|
|
|
|
|
|
|
|
javacFlags := j.properties.Javacflags
|
|
|
|
if len(javacFlags) > 0 {
|
|
|
|
ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " "))
|
|
|
|
flags.javacFlags = "$javacFlags"
|
|
|
|
}
|
|
|
|
|
|
|
|
aidlFlags := j.aidlFlags(ctx, aidlPreprocess, aidlIncludeDirs)
|
|
|
|
if len(aidlFlags) > 0 {
|
|
|
|
ctx.Variable(pctx, "aidlFlags", strings.Join(aidlFlags, " "))
|
|
|
|
flags.aidlFlags = "$aidlFlags"
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
var javacDeps android.Paths
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-09-24 00:26:20 +02:00
|
|
|
if bootClasspath.Valid() {
|
|
|
|
flags.bootClasspath = "-bootclasspath " + bootClasspath.String()
|
|
|
|
javacDeps = append(javacDeps, bootClasspath.Path())
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if len(classpath) > 0 {
|
2015-09-24 00:26:20 +02:00
|
|
|
flags.classpath = "-classpath " + strings.Join(classpath.Strings(), ":")
|
2015-03-31 02:20:39 +02:00
|
|
|
javacDeps = append(javacDeps, classpath...)
|
|
|
|
}
|
|
|
|
|
2015-07-01 03:15:24 +02:00
|
|
|
srcFiles := ctx.ExpandSources(j.properties.Srcs, j.properties.Exclude_srcs)
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-04-11 02:45:20 +02:00
|
|
|
srcFiles = j.genSources(ctx, srcFiles, flags)
|
2015-04-08 22:03:43 +02:00
|
|
|
|
2015-04-28 22:28:51 +02:00
|
|
|
ctx.VisitDirectDeps(func(module blueprint.Module) {
|
|
|
|
if gen, ok := module.(genrule.SourceFileGenerator); ok {
|
|
|
|
srcFiles = append(srcFiles, gen.GeneratedSourceFiles()...)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2015-04-16 23:09:14 +02:00
|
|
|
srcFileLists = append(srcFileLists, j.ExtraSrcLists...)
|
|
|
|
|
2015-04-11 00:41:49 +02:00
|
|
|
if len(srcFiles) > 0 {
|
|
|
|
// Compile java sources into .class files
|
2015-04-13 23:02:52 +02:00
|
|
|
classes := TransformJavaToClasses(ctx, srcFiles, srcFileLists, flags, javacDeps)
|
2015-04-11 00:41:49 +02:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
classJarSpecs = append([]jarSpec{classes}, classJarSpecs...)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2015-07-01 03:15:24 +02:00
|
|
|
resourceJarSpecs = append(ResourceDirsToJarSpecs(ctx, j.properties.Java_resource_dirs, j.properties.Exclude_java_resource_dirs),
|
2015-04-20 22:51:48 +02:00
|
|
|
resourceJarSpecs...)
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
manifest := android.OptionalPathForModuleSrc(ctx, j.properties.Manifest)
|
2015-03-31 02:20:39 +02:00
|
|
|
|
|
|
|
allJarSpecs := append([]jarSpec(nil), classJarSpecs...)
|
|
|
|
allJarSpecs = append(allJarSpecs, resourceJarSpecs...)
|
|
|
|
|
|
|
|
// Combine classes + resources into classes-full-debug.jar
|
|
|
|
outputFile := TransformClassesToJar(ctx, allJarSpecs, manifest)
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2015-04-04 01:54:17 +02:00
|
|
|
|
2015-09-24 00:26:20 +02:00
|
|
|
if j.properties.Jarjar_rules != nil {
|
2016-05-19 00:37:25 +02:00
|
|
|
jarjar_rules := android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules)
|
2015-04-04 01:54:17 +02:00
|
|
|
// Transform classes-full-debug.jar into classes-jarjar.jar
|
|
|
|
outputFile = TransformJarJar(ctx, outputFile, jarjar_rules)
|
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
2015-04-11 02:05:07 +02:00
|
|
|
|
|
|
|
classes, _ := TransformPrebuiltJarToClasses(ctx, outputFile)
|
|
|
|
classJarSpecs = []jarSpec{classes}
|
2015-04-04 01:54:17 +02:00
|
|
|
}
|
|
|
|
|
2015-04-11 02:05:07 +02:00
|
|
|
j.resourceJarSpecs = resourceJarSpecs
|
|
|
|
j.classJarSpecs = classJarSpecs
|
2015-03-31 02:20:39 +02:00
|
|
|
j.classpathFile = outputFile
|
|
|
|
|
2015-04-11 00:41:49 +02:00
|
|
|
if j.properties.Dex && len(srcFiles) > 0 {
|
2015-03-31 02:20:39 +02:00
|
|
|
dxFlags := j.properties.Dxflags
|
|
|
|
if false /* emma enabled */ {
|
|
|
|
// If you instrument class files that have local variable debug information in
|
|
|
|
// them emma does not correctly maintain the local variable table.
|
|
|
|
// This will cause an error when you try to convert the class files for Android.
|
|
|
|
// The workaround here is to build different dex file here based on emma switch
|
|
|
|
// then later copy into classes.dex. When emma is on, dx is run with --no-locals
|
|
|
|
// option to remove local variable information
|
|
|
|
dxFlags = append(dxFlags, "--no-locals")
|
|
|
|
}
|
|
|
|
|
2015-04-08 02:11:30 +02:00
|
|
|
if ctx.AConfig().Getenv("NO_OPTIMIZE_DX") != "" {
|
2015-03-31 02:20:39 +02:00
|
|
|
dxFlags = append(dxFlags, "--no-optimize")
|
|
|
|
}
|
|
|
|
|
2015-04-08 02:11:30 +02:00
|
|
|
if ctx.AConfig().Getenv("GENERATE_DEX_DEBUG") != "" {
|
2015-03-31 02:20:39 +02:00
|
|
|
dxFlags = append(dxFlags,
|
|
|
|
"--debug",
|
|
|
|
"--verbose",
|
2016-05-19 00:37:25 +02:00
|
|
|
"--dump-to="+android.PathForModuleOut(ctx, "classes.lst").String(),
|
2015-03-31 02:20:39 +02:00
|
|
|
"--dump-width=1000")
|
|
|
|
}
|
|
|
|
|
|
|
|
flags.dxFlags = strings.Join(dxFlags, " ")
|
|
|
|
|
|
|
|
// Compile classes.jar into classes.dex
|
2015-04-11 02:44:24 +02:00
|
|
|
dexJarSpec := TransformClassesJarToDex(ctx, outputFile, flags)
|
2015-03-31 02:20:39 +02:00
|
|
|
if ctx.Failed() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Combine classes.dex + resources into javalib.jar
|
2015-04-11 02:44:24 +02:00
|
|
|
outputFile = TransformDexToJavaLib(ctx, resourceJarSpecs, dexJarSpec)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
2015-04-16 23:09:14 +02:00
|
|
|
ctx.CheckbuildFile(outputFile)
|
|
|
|
j.outputFile = outputFile
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ JavaDependency = (*JavaLibrary)(nil)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) ClasspathFile() android.Path {
|
2015-03-31 02:20:39 +02:00
|
|
|
return j.classpathFile
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j *javaBase) ClassJarSpecs() []jarSpec {
|
|
|
|
return j.classJarSpecs
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j *javaBase) ResourceJarSpecs() []jarSpec {
|
|
|
|
return j.resourceJarSpecs
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) AidlIncludeDirs() android.Paths {
|
2015-04-08 22:03:43 +02:00
|
|
|
return j.exportAidlIncludeDirs
|
|
|
|
}
|
|
|
|
|
2015-04-11 02:45:20 +02:00
|
|
|
var _ logtagsProducer = (*javaBase)(nil)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *javaBase) logtags() android.Paths {
|
2015-04-11 02:45:20 +02:00
|
|
|
return j.logtagsSrcs
|
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
//
|
|
|
|
// Java libraries (.jar file)
|
|
|
|
//
|
|
|
|
|
|
|
|
type JavaLibrary struct {
|
|
|
|
javaBase
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *JavaLibrary) GenerateJavaBuildActions(ctx android.ModuleContext) {
|
2015-04-16 23:09:14 +02:00
|
|
|
j.javaBase.GenerateJavaBuildActions(ctx)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
j.installFile = ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.outputFile)
|
2015-04-16 23:09:14 +02:00
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
func JavaLibraryFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &JavaLibrary{}
|
|
|
|
|
|
|
|
module.properties.Dex = true
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return NewJavaBase(&module.javaBase, module, android.HostAndDeviceSupported)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func JavaLibraryHostFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &JavaLibrary{}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return NewJavaBase(&module.javaBase, module, android.HostSupported)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Java Binaries (.jar file plus wrapper script)
|
|
|
|
//
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
type javaBinaryProperties struct {
|
|
|
|
// installable script to execute the resulting jar
|
|
|
|
Wrapper string
|
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
type JavaBinary struct {
|
|
|
|
JavaLibrary
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
binaryProperties javaBinaryProperties
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *JavaBinary) GenerateJavaBuildActions(ctx android.ModuleContext) {
|
2015-03-31 02:20:39 +02:00
|
|
|
j.JavaLibrary.GenerateJavaBuildActions(ctx)
|
|
|
|
|
|
|
|
// Depend on the installed jar (j.installFile) so that the wrapper doesn't get executed by
|
|
|
|
// another build rule before the jar has been installed.
|
2016-05-19 00:37:25 +02:00
|
|
|
ctx.InstallFile(android.PathForModuleInstall(ctx, "bin"), android.PathForModuleSrc(ctx, j.binaryProperties.Wrapper),
|
2015-03-31 02:20:39 +02:00
|
|
|
j.installFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
func JavaBinaryFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &JavaBinary{}
|
|
|
|
|
|
|
|
module.properties.Dex = true
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return NewJavaBase(&module.javaBase, module, android.HostAndDeviceSupported, &module.binaryProperties)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func JavaBinaryHostFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &JavaBinary{}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return NewJavaBase(&module.javaBase, module, android.HostSupported, &module.binaryProperties)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Java prebuilts
|
|
|
|
//
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
type javaPrebuiltProperties struct {
|
|
|
|
Srcs []string
|
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
type JavaPrebuilt struct {
|
2016-05-19 00:37:25 +02:00
|
|
|
android.ModuleBase
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
properties javaPrebuiltProperties
|
2015-03-31 02:20:39 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
classpathFile android.Path
|
2015-04-04 01:53:05 +02:00
|
|
|
classJarSpecs, resourceJarSpecs []jarSpec
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-10-12 23:38:15 +02:00
|
|
|
func (j *JavaPrebuilt) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *JavaPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
2015-03-31 02:20:39 +02:00
|
|
|
if len(j.properties.Srcs) != 1 {
|
|
|
|
ctx.ModuleErrorf("expected exactly one jar in srcs")
|
|
|
|
return
|
|
|
|
}
|
2016-05-19 00:37:25 +02:00
|
|
|
prebuilt := android.PathForModuleSrc(ctx, j.properties.Srcs[0])
|
2015-04-04 01:53:05 +02:00
|
|
|
|
|
|
|
classJarSpec, resourceJarSpec := TransformPrebuiltJarToClasses(ctx, prebuilt)
|
|
|
|
|
|
|
|
j.classpathFile = prebuilt
|
|
|
|
j.classJarSpecs = []jarSpec{classJarSpec}
|
|
|
|
j.resourceJarSpecs = []jarSpec{resourceJarSpec}
|
2016-05-19 00:37:25 +02:00
|
|
|
ctx.InstallFileName(android.PathForModuleInstall(ctx, "framework"), ctx.ModuleName()+".jar", j.classpathFile)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ JavaDependency = (*JavaPrebuilt)(nil)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *JavaPrebuilt) ClasspathFile() android.Path {
|
2015-03-31 02:20:39 +02:00
|
|
|
return j.classpathFile
|
|
|
|
}
|
|
|
|
|
|
|
|
func (j *JavaPrebuilt) ClassJarSpecs() []jarSpec {
|
2015-04-04 01:53:05 +02:00
|
|
|
return j.classJarSpecs
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (j *JavaPrebuilt) ResourceJarSpecs() []jarSpec {
|
2015-04-04 01:53:05 +02:00
|
|
|
return j.resourceJarSpecs
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *JavaPrebuilt) AidlIncludeDirs() android.Paths {
|
2015-04-08 22:03:43 +02:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
func JavaPrebuiltFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &JavaPrebuilt{}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
|
|
|
|
android.MultilibCommon, &module.properties)
|
2015-03-31 02:20:39 +02:00
|
|
|
}
|
|
|
|
|
2015-04-13 22:52:22 +02:00
|
|
|
//
|
|
|
|
// SDK java prebuilts (.jar containing resources plus framework.aidl)
|
|
|
|
//
|
|
|
|
|
|
|
|
type sdkDependency interface {
|
|
|
|
JavaDependency
|
2016-05-19 00:37:25 +02:00
|
|
|
AidlPreprocessed() android.OptionalPath
|
2015-04-13 22:52:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var _ sdkDependency = (*sdkPrebuilt)(nil)
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
type sdkPrebuiltProperties struct {
|
2015-09-24 00:26:20 +02:00
|
|
|
Aidl_preprocessed *string
|
2015-05-11 22:39:40 +02:00
|
|
|
}
|
|
|
|
|
2015-04-13 22:52:22 +02:00
|
|
|
type sdkPrebuilt struct {
|
|
|
|
JavaPrebuilt
|
|
|
|
|
2015-05-11 22:39:40 +02:00
|
|
|
sdkProperties sdkPrebuiltProperties
|
2015-04-13 22:52:22 +02:00
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
aidlPreprocessed android.OptionalPath
|
2015-04-13 22:52:22 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
2015-04-13 22:52:22 +02:00
|
|
|
j.JavaPrebuilt.GenerateAndroidBuildActions(ctx)
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
j.aidlPreprocessed = android.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed)
|
2015-04-13 22:52:22 +02:00
|
|
|
}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
func (j *sdkPrebuilt) AidlPreprocessed() android.OptionalPath {
|
2015-04-13 22:52:22 +02:00
|
|
|
return j.aidlPreprocessed
|
|
|
|
}
|
|
|
|
|
|
|
|
func SdkPrebuiltFactory() (blueprint.Module, []interface{}) {
|
|
|
|
module := &sdkPrebuilt{}
|
|
|
|
|
2016-05-19 00:37:25 +02:00
|
|
|
return android.InitAndroidArchModule(module, android.HostAndDeviceSupported,
|
|
|
|
android.MultilibCommon, &module.properties, &module.sdkProperties)
|
2015-04-13 22:52:22 +02:00
|
|
|
}
|
|
|
|
|
2015-03-31 02:20:39 +02:00
|
|
|
func inList(s string, l []string) bool {
|
|
|
|
for _, e := range l {
|
|
|
|
if e == s {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|