diff options
Diffstat (limited to 'java/java.go')
| -rw-r--r-- | java/java.go | 206 |
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_" |