summaryrefslogtreecommitdiff
path: root/java/java.go
diff options
context:
space:
mode:
Diffstat (limited to 'java/java.go')
-rw-r--r--java/java.go206
1 files changed, 54 insertions, 152 deletions
diff --git a/java/java.go b/java/java.go
index 6eae05cb1..fa4aee43d 100644
--- a/java/java.go
+++ b/java/java.go
@@ -430,154 +430,6 @@ func (j *Module) targetSdkVersion() string {
return j.sdkVersion()
}
-type sdkContext interface {
- // sdkVersion eturns the sdk_version property of the current module, or an empty string if it is not set.
- sdkVersion() string
- // minSdkVersion returns the min_sdk_version property of the current module, or sdkVersion() if it is not set.
- minSdkVersion() string
- // targetSdkVersion returns the target_sdk_version property of the current module, or sdkVersion() if it is not set.
- targetSdkVersion() string
-}
-
-func sdkVersionOrDefault(ctx android.BaseContext, v string) string {
- switch v {
- case "", "current", "system_current", "test_current", "core_current":
- return ctx.Config().DefaultAppTargetSdk()
- default:
- return v
- }
-}
-
-// Returns a sdk version as a number. For modules targeting an unreleased SDK (meaning it does not yet have a number)
-// it returns android.FutureApiLevel (10000).
-func sdkVersionToNumber(ctx android.BaseContext, v string) (int, error) {
- switch v {
- case "", "current", "test_current", "system_current", "core_current":
- return ctx.Config().DefaultAppTargetSdkInt(), nil
- default:
- n := android.GetNumericSdkVersion(v)
- if i, err := strconv.Atoi(n); err != nil {
- return -1, fmt.Errorf("invalid sdk version %q", n)
- } else {
- return i, nil
- }
- }
-}
-
-func sdkVersionToNumberAsString(ctx android.BaseContext, v string) (string, error) {
- n, err := sdkVersionToNumber(ctx, v)
- if err != nil {
- return "", err
- }
- return strconv.Itoa(n), nil
-}
-
-func decodeSdkDep(ctx android.BaseContext, sdkContext sdkContext) sdkDep {
- v := sdkContext.sdkVersion()
- i, err := sdkVersionToNumber(ctx, v)
- if err != nil {
- ctx.PropertyErrorf("sdk_version", "%s", err)
- return sdkDep{}
- }
-
- // Ensures that the specificed system SDK version is one of BOARD_SYSTEMSDK_VERSIONS (for vendor apks)
- // or PRODUCT_SYSTEMSDK_VERSIONS (for other apks or when BOARD_SYSTEMSDK_VERSIONS is not set)
- if strings.HasPrefix(v, "system_") && i != android.FutureApiLevel {
- allowed_versions := ctx.DeviceConfig().PlatformSystemSdkVersions()
- if ctx.DeviceSpecific() || ctx.SocSpecific() {
- if len(ctx.DeviceConfig().SystemSdkVersions()) > 0 {
- allowed_versions = ctx.DeviceConfig().SystemSdkVersions()
- }
- }
- version := strings.TrimPrefix(v, "system_")
- if len(allowed_versions) > 0 && !android.InList(version, allowed_versions) {
- ctx.PropertyErrorf("sdk_version", "incompatible sdk version %q. System SDK version should be one of %q",
- v, allowed_versions)
- }
- }
-
- toPrebuilt := func(sdk string) sdkDep {
- var api, v string
- if strings.Contains(sdk, "_") {
- t := strings.Split(sdk, "_")
- api = t[0]
- v = t[1]
- } else {
- api = "public"
- v = sdk
- }
- dir := filepath.Join("prebuilts", "sdk", v, api)
- jar := filepath.Join(dir, "android.jar")
- // There's no aidl for other SDKs yet.
- // TODO(77525052): Add aidl files for other SDKs too.
- public_dir := filepath.Join("prebuilts", "sdk", v, "public")
- aidl := filepath.Join(public_dir, "framework.aidl")
- jarPath := android.ExistentPathForSource(ctx, jar)
- aidlPath := android.ExistentPathForSource(ctx, aidl)
- lambdaStubsPath := android.PathForSource(ctx, config.SdkLambdaStubsPath)
-
- if (!jarPath.Valid() || !aidlPath.Valid()) && ctx.Config().AllowMissingDependencies() {
- return sdkDep{
- invalidVersion: true,
- modules: []string{fmt.Sprintf("sdk_%s_%s_android", api, v)},
- }
- }
-
- if !jarPath.Valid() {
- ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, jar)
- return sdkDep{}
- }
-
- if !aidlPath.Valid() {
- ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, aidl)
- return sdkDep{}
- }
-
- return sdkDep{
- useFiles: true,
- jars: android.Paths{jarPath.Path(), lambdaStubsPath},
- aidl: aidlPath.Path(),
- }
- }
-
- toModule := func(m, r string) sdkDep {
- ret := sdkDep{
- useModule: true,
- modules: []string{m, config.DefaultLambdaStubsLibrary},
- systemModules: m + "_system_modules",
- frameworkResModule: r,
- }
- if m == "core.current.stubs" {
- ret.systemModules = "core-system-modules"
- } else if m == "core.platform.api.stubs" {
- ret.systemModules = "core-platform-api-stubs-system-modules"
- }
- return ret
- }
-
- if ctx.Config().UnbundledBuildPrebuiltSdks() && v != "" {
- return toPrebuilt(v)
- }
-
- switch v {
- case "":
- return sdkDep{
- useDefaultLibs: true,
- frameworkResModule: "framework-res",
- }
- case "current":
- return toModule("android_stubs_current", "framework-res")
- case "system_current":
- return toModule("android_system_stubs_current", "framework-res")
- case "test_current":
- return toModule("android_test_stubs_current", "framework-res")
- case "core_current":
- return toModule("core.current.stubs", "")
- default:
- return toPrebuilt(v)
- }
-}
-
func (j *Module) deps(ctx android.BottomUpMutatorContext) {
if ctx.Device() {
if !Bool(j.properties.No_standard_libs) {
@@ -925,7 +777,18 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps {
func getJavaVersion(ctx android.ModuleContext, javaVersion string, sdkContext sdkContext) string {
var ret string
- sdk, err := sdkVersionToNumber(ctx, sdkContext.sdkVersion())
+ v := sdkContext.sdkVersion()
+ // For PDK builds, use the latest SDK version instead of "current"
+ if ctx.Config().IsPdkBuild() && (v == "" || v == "current") {
+ sdkVersions := ctx.Config().Get(sdkSingletonKey).([]int)
+ latestSdkVersion := 0
+ if len(sdkVersions) > 0 {
+ latestSdkVersion = sdkVersions[len(sdkVersions)-1]
+ }
+ v = strconv.Itoa(latestSdkVersion)
+ }
+
+ sdk, err := sdkVersionToNumber(ctx, v)
if err != nil {
ctx.PropertyErrorf("sdk_version", "%s", err)
}
@@ -1011,8 +874,15 @@ func (j *Module) collectBuilderFlags(ctx android.ModuleContext, deps deps) javaB
}
if j.properties.Patch_module != nil && flags.javaVersion == "1.9" {
- patchClasspath := ".:" + flags.classpath.FormJavaClassPath("")
- javacFlags = append(javacFlags, "--patch-module="+String(j.properties.Patch_module)+"="+patchClasspath)
+ // Manually specify build directory in case it is not under the repo root.
+ // (javac doesn't seem to expand into symbolc links when searching for patch-module targets, so
+ // just adding a symlink under the root doesn't help.)
+ patchPaths := ".:" + ctx.Config().BuildDir()
+ classPath := flags.classpath.FormJavaClassPath("")
+ if classPath != "" {
+ patchPaths += ":" + classPath
+ }
+ javacFlags = append(javacFlags, "--patch-module="+String(j.properties.Patch_module)+"="+patchPaths)
}
// systemModules
@@ -1319,6 +1189,8 @@ func (j *Module) compile(ctx android.ModuleContext, extraSrcJars ...android.Path
j.dexJarFile = dexOutputFile
+ j.dexpreopter.isInstallable = Bool(j.properties.Installable)
+ j.dexpreopter.uncompressedDex = j.deviceProperties.UncompressDex
dexOutputFile = j.dexpreopt(ctx, dexOutputFile)
j.maybeStrippedDexJarFile = dexOutputFile
@@ -1420,13 +1292,19 @@ func (j *Module) instrument(ctx android.ModuleContext, flags javaBuilderFlags,
return instrumentedJar
}
-var _ Dependency = (*Library)(nil)
+var _ Dependency = (*Module)(nil)
func (j *Module) HeaderJars() android.Paths {
+ if j.headerJarFile == nil {
+ return nil
+ }
return android.Paths{j.headerJarFile}
}
func (j *Module) ImplementationJars() android.Paths {
+ if j.implementationJarFile == nil {
+ return nil
+ }
return android.Paths{j.implementationJarFile}
}
@@ -1438,14 +1316,19 @@ func (j *Module) ResourceJars() android.Paths {
}
func (j *Module) ImplementationAndResourcesJars() android.Paths {
+ if j.implementationAndResourcesJar == nil {
+ return nil
+ }
return android.Paths{j.implementationAndResourcesJar}
}
func (j *Module) AidlIncludeDirs() android.Paths {
+ // exportAidlIncludeDirs is type android.Paths already
return j.exportAidlIncludeDirs
}
func (j *Module) ExportedSdkLibs() []string {
+ // exportedSdkLibs is type []string
return j.exportedSdkLibs
}
@@ -1480,9 +1363,14 @@ type Library struct {
Module
}
+func (j *Library) shouldUncompressDex(ctx android.ModuleContext) bool {
+ return false
+}
+
func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) {
j.dexpreopter.installPath = android.PathForModuleInstall(ctx, "framework", ctx.ModuleName()+".jar")
j.dexpreopter.isSDKLibrary = j.deviceProperties.IsSDKLibrary
+ j.deviceProperties.UncompressDex = j.shouldUncompressDex(ctx)
j.compile(ctx)
if Bool(j.properties.Installable) || ctx.Host() {
@@ -1583,6 +1471,7 @@ func TestFactory() android.Module {
&module.testProperties)
module.Module.properties.Installable = proptools.BoolPtr(true)
+ module.Module.dexpreopter.isTest = true
InitJavaModule(module, android.HostAndDeviceSupported)
return module
@@ -1805,10 +1694,16 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
var _ Dependency = (*Import)(nil)
func (j *Import) HeaderJars() android.Paths {
+ if j.combinedClasspathFile == nil {
+ return nil
+ }
return android.Paths{j.combinedClasspathFile}
}
func (j *Import) ImplementationJars() android.Paths {
+ if j.combinedClasspathFile == nil {
+ return nil
+ }
return android.Paths{j.combinedClasspathFile}
}
@@ -1817,6 +1712,9 @@ func (j *Import) ResourceJars() android.Paths {
}
func (j *Import) ImplementationAndResourcesJars() android.Paths {
+ if j.combinedClasspathFile == nil {
+ return nil
+ }
return android.Paths{j.combinedClasspathFile}
}
@@ -1828,6 +1726,10 @@ func (j *Import) ExportedSdkLibs() []string {
return j.exportedSdkLibs
}
+// Add compile time check for interface implementation
+var _ android.IDEInfo = (*Import)(nil)
+var _ android.IDECustomizedModuleName = (*Import)(nil)
+
// Collect information for opening IDE project files in java/jdeps.go.
const (
removedPrefix = "prebuilt_"