diff options
Diffstat (limited to 'java')
-rw-r--r-- | java/aar.go | 4 | ||||
-rw-r--r-- | java/app.go | 2 | ||||
-rw-r--r-- | java/app_import.go | 2 | ||||
-rw-r--r-- | java/dex.go | 14 | ||||
-rw-r--r-- | java/dex_test.go | 56 | ||||
-rw-r--r-- | java/java.go | 46 | ||||
-rw-r--r-- | java/java_test.go | 2 | ||||
-rw-r--r-- | java/robolectric.go | 25 | ||||
-rw-r--r-- | java/rro.go | 2 |
9 files changed, 132 insertions, 21 deletions
diff --git a/java/aar.go b/java/aar.go index 3479f9376..0a5a4c4d7 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1063,6 +1063,8 @@ func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) } a.setOutputFiles(ctx) + + buildComplianceMetadata(ctx) } func (a *AndroidLibrary) setOutputFiles(ctx android.ModuleContext) { @@ -1594,6 +1596,8 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.SetOutputFiles([]android.Path{a.implementationAndResourcesJarFile}, "") ctx.SetOutputFiles([]android.Path{a.aarPath}, ".aar") + + buildComplianceMetadata(ctx) } func (a *AARImport) HeaderJars() android.Paths { diff --git a/java/app.go b/java/app.go index da7eb02ec..abbf034fa 100644 --- a/java/app.go +++ b/java/app.go @@ -1103,6 +1103,8 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { } a.setOutputFiles(ctx) + + buildComplianceMetadata(ctx) } func (a *AndroidApp) setOutputFiles(ctx android.ModuleContext) { diff --git a/java/app_import.go b/java/app_import.go index a997e3550..352e995e2 100644 --- a/java/app_import.go +++ b/java/app_import.go @@ -531,6 +531,8 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext ctx.SetOutputFiles([]android.Path{a.outputFile}, "") + buildComplianceMetadata(ctx) + // TODO: androidmk converter jni libs } diff --git a/java/dex.go b/java/dex.go index 00a0537e8..64465a2de 100644 --- a/java/dex.go +++ b/java/dex.go @@ -234,21 +234,29 @@ func (d *dexer) dexCommonFlags(ctx android.ModuleContext, deps = append(deps, f) } - var requestReleaseMode bool + var requestReleaseMode, requestDebugMode bool requestReleaseMode, flags = android.RemoveFromList("--release", flags) + requestDebugMode, flags = android.RemoveFromList("--debug", flags) if ctx.Config().Getenv("NO_OPTIMIZE_DX") != "" || ctx.Config().Getenv("GENERATE_DEX_DEBUG") != "" { - flags = append(flags, "--debug") + requestDebugMode = true requestReleaseMode = false } // Don't strip out debug information for eng builds, unless the target // explicitly provided the `--release` build flag. This allows certain // test targets to remain optimized as part of eng test_suites builds. - if requestReleaseMode { + if requestDebugMode { + flags = append(flags, "--debug") + } else if requestReleaseMode { flags = append(flags, "--release") } else if ctx.Config().Eng() { flags = append(flags, "--debug") + } else if !d.effectiveOptimizeEnabled() && d.dexProperties.Optimize.EnabledByDefault { + // D8 uses --debug by default, whereas R8 uses --release by default. + // For targets that default to R8 usage (e.g., apps), but override this default, we still + // want D8 to run in release mode, preserving semantics as much as possible between the two. + flags = append(flags, "--release") } // Supplying the platform build flag disables various features like API modeling and desugaring. diff --git a/java/dex_test.go b/java/dex_test.go index f261066df..4e515b403 100644 --- a/java/dex_test.go +++ b/java/dex_test.go @@ -16,6 +16,7 @@ package java import ( "fmt" + "strconv" "testing" "android/soong/android" @@ -311,14 +312,25 @@ func TestD8(t *testing.T) { name: "static_lib", srcs: ["foo.java"], } + + android_app { + name: "app", + srcs: ["foo.java"], + platform_apis: true, + optimize: { + enabled: false, + }, + } `) foo := result.ModuleForTests("foo", "android_common") lib := result.ModuleForTests("lib", "android_common") + app := result.ModuleForTests("app", "android_common") staticLib := result.ModuleForTests("static_lib", "android_common") fooJavac := foo.Rule("javac") fooD8 := foo.Rule("d8") + appD8 := app.Rule("d8") libHeader := lib.Output("turbine-combined/lib.jar").Output staticLibHeader := staticLib.Output("turbine-combined/static_lib.jar").Output @@ -331,6 +343,16 @@ func TestD8(t *testing.T) { fooD8.Args["d8Flags"], libHeader.String()) android.AssertStringDoesNotContain(t, "expected no static_lib header jar in foo javac classpath", fooD8.Args["d8Flags"], staticLibHeader.String()) + + // A --release flag is added only for targets that opt out of default R8 behavior (e.g., apps). + // For library targets that don't use R8 by default, no --debug or --release flag should be + // added, instead relying on default D8 behavior (--debug). + android.AssertStringDoesContain(t, "expected --release in app d8 flags", + appD8.Args["d8Flags"], "--release") + android.AssertStringDoesNotContain(t, "expected no --release flag in lib d8 flags", + fooD8.Args["d8Flags"], "--release") + android.AssertStringDoesNotContain(t, "expected no --debug flag in lib d8 flags", + fooD8.Args["d8Flags"], "--debug") } func TestProguardFlagsInheritanceStatic(t *testing.T) { @@ -732,6 +754,9 @@ func TestDebugReleaseFlags(t *testing.T) { name: "app", srcs: ["foo.java"], platform_apis: true, + optimize: { + enabled: %s, + }, dxflags: ["%s"] } ` @@ -740,6 +765,7 @@ func TestDebugReleaseFlags(t *testing.T) { name string envVar string isEng bool + useD8 bool dxFlags string expectedFlags string }{ @@ -779,6 +805,19 @@ func TestDebugReleaseFlags(t *testing.T) { // Eng mode does *not* override explicit dxflags. expectedFlags: "--release", }, + { + name: "app_d8", + useD8: true, + // D8 usage w/ apps should explicitly enable --release mode. + expectedFlags: "--release", + }, + { + name: "app_d8_debug", + useD8: true, + dxFlags: "--debug", + // D8 usage w/ apps respects overriding dxFlags. + expectedFlags: "--debug", + }, } for _, tc := range testcases { @@ -801,11 +840,16 @@ func TestDebugReleaseFlags(t *testing.T) { }), ) } - result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, tc.dxFlags)) + result := fixturePreparer.RunTestWithBp(t, fmt.Sprintf(bp, strconv.FormatBool(!tc.useD8), tc.dxFlags)) - appR8 := result.ModuleForTests("app", "android_common").Rule("r8") - android.AssertStringDoesContain(t, "expected flag in R8 flags", - appR8.Args["r8Flags"], tc.expectedFlags) + dexRuleKey := "r8" + if tc.useD8 { + dexRuleKey = "d8" + } + dexFlagsKey := dexRuleKey + "Flags" + appDex := result.ModuleForTests("app", "android_common").Rule(dexRuleKey) + android.AssertStringDoesContain(t, "expected flag in dex flags", + appDex.Args[dexFlagsKey], tc.expectedFlags) var unexpectedFlags string if tc.expectedFlags == "--debug" { @@ -814,8 +858,8 @@ func TestDebugReleaseFlags(t *testing.T) { unexpectedFlags = "--debug" } if unexpectedFlags != "" { - android.AssertStringDoesNotContain(t, "unexpected flag in R8 flags", - appR8.Args["r8Flags"], unexpectedFlags) + android.AssertStringDoesNotContain(t, "unexpected flag in dex flags", + appDex.Args[dexFlagsKey], unexpectedFlags) } }) } diff --git a/java/java.go b/java/java.go index 9f0de46ce..900f0e32f 100644 --- a/java/java.go +++ b/java/java.go @@ -595,7 +595,7 @@ var ( ) func IsLibDepTag(depTag blueprint.DependencyTag) bool { - return depTag == libTag || depTag == sdkLibTag + return depTag == libTag } func IsStaticLibDepTag(depTag blueprint.DependencyTag) bool { @@ -1153,6 +1153,8 @@ func (j *Library) GenerateAndroidBuildActions(ctx android.ModuleContext) { setOutputFiles(ctx, j.Module) j.javaLibraryModuleInfoJSON(ctx) + + buildComplianceMetadata(ctx) } func (j *Library) javaLibraryModuleInfoJSON(ctx android.ModuleContext) *android.ModuleInfoJSON { @@ -1180,6 +1182,30 @@ func (j *Library) javaLibraryModuleInfoJSON(ctx android.ModuleContext) *android. return moduleInfoJSON } +func buildComplianceMetadata(ctx android.ModuleContext) { + // Dump metadata that can not be done in android/compliance-metadata.go + complianceMetadataInfo := ctx.ComplianceMetadataInfo() + builtFiles := ctx.GetOutputFiles().DefaultOutputFiles.Strings() + for _, paths := range ctx.GetOutputFiles().TaggedOutputFiles { + builtFiles = append(builtFiles, paths.Strings()...) + } + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.BUILT_FILES, android.FirstUniqueStrings(builtFiles)) + + // Static deps + staticDepNames := make([]string, 0) + staticDepFiles := android.Paths{} + ctx.VisitDirectDepsWithTag(staticLibTag, func(module android.Module) { + if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok { + staticDepNames = append(staticDepNames, module.Name()) + staticDepFiles = append(staticDepFiles, dep.ImplementationJars...) + staticDepFiles = append(staticDepFiles, dep.HeaderJars...) + staticDepFiles = append(staticDepFiles, dep.ResourceJars...) + } + }) + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEPS, android.FirstUniqueStrings(staticDepNames)) + complianceMetadataInfo.SetListValue(android.ComplianceMetadataProp.STATIC_DEP_FILES, android.FirstUniqueStrings(staticDepFiles.Strings())) +} + func (j *Library) getJarInstallDir(ctx android.ModuleContext) android.InstallPath { var installDir android.InstallPath if ctx.InstallInTestcases() { @@ -1850,6 +1876,22 @@ func (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext, } } moduleInfoJSON.TestMainlineModules = append(moduleInfoJSON.TestMainlineModules, j.testProperties.Test_mainline_modules...) + + // Install test deps + if !ctx.Config().KatiEnabled() { + pathInTestCases := android.PathForModuleInstall(ctx, "testcases", ctx.ModuleName()) + if j.testConfig != nil { + ctx.InstallFile(pathInTestCases, ctx.ModuleName()+".config", j.testConfig) + } + testDeps := append(j.data, j.extraTestConfigs...) + for _, data := range android.SortedUniquePaths(testDeps) { + dataPath := android.DataPath{SrcPath: data} + ctx.InstallTestData(pathInTestCases, []android.DataPath{dataPath}) + } + if j.outputFile != nil { + ctx.InstallFile(pathInTestCases, ctx.ModuleName()+".jar", j.outputFile) + } + } } func (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { @@ -3162,6 +3204,8 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, "") ctx.SetOutputFiles(android.Paths{j.combinedImplementationFile}, ".jar") + + buildComplianceMetadata(ctx) } func (j *Import) maybeInstall(ctx android.ModuleContext, jarName string, outputFile android.Path) { diff --git a/java/java_test.go b/java/java_test.go index edb0d7251..de58237bc 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1961,7 +1961,7 @@ func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) { } actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] - android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData) + android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, android.SortedUniqueStrings(expectedData), android.SortedUniqueStrings(actualData)) }) } } diff --git a/java/robolectric.go b/java/robolectric.go index ed3fc9a63..43e17f9ea 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -144,20 +144,25 @@ func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) r.forceOSType = ctx.Config().BuildOS r.forceArchType = ctx.Config().BuildArch - var options []tradefed.Option - options = append(options, tradefed.Option{Name: "java-flags", Value: "-Drobolectric=true"}) + var extraTestRunnerOptions []tradefed.Option + extraTestRunnerOptions = append(extraTestRunnerOptions, tradefed.Option{Name: "java-flags", Value: "-Drobolectric=true"}) if proptools.BoolDefault(r.robolectricProperties.Strict_mode, true) { - options = append(options, tradefed.Option{Name: "java-flags", Value: "-Drobolectric.strict.mode=true"}) + extraTestRunnerOptions = append(extraTestRunnerOptions, tradefed.Option{Name: "java-flags", Value: "-Drobolectric.strict.mode=true"}) } + var extraOptions []tradefed.Option + var javaHome = ctx.Config().Getenv("ANDROID_JAVA_HOME") + extraOptions = append(extraOptions, tradefed.Option{Name: "java-folder", Value: javaHome}) + r.testConfig = tradefed.AutoGenTestConfig(ctx, tradefed.AutoGenTestConfigOptions{ - TestConfigProp: r.testProperties.Test_config, - TestConfigTemplateProp: r.testProperties.Test_config_template, - TestSuites: r.testProperties.Test_suites, - TestRunnerOptions: options, - AutoGenConfig: r.testProperties.Auto_gen_config, - DeviceTemplate: "${RobolectricTestConfigTemplate}", - HostTemplate: "${RobolectricTestConfigTemplate}", + TestConfigProp: r.testProperties.Test_config, + TestConfigTemplateProp: r.testProperties.Test_config_template, + TestSuites: r.testProperties.Test_suites, + OptionsForAutogenerated: extraOptions, + TestRunnerOptions: extraTestRunnerOptions, + AutoGenConfig: r.testProperties.Auto_gen_config, + DeviceTemplate: "${RobolectricTestConfigTemplate}", + HostTemplate: "${RobolectricTestConfigTemplate}", }) r.data = android.PathsForModuleSrc(ctx, r.testProperties.Data) r.data = append(r.data, android.PathsForModuleSrc(ctx, r.testProperties.Device_common_data)...) diff --git a/java/rro.go b/java/rro.go index 44d55646e..d9f4ff7c8 100644 --- a/java/rro.go +++ b/java/rro.go @@ -206,6 +206,8 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC android.SetProvider(ctx, FlagsPackagesProvider, FlagsPackages{ AconfigTextFiles: aconfigTextFilePaths, }) + + buildComplianceMetadata(ctx) } func (r *RuntimeResourceOverlay) SdkVersion(ctx android.EarlyModuleContext) android.SdkSpec { |