diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/OWNERS | 3 | ||||
| -rw-r--r-- | java/aar.go | 24 | ||||
| -rw-r--r-- | java/android_manifest.go | 125 | ||||
| -rwxr-xr-x | java/app.go | 37 | ||||
| -rw-r--r-- | java/app_test.go | 6 | ||||
| -rw-r--r-- | java/base.go | 3 | ||||
| -rw-r--r-- | java/bootclasspath_fragment.go | 104 | ||||
| -rw-r--r-- | java/config/config.go | 2 | ||||
| -rw-r--r-- | java/droidstubs.go | 23 | ||||
| -rw-r--r-- | java/droidstubs_test.go | 23 | ||||
| -rw-r--r-- | java/hiddenapi.go | 1 | ||||
| -rw-r--r-- | java/java.go | 90 | ||||
| -rw-r--r-- | java/java_test.go | 61 | ||||
| -rw-r--r-- | java/plugin.go | 36 | ||||
| -rw-r--r-- | java/rro.go | 2 | ||||
| -rw-r--r-- | java/sdk_library.go | 8 |
16 files changed, 378 insertions, 170 deletions
diff --git a/java/OWNERS b/java/OWNERS index 52427120d..5b71b1e35 100644 --- a/java/OWNERS +++ b/java/OWNERS @@ -1 +1,4 @@ per-file dexpreopt*.go = ngeoffray@google.com,calin@google.com,skvadrik@google.com + +# For metalava team to disable lint checks in platform +per-file droidstubs.go = aurimas@google.com,emberrose@google.com,sjgilbert@google.com
\ No newline at end of file diff --git a/java/aar.go b/java/aar.go index aabbec6a3..51aad8da0 100644 --- a/java/aar.go +++ b/java/aar.go @@ -267,18 +267,32 @@ var extractAssetsRule = pctx.AndroidStaticRule("extractAssets", }) func (a *aapt) buildActions(ctx android.ModuleContext, sdkContext android.SdkContext, - classLoaderContexts dexpreopt.ClassLoaderContextMap, extraLinkFlags ...string) { + classLoaderContexts dexpreopt.ClassLoaderContextMap, excludedLibs []string, + extraLinkFlags ...string) { transitiveStaticLibs, transitiveStaticLibManifests, staticRRODirs, assetPackages, libDeps, libFlags := aaptLibs(ctx, sdkContext, classLoaderContexts) + // Exclude any libraries from the supplied list. + classLoaderContexts = classLoaderContexts.ExcludeLibs(excludedLibs) + // App manifest file manifestFile := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml") manifestSrcPath := android.PathForModuleSrc(ctx, manifestFile) - manifestPath := manifestFixer(ctx, manifestSrcPath, sdkContext, classLoaderContexts, - a.isLibrary, a.useEmbeddedNativeLibs, a.usesNonSdkApis, a.useEmbeddedDex, a.hasNoCode, - a.LoggingParent) + manifestPath := ManifestFixer(ManifestFixerParams{ + Ctx: ctx, + Manifest: manifestSrcPath, + SdkContext: sdkContext, + ClassLoaderContexts: classLoaderContexts, + IsLibrary: a.isLibrary, + UseEmbeddedNativeLibs: a.useEmbeddedNativeLibs, + UsesNonSdkApis: a.usesNonSdkApis, + UseEmbeddedDex: a.useEmbeddedDex, + HasNoCode: a.hasNoCode, + TestOnly: false, + LoggingParent: a.LoggingParent, + }) // Add additional manifest files to transitive manifests. additionalManifests := android.PathsForModuleSrc(ctx, a.aaptProperties.Additional_manifests) @@ -520,7 +534,7 @@ func (a *AndroidLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { func (a *AndroidLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.aapt.isLibrary = true a.classLoaderContexts = a.usesLibrary.classLoaderContextForUsesLibDeps(ctx) - a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts) + a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts, nil) a.hideApexVariantFromMake = !ctx.Provider(android.ApexInfoProvider).(android.ApexInfo).IsForPlatform() diff --git a/java/android_manifest.go b/java/android_manifest.go index f29d8ad1a..a5d5b97a0 100644 --- a/java/android_manifest.go +++ b/java/android_manifest.go @@ -28,13 +28,10 @@ import ( var manifestFixerRule = pctx.AndroidStaticRule("manifestFixer", blueprint.RuleParams{ Command: `${config.ManifestFixerCmd} ` + - `--minSdkVersion ${minSdkVersion} ` + - `--targetSdkVersion ${targetSdkVersion} ` + - `--raise-min-sdk-version ` + `$args $in $out`, CommandDeps: []string{"${config.ManifestFixerCmd}"}, }, - "minSdkVersion", "targetSdkVersion", "args") + "args") var manifestMergerRule = pctx.AndroidStaticRule("manifestMerger", blueprint.RuleParams{ @@ -58,84 +55,110 @@ func targetSdkVersionForManifestFixer(ctx android.ModuleContext, sdkContext andr return targetSdkVersion } -// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml -func manifestFixer(ctx android.ModuleContext, manifest android.Path, sdkContext android.SdkContext, - classLoaderContexts dexpreopt.ClassLoaderContextMap, isLibrary, useEmbeddedNativeLibs, usesNonSdkApis, - useEmbeddedDex, hasNoCode bool, loggingParent string) android.Path { +type ManifestFixerParams struct { + Ctx android.ModuleContext + Manifest android.Path + SdkContext android.SdkContext + ClassLoaderContexts dexpreopt.ClassLoaderContextMap + IsLibrary bool + UseEmbeddedNativeLibs bool + UsesNonSdkApis bool + UseEmbeddedDex bool + HasNoCode bool + TestOnly bool + LoggingParent string +} +// Uses manifest_fixer.py to inject minSdkVersion, etc. into an AndroidManifest.xml +func ManifestFixer(params ManifestFixerParams) android.Path { var args []string - if isLibrary { + + if params.IsLibrary { args = append(args, "--library") - } else { - minSdkVersion, err := sdkContext.MinSdkVersion(ctx).EffectiveVersion(ctx) + } else if params.SdkContext != nil { + minSdkVersion, err := params.SdkContext.MinSdkVersion(params.Ctx).EffectiveVersion(params.Ctx) if err != nil { - ctx.ModuleErrorf("invalid minSdkVersion: %s", err) + params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err) } if minSdkVersion.FinalOrFutureInt() >= 23 { - args = append(args, fmt.Sprintf("--extract-native-libs=%v", !useEmbeddedNativeLibs)) - } else if useEmbeddedNativeLibs { - ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it", + args = append(args, fmt.Sprintf("--extract-native-libs=%v", !params.UseEmbeddedNativeLibs)) + } else if params.UseEmbeddedNativeLibs { + params.Ctx.ModuleErrorf("module attempted to store uncompressed native libraries, but minSdkVersion=%d doesn't support it", minSdkVersion) } } - if usesNonSdkApis { + if params.UsesNonSdkApis { args = append(args, "--uses-non-sdk-api") } - if useEmbeddedDex { + if params.UseEmbeddedDex { args = append(args, "--use-embedded-dex") } - // manifest_fixer should add only the implicit SDK libraries inferred by Soong, not those added - // explicitly via `uses_libs`/`optional_uses_libs`. - requiredUsesLibs, optionalUsesLibs := classLoaderContexts.ImplicitUsesLibs() - for _, usesLib := range requiredUsesLibs { - args = append(args, "--uses-library", usesLib) - } - for _, usesLib := range optionalUsesLibs { - args = append(args, "--optional-uses-library", usesLib) + if params.ClassLoaderContexts != nil { + // manifest_fixer should add only the implicit SDK libraries inferred by Soong, not those added + // explicitly via `uses_libs`/`optional_uses_libs`. + requiredUsesLibs, optionalUsesLibs := params.ClassLoaderContexts.ImplicitUsesLibs() + + for _, usesLib := range requiredUsesLibs { + args = append(args, "--uses-library", usesLib) + } + for _, usesLib := range optionalUsesLibs { + args = append(args, "--optional-uses-library", usesLib) + } } - if hasNoCode { + if params.HasNoCode { args = append(args, "--has-no-code") } - if loggingParent != "" { - args = append(args, "--logging-parent", loggingParent) + if params.TestOnly { + args = append(args, "--test-only") } - var deps android.Paths - targetSdkVersion := targetSdkVersionForManifestFixer(ctx, sdkContext) - if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" { - targetSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String()) - deps = append(deps, ApiFingerprintPath(ctx)) + if params.LoggingParent != "" { + args = append(args, "--logging-parent", params.LoggingParent) } + var deps android.Paths + var argsMapper = make(map[string]string) - minSdkVersion, err := sdkContext.MinSdkVersion(ctx).EffectiveVersionString(ctx) - if err != nil { - ctx.ModuleErrorf("invalid minSdkVersion: %s", err) - } - if UseApiFingerprint(ctx) && ctx.ModuleName() != "framework-res" { - minSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String()) - deps = append(deps, ApiFingerprintPath(ctx)) - } + if params.SdkContext != nil { + targetSdkVersion := targetSdkVersionForManifestFixer(params.Ctx, params.SdkContext) + args = append(args, "--targetSdkVersion ", targetSdkVersion) - fixedManifest := android.PathForModuleOut(ctx, "manifest_fixer", "AndroidManifest.xml") - if err != nil { - ctx.ModuleErrorf("invalid minSdkVersion: %s", err) + if UseApiFingerprint(params.Ctx) && params.Ctx.ModuleName() != "framework-res" { + targetSdkVersion = params.Ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(params.Ctx).String()) + deps = append(deps, ApiFingerprintPath(params.Ctx)) + } + + minSdkVersion, err := params.SdkContext.MinSdkVersion(params.Ctx).EffectiveVersionString(params.Ctx) + if err != nil { + params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err) + } + + if UseApiFingerprint(params.Ctx) && params.Ctx.ModuleName() != "framework-res" { + minSdkVersion = params.Ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(params.Ctx).String()) + deps = append(deps, ApiFingerprintPath(params.Ctx)) + } + + if err != nil { + params.Ctx.ModuleErrorf("invalid minSdkVersion: %s", err) + } + args = append(args, "--minSdkVersion ", minSdkVersion) + args = append(args, "--raise-min-sdk-version") } - ctx.Build(pctx, android.BuildParams{ + + fixedManifest := android.PathForModuleOut(params.Ctx, "manifest_fixer", "AndroidManifest.xml") + argsMapper["args"] = strings.Join(args, " ") + + params.Ctx.Build(pctx, android.BuildParams{ Rule: manifestFixerRule, Description: "fix manifest", - Input: manifest, + Input: params.Manifest, Implicits: deps, Output: fixedManifest, - Args: map[string]string{ - "minSdkVersion": minSdkVersion, - "targetSdkVersion": targetSdkVersion, - "args": strings.Join(args, " "), - }, + Args: argsMapper, }) return fixedManifest.WithoutRel() diff --git a/java/app.go b/java/app.go index 7ae73f797..e4432ff4b 100755 --- a/java/app.go +++ b/java/app.go @@ -425,7 +425,8 @@ func (a *AndroidApp) aaptBuildActions(ctx android.ModuleContext) { a.aapt.splitNames = a.appProperties.Package_splits a.aapt.LoggingParent = String(a.overridableAppProperties.Logging_parent) - a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts, aaptLinkFlags...) + a.aapt.buildActions(ctx, android.SdkContext(a), a.classLoaderContexts, + a.usesLibraryProperties.Exclude_uses_libs, aaptLinkFlags...) // apps manifests are handled by aapt, don't let Module see them a.properties.Manifest = nil @@ -1211,6 +1212,23 @@ type UsesLibraryProperties struct { // libraries, because SDK ones are automatically picked up by Soong. The <uses-library> name // normally is the same as the module name, but there are exceptions. Provides_uses_lib *string + + // A list of shared library names to exclude from the classpath of the APK. Adding a library here + // will prevent it from being used when precompiling the APK and prevent it from being implicitly + // added to the APK's manifest's <uses-library> elements. + // + // Care must be taken when using this as it could result in runtime errors if the APK actually + // uses classes provided by the library and which are not provided in any other way. + // + // This is primarily intended for use by various CTS tests that check the runtime handling of the + // android.test.base shared library (and related libraries) but which depend on some common + // libraries that depend on the android.test.base library. Without this those tests will end up + // with a <uses-library android:name="android.test.base"/> in their manifest which would either + // render the tests worthless (as they would be testing the wrong behavior), or would break the + // test altogether by providing access to classes that the tests were not expecting. Those tests + // provide the android.test.base statically and use jarjar to rename them so they do not collide + // with the classes provided by the android.test.base library. + Exclude_uses_libs []string } // usesLibrary provides properties and helper functions for AndroidApp and AndroidAppImport to verify that the @@ -1432,17 +1450,15 @@ func androidAppCertificateBp2Build(ctx android.TopDownMutatorContext, module *An } type bazelAndroidAppAttributes struct { - Srcs bazel.LabelListAttribute + *javaLibraryAttributes Manifest bazel.Label Custom_package *string Resource_files bazel.LabelListAttribute - Deps bazel.LabelListAttribute } // ConvertWithBp2build is used to convert android_app to Bazel. func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { - //TODO(b/209577426): Support multiple arch variants - srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Srcs, a.properties.Exclude_srcs)) + libAttrs := a.convertLibraryAttrsBp2Build(ctx) manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml") @@ -1454,15 +1470,12 @@ func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { resourceFiles.Includes = append(resourceFiles.Includes, files...) } - deps := bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, a.properties.Static_libs)) - attrs := &bazelAndroidAppAttributes{ - Srcs: srcs, - Manifest: android.BazelLabelForModuleSrcSingle(ctx, manifest), + libAttrs, + android.BazelLabelForModuleSrcSingle(ctx, manifest), // TODO(b/209576404): handle package name override by product variable PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES - Custom_package: a.overridableAppProperties.Package_name, - Resource_files: bazel.MakeLabelListAttribute(resourceFiles), - Deps: deps, + a.overridableAppProperties.Package_name, + bazel.MakeLabelListAttribute(resourceFiles), } props := bazel.BazelTargetModuleProperties{Rule_class: "android_binary", Bzl_load_location: "@rules_android//rules:rules.bzl"} diff --git a/java/app_test.go b/java/app_test.go index 2322ef44e..16bbec158 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -2512,7 +2512,7 @@ func TestUsesLibraries(t *testing.T) { `--uses-library qux ` + `--uses-library quuz ` + `--uses-library runtime-library` - android.AssertStringEquals(t, "manifest_fixer args", expectManifestFixerArgs, actualManifestFixerArgs) + android.AssertStringDoesContain(t, "manifest_fixer args", actualManifestFixerArgs, expectManifestFixerArgs) // Test that all libraries are verified (library order matters). verifyCmd := app.Rule("verify_uses_libraries").RuleParams.Command @@ -3055,7 +3055,7 @@ func TestTargetSdkVersionManifestFixer(t *testing.T) { result := fixture.RunTestWithBp(t, bp) foo := result.ModuleForTests("foo", "android_common") - manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args - android.AssertStringEquals(t, testCase.name, testCase.targetSdkVersionExpected, manifestFixerArgs["targetSdkVersion"]) + manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"] + android.AssertStringDoesContain(t, testCase.name, manifestFixerArgs, "--targetSdkVersion "+testCase.targetSdkVersionExpected) } } diff --git a/java/base.go b/java/base.go index a3eb8de21..42d7733ca 100644 --- a/java/base.go +++ b/java/base.go @@ -1969,7 +1969,7 @@ var _ ModuleWithStem = (*Module)(nil) func (j *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) { switch ctx.ModuleType() { - case "java_library", "java_library_host": + case "java_library", "java_library_host", "java_library_static": if lib, ok := ctx.Module().(*Library); ok { javaLibraryBp2Build(ctx, lib) } @@ -1978,5 +1978,4 @@ func (j *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) { javaBinaryHostBp2Build(ctx, binary) } } - } diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index fee51d72b..a36bd6a63 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -669,6 +669,8 @@ func (b *BootclasspathFragmentModule) configuredJars(ctx android.ModuleContext) // This is an exception to support end-to-end test for SdkExtensions, until such support exists. if android.InList("test_framework-sdkextensions", possibleUpdatableModules) { jars = jars.Append("com.android.sdkext", "test_framework-sdkextensions") + } else if android.InList("AddNewActivity", possibleUpdatableModules) { + jars = jars.Append("test_com.android.cts.frameworkresapkplits", "AddNewActivity") } else if android.InList("test_framework-apexd", possibleUpdatableModules) { jars = jars.Append("com.android.apex.test_package", "test_framework-apexd") } else if global.ApexBootJars.Len() != 0 && !android.IsModuleInVersionedSdk(ctx.Module()) { @@ -1071,7 +1073,7 @@ type prebuiltBootclasspathFragmentProperties struct { // At the moment this is basically just a bootclasspath_fragment module that can be used as a // prebuilt. Eventually as more functionality is migrated into the bootclasspath_fragment module // type from the various singletons then this will diverge. -type prebuiltBootclasspathFragmentModule struct { +type PrebuiltBootclasspathFragmentModule struct { BootclasspathFragmentModule prebuilt android.Prebuilt @@ -1079,16 +1081,16 @@ type prebuiltBootclasspathFragmentModule struct { prebuiltProperties prebuiltBootclasspathFragmentProperties } -func (module *prebuiltBootclasspathFragmentModule) Prebuilt() *android.Prebuilt { +func (module *PrebuiltBootclasspathFragmentModule) Prebuilt() *android.Prebuilt { return &module.prebuilt } -func (module *prebuiltBootclasspathFragmentModule) Name() string { +func (module *PrebuiltBootclasspathFragmentModule) Name() string { return module.prebuilt.Name(module.ModuleBase.Name()) } // produceHiddenAPIOutput returns a path to the prebuilt all-flags.csv or nil if none is specified. -func (module *prebuiltBootclasspathFragmentModule) produceHiddenAPIOutput(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIOutput { +func (module *PrebuiltBootclasspathFragmentModule) produceHiddenAPIOutput(ctx android.ModuleContext, contents []android.Module, input HiddenAPIFlagInput) *HiddenAPIOutput { pathForOptionalSrc := func(src *string, defaultPath android.Path) android.Path { if src == nil { return defaultPath @@ -1129,7 +1131,7 @@ func (module *prebuiltBootclasspathFragmentModule) produceHiddenAPIOutput(ctx an } // produceBootImageFiles extracts the boot image files from the APEX if available. -func (module *prebuiltBootclasspathFragmentModule) produceBootImageFiles(ctx android.ModuleContext, imageConfig *bootImageConfig) bootImageFilesByArch { +func (module *PrebuiltBootclasspathFragmentModule) produceBootImageFiles(ctx android.ModuleContext, imageConfig *bootImageConfig) bootImageFilesByArch { if !shouldCopyBootFilesToPredefinedLocations(ctx, imageConfig) { return nil } @@ -1139,37 +1141,53 @@ func (module *prebuiltBootclasspathFragmentModule) produceBootImageFiles(ctx and return nil // An error has been reported by FindDeapexerProviderForModule. } - files := bootImageFilesByArch{} - for _, variant := range imageConfig.apexVariants() { - arch := variant.target.Arch.ArchType - for _, toPath := range variant.imagesDeps { - apexRelativePath := apexRootRelativePathToBootImageFile(arch, toPath.Base()) - // Get the path to the file that the deapexer extracted from the prebuilt apex file. - fromPath := di.PrebuiltExportPath(apexRelativePath) - - // Return the toPath as the calling code expects the paths in the returned map to be the - // paths predefined in the bootImageConfig. - files[arch] = append(files[arch], toPath) - - // Copy the file to the predefined location. - ctx.Build(pctx, android.BuildParams{ - Rule: android.Cp, - Input: fromPath, - Output: toPath, - }) - } + profile := (android.WritablePath)(nil) + if imageConfig.profileInstallPathInApex != "" { + profile = di.PrebuiltExportPath(imageConfig.profileInstallPathInApex) } - // Build the boot image files for the host variants. These are built from the dex files provided - // by the contents of this module as prebuilt versions of the host boot image files are not - // available, i.e. there is no host specific prebuilt apex containing them. This has to be built - // without a profile as the prebuilt modules do not provide a profile. - buildBootImageVariantsForBuildOs(ctx, imageConfig, nil) + // Build the boot image files for the host variants. These are always built from the dex files + // provided by the contents of this module as prebuilt versions of the host boot image files are + // not available, i.e. there is no host specific prebuilt apex containing them. This has to be + // built without a profile as the prebuilt modules do not provide a profile. + buildBootImageVariantsForBuildOs(ctx, imageConfig, profile) - return files + if imageConfig.shouldInstallInApex() { + // If the boot image files for the android variants are in the prebuilt apex, we must use those + // rather than building new ones because those boot image files are going to be used on device. + files := bootImageFilesByArch{} + for _, variant := range imageConfig.apexVariants() { + arch := variant.target.Arch.ArchType + for _, toPath := range variant.imagesDeps { + apexRelativePath := apexRootRelativePathToBootImageFile(arch, toPath.Base()) + // Get the path to the file that the deapexer extracted from the prebuilt apex file. + fromPath := di.PrebuiltExportPath(apexRelativePath) + + // Return the toPath as the calling code expects the paths in the returned map to be the + // paths predefined in the bootImageConfig. + files[arch] = append(files[arch], toPath) + + // Copy the file to the predefined location. + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Input: fromPath, + Output: toPath, + }) + } + } + return files + } else { + if profile == nil { + ctx.ModuleErrorf("Unable to produce boot image files: neither boot image files nor profiles exists in the prebuilt apex") + return nil + } + // Build boot image files for the android variants from the dex files provided by the contents + // of this module. + return buildBootImageVariantsForAndroidOs(ctx, imageConfig, profile) + } } -var _ commonBootclasspathFragment = (*prebuiltBootclasspathFragmentModule)(nil) +var _ commonBootclasspathFragment = (*PrebuiltBootclasspathFragmentModule)(nil) // createBootImageTag creates the tag to uniquely identify the boot image file among all of the // files that a module requires from the prebuilt .apex file. @@ -1183,16 +1201,22 @@ func createBootImageTag(arch android.ArchType, baseName string) string { // // If there is no image config associated with this fragment then it returns nil. Otherwise, it // returns the files that are listed in the image config. -func (module *prebuiltBootclasspathFragmentModule) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) []string { +func (module *PrebuiltBootclasspathFragmentModule) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) []string { imageConfig := module.getImageConfig(ctx) if imageConfig != nil { - // Add the boot image files, e.g. .art, .oat and .vdex files. files := []string{} - for _, variant := range imageConfig.apexVariants() { - arch := variant.target.Arch.ArchType - for _, path := range variant.imagesDeps.Paths() { - base := path.Base() - files = append(files, apexRootRelativePathToBootImageFile(arch, base)) + if imageConfig.profileInstallPathInApex != "" { + // Add the boot image profile. + files = append(files, imageConfig.profileInstallPathInApex) + } + if imageConfig.shouldInstallInApex() { + // Add the boot image files, e.g. .art, .oat and .vdex files. + for _, variant := range imageConfig.apexVariants() { + arch := variant.target.Arch.ArchType + for _, path := range variant.imagesDeps.Paths() { + base := path.Base() + files = append(files, apexRootRelativePathToBootImageFile(arch, base)) + } } } return files @@ -1204,10 +1228,10 @@ func apexRootRelativePathToBootImageFile(arch android.ArchType, base string) str return filepath.Join("javalib", arch.String(), base) } -var _ android.RequiredFilesFromPrebuiltApex = (*prebuiltBootclasspathFragmentModule)(nil) +var _ android.RequiredFilesFromPrebuiltApex = (*PrebuiltBootclasspathFragmentModule)(nil) func prebuiltBootclasspathFragmentFactory() android.Module { - m := &prebuiltBootclasspathFragmentModule{} + m := &PrebuiltBootclasspathFragmentModule{} m.AddProperties(&m.properties, &m.prebuiltProperties) // This doesn't actually have any prebuilt files of its own so pass a placeholder for the srcs // array. diff --git a/java/config/config.go b/java/config/config.go index 30c6f91aa..ea2f93449 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -60,7 +60,7 @@ var ( const ( JavaVmFlags = `-XX:OnError="cat hs_err_pid%p.log" -XX:CICompilerCount=6 -XX:+UseDynamicNumberOfGCThreads` - JavacVmFlags = `-J-XX:OnError="cat hs_err_pid%p.log" -J-XX:CICompilerCount=6 -J-XX:+UseDynamicNumberOfGCThreads` + JavacVmFlags = `-J-XX:OnError="cat hs_err_pid%p.log" -J-XX:CICompilerCount=6 -J-XX:+UseDynamicNumberOfGCThreads -J-XX:+TieredCompilation -J-XX:TieredStopAtLevel=1` ) func init() { diff --git a/java/droidstubs.go b/java/droidstubs.go index 5a84e051c..f9dcfd668 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -19,7 +19,6 @@ import ( "path/filepath" "strings" - "github.com/google/blueprint" "github.com/google/blueprint/proptools" "android/soong/android" @@ -335,7 +334,11 @@ func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.Ru // TODO(tnorbye): find owners to fix these warnings when annotation was enabled. cmd.FlagWithArg("--hide ", "HiddenTypedefConstant"). FlagWithArg("--hide ", "SuperfluousPrefix"). - FlagWithArg("--hide ", "AnnotationExtraction") + FlagWithArg("--hide ", "AnnotationExtraction"). + // (b/217545629) + FlagWithArg("--hide ", "ChangedThrows"). + // (b/217552813) + FlagWithArg("--hide ", "ChangedAbstract") } } @@ -807,8 +810,7 @@ type PrebuiltStubsSources struct { properties PrebuiltStubsSourcesProperties - stubsSrcJar android.Path - jsonDataActions []blueprint.JSONDataAction + stubsSrcJar android.Path } func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) { @@ -824,13 +826,6 @@ func (d *PrebuiltStubsSources) StubsSrcJar() android.Path { return d.stubsSrcJar } -// AddJSONData is a temporary solution for droidstubs module to put action -// related data into the module json graph. -func (p *PrebuiltStubsSources) AddJSONData(d *map[string]interface{}) { - p.ModuleBase.AddJSONData(d) - (*d)["Actions"] = blueprint.FormatJSONDataActions(p.jsonDataActions) -} - func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) { if len(p.properties.Srcs) != 1 { ctx.PropertyErrorf("srcs", "must only specify one directory path or srcjar, contains %d paths", len(p.properties.Srcs)) @@ -838,12 +833,9 @@ func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleCon } src := p.properties.Srcs[0] - var jsonDataAction blueprint.JSONDataAction if filepath.Ext(src) == ".srcjar" { // This is a srcjar. We can use it directly. p.stubsSrcJar = android.PathForModuleSrc(ctx, src) - jsonDataAction.Inputs = []string{src} - jsonDataAction.Outputs = []string{src} } else { outPath := android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar") @@ -867,10 +859,7 @@ func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleCon rule.Restat() rule.Build("zip src", "Create srcjar from prebuilt source") p.stubsSrcJar = outPath - jsonDataAction.Inputs = srcPaths.Strings() - jsonDataAction.Outputs = []string{outPath.String()} } - p.jsonDataActions = []blueprint.JSONDataAction{jsonDataAction} } func (p *PrebuiltStubsSources) Prebuilt() *android.Prebuilt { diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go index 82ebba7b1..10d99f3a5 100644 --- a/java/droidstubs_test.go +++ b/java/droidstubs_test.go @@ -21,8 +21,6 @@ import ( "strings" "testing" - "github.com/google/blueprint" - "android/soong/android" ) @@ -234,27 +232,6 @@ func TestDroidstubsWithSystemModules(t *testing.T) { checkSystemModulesUseByDroidstubs(t, ctx, "stubs-prebuilt-system-modules", "prebuilt-jar.jar") } -func TestAddJSONData(t *testing.T) { - prebuiltStubsSources := PrebuiltStubsSources{} - prebuiltStubsSources.jsonDataActions = []blueprint.JSONDataAction{ - blueprint.JSONDataAction{ - Inputs: []string{}, - Outputs: []string{}, - }, - } - jsonData := map[string]interface{}{} - prebuiltStubsSources.AddJSONData(&jsonData) - expectedOut := []map[string]interface{}{ - map[string]interface{}{ - "Inputs": []string{}, - "Outputs": []string{}, - }, - } - if !reflect.DeepEqual(jsonData["Actions"], expectedOut) { - t.Errorf("The JSON action data %#v isn't as expected %#v.", jsonData["Actions"], expectedOut) - } -} - func checkSystemModulesUseByDroidstubs(t *testing.T, ctx *android.TestContext, moduleName string, systemJar string) { metalavaRule := ctx.ModuleForTests(moduleName, "android_common").Rule("metalava") var systemJars []string diff --git a/java/hiddenapi.go b/java/hiddenapi.go index 7c8be1e6e..3af5f1c7b 100644 --- a/java/hiddenapi.go +++ b/java/hiddenapi.go @@ -297,6 +297,7 @@ func hiddenAPIEncodeDex(ctx android.ModuleContext, dexInput, flagsCSV android.Pa type hiddenApiAnnotationsDependencyTag struct { blueprint.BaseDependencyTag + android.LicenseAnnotationSharedDependencyTag } // Tag used to mark dependencies on java_library instances that contains Java source files whose diff --git a/java/java.go b/java/java.go index e3e972153..e55f04599 100644 --- a/java/java.go +++ b/java/java.go @@ -274,6 +274,9 @@ type dependencyTag struct { // True if the dependency is relinked at runtime. runtimeLinked bool + + // True if the dependency is a toolchain, for example an annotation processor. + toolchain bool } // installDependencyTag is a dependency tag that is annotated to cause the installed files of the @@ -287,6 +290,8 @@ type installDependencyTag struct { func (d dependencyTag) LicenseAnnotations() []android.LicenseAnnotation { if d.runtimeLinked { return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency} + } else if d.toolchain { + return []android.LicenseAnnotation{android.LicenseAnnotationToolchain} } return nil } @@ -325,22 +330,23 @@ func IsJniDepTag(depTag blueprint.DependencyTag) bool { var ( dataNativeBinsTag = dependencyTag{name: "dataNativeBins"} + dataDeviceBinsTag = dependencyTag{name: "dataDeviceBins"} staticLibTag = dependencyTag{name: "staticlib"} libTag = dependencyTag{name: "javalib", runtimeLinked: true} java9LibTag = dependencyTag{name: "java9lib", runtimeLinked: true} - pluginTag = dependencyTag{name: "plugin"} - errorpronePluginTag = dependencyTag{name: "errorprone-plugin"} - exportedPluginTag = dependencyTag{name: "exported-plugin"} + pluginTag = dependencyTag{name: "plugin", toolchain: true} + errorpronePluginTag = dependencyTag{name: "errorprone-plugin", toolchain: true} + exportedPluginTag = dependencyTag{name: "exported-plugin", toolchain: true} bootClasspathTag = dependencyTag{name: "bootclasspath", runtimeLinked: true} systemModulesTag = dependencyTag{name: "system modules", runtimeLinked: true} frameworkResTag = dependencyTag{name: "framework-res"} kotlinStdlibTag = dependencyTag{name: "kotlin-stdlib", runtimeLinked: true} kotlinAnnotationsTag = dependencyTag{name: "kotlin-annotations", runtimeLinked: true} - kotlinPluginTag = dependencyTag{name: "kotlin-plugin"} + kotlinPluginTag = dependencyTag{name: "kotlin-plugin", toolchain: true} proguardRaiseTag = dependencyTag{name: "proguard-raise"} certificateTag = dependencyTag{name: "certificate"} instrumentationForTag = dependencyTag{name: "instrumentation_for"} - extraLintCheckTag = dependencyTag{name: "extra-lint-check"} + extraLintCheckTag = dependencyTag{name: "extra-lint-check", toolchain: true} jniLibTag = dependencyTag{name: "jnilib", runtimeLinked: true} syspropPublicStubDepTag = dependencyTag{name: "sysprop public stub"} jniInstallTag = installDependencyTag{name: "jni install"} @@ -831,6 +837,9 @@ type testProperties struct { type hostTestProperties struct { // list of native binary modules that should be installed alongside the test Data_native_bins []string `android:"arch_variant"` + + // list of device binary modules that should be installed alongside the test + Data_device_bins []string `android:"arch_variant"` } type testHelperLibraryProperties struct { @@ -904,6 +913,11 @@ func (j *TestHost) DepsMutator(ctx android.BottomUpMutatorContext) { } } + if len(j.testHostProperties.Data_device_bins) > 0 { + deviceVariations := ctx.Config().AndroidFirstDeviceTarget.Variations() + ctx.AddFarVariationDependencies(deviceVariations, dataDeviceBinsTag, j.testHostProperties.Data_device_bins...) + } + if len(j.testProperties.Jni_libs) > 0 { for _, target := range ctx.MultiTargets() { sharedLibVariations := append(target.Variations(), blueprint.Variation{Mutator: "link", Variation: "shared"}) @@ -918,14 +932,35 @@ func (j *TestHost) AddExtraResource(p android.Path) { j.extraResources = append(j.extraResources, p) } +func (j *TestHost) GenerateAndroidBuildActions(ctx android.ModuleContext) { + var configs []tradefed.Config + if len(j.testHostProperties.Data_device_bins) > 0 { + // add Tradefed configuration to push device bins to device for testing + remoteDir := filepath.Join("/data/local/tests/unrestricted/", j.Name()) + options := []tradefed.Option{{Name: "cleanup", Value: "true"}} + for _, bin := range j.testHostProperties.Data_device_bins { + fullPath := filepath.Join(remoteDir, bin) + options = append(options, tradefed.Option{Name: "push-file", Key: bin, Value: fullPath}) + } + configs = append(configs, tradefed.Object{"target_preparer", "com.android.tradefed.targetprep.PushFilePreparer", options}) + } + + j.Test.generateAndroidBuildActionsWithConfig(ctx, configs) +} + func (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) { + j.generateAndroidBuildActionsWithConfig(ctx, nil) +} + +func (j *Test) generateAndroidBuildActionsWithConfig(ctx android.ModuleContext, configs []tradefed.Config) { if j.testProperties.Test_options.Unit_test == nil && ctx.Host() { // TODO(b/): Clean temporary heuristic to avoid unexpected onboarding. defaultUnitTest := !inList("tradefed", j.properties.Libs) && !inList("cts", j.testProperties.Test_suites) j.testProperties.Test_options.Unit_test = proptools.BoolPtr(defaultUnitTest) } + j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.testProperties.Test_config, j.testProperties.Test_config_template, - j.testProperties.Test_suites, j.testProperties.Auto_gen_config, j.testProperties.Test_options.Unit_test) + j.testProperties.Test_suites, configs, j.testProperties.Auto_gen_config, j.testProperties.Test_options.Unit_test) j.data = android.PathsForModuleSrc(ctx, j.testProperties.Data) @@ -935,6 +970,10 @@ func (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.data = append(j.data, android.OutputFileForModule(ctx, dep, "")) }) + ctx.VisitDirectDepsWithTag(dataDeviceBinsTag, func(dep android.Module) { + j.data = append(j.data, android.OutputFileForModule(ctx, dep, "")) + }) + ctx.VisitDirectDepsWithTag(jniLibTag, func(dep android.Module) { sharedLibInfo := ctx.OtherModuleProvider(dep, cc.SharedLibraryInfoProvider).(cc.SharedLibraryInfo) if sharedLibInfo.SharedLibrary != nil { @@ -967,7 +1006,7 @@ func (j *TestHelperLibrary) GenerateAndroidBuildActions(ctx android.ModuleContex func (j *JavaTestImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.testConfig = tradefed.AutoGenJavaTestConfig(ctx, j.prebuiltTestProperties.Test_config, nil, - j.prebuiltTestProperties.Test_suites, nil, nil) + j.prebuiltTestProperties.Test_suites, nil, nil, nil) j.Import.GenerateAndroidBuildActions(ctx) } @@ -1294,6 +1333,7 @@ type Import struct { android.ModuleBase android.DefaultableModuleBase android.ApexModuleBase + android.BazelModuleBase prebuilt android.Prebuilt android.SdkBase @@ -1649,6 +1689,7 @@ func ImportFactory() android.Module { android.InitPrebuiltModule(module, &module.properties.Jars) android.InitApexModule(module) android.InitSdkAwareModule(module) + android.InitBazelModule(module) InitJavaModule(module, android.HostAndDeviceSupported) return module } @@ -1969,7 +2010,8 @@ type javaLibraryAttributes struct { Javacopts bazel.StringListAttribute } -func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) { +func (m *Library) convertLibraryAttrsBp2Build(ctx android.TopDownMutatorContext) *javaLibraryAttributes { + //TODO(b/209577426): Support multiple arch variants srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.properties.Srcs, m.properties.Exclude_srcs)) attrs := &javaLibraryAttributes{ Srcs: srcs, @@ -1979,9 +2021,21 @@ func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) { attrs.Javacopts = bazel.MakeStringListAttribute(m.properties.Javacflags) } + var deps bazel.LabelList if m.properties.Libs != nil { - attrs.Deps = bazel.MakeLabelListAttribute(android.BazelLabelForModuleDeps(ctx, m.properties.Libs)) + deps.Append(android.BazelLabelForModuleDeps(ctx, m.properties.Libs)) + } + if m.properties.Static_libs != nil { + //TODO(b/217236083) handle static libs similarly to Soong + deps.Append(android.BazelLabelForModuleDeps(ctx, m.properties.Static_libs)) } + attrs.Deps = bazel.MakeLabelListAttribute(deps) + + return attrs +} + +func javaLibraryBp2Build(ctx android.TopDownMutatorContext, m *Library) { + attrs := m.convertLibraryAttrsBp2Build(ctx) props := bazel.BazelTargetModuleProperties{ Rule_class: "java_library", @@ -2067,3 +2121,21 @@ func javaBinaryHostBp2Build(ctx android.TopDownMutatorContext, m *Binary) { // Create the BazelTargetModule. ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, attrs) } + +type bazelJavaImportAttributes struct { + Jars bazel.LabelListAttribute +} + +// java_import bp2Build converter. +func (i *Import) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + //TODO(b/209577426): Support multiple arch variants + jars := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, i.properties.Jars, []string(nil))) + + attrs := &bazelJavaImportAttributes{ + Jars: jars, + } + props := bazel.BazelTargetModuleProperties{Rule_class: "java_import"} + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: android.RemoveOptionalPrebuiltPrefix(i.Name())}, attrs) + +} diff --git a/java/java_test.go b/java/java_test.go index 3a51981e6..21c76b6c1 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1460,3 +1460,64 @@ func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) { t.Errorf("expected errorprone to contain %q, got %q", expectedSubstring, javac.Args["javacFlags"]) } } + +func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) { + bp := ` + java_test_host { + name: "foo", + srcs: ["test.java"], + data_device_bins: ["bar"], + } + + cc_binary { + name: "bar", + } + ` + + ctx := android.GroupFixturePreparers( + PrepareForIntegrationTestWithJava, + ).RunTestWithBp(t, bp) + + buildOS := ctx.Config.BuildOS.String() + fooVariant := ctx.ModuleForTests("foo", buildOS+"_common") + barVariant := ctx.ModuleForTests("bar", "android_arm64_armv8-a") + fooMod := fooVariant.Module().(*TestHost) + + relocated := barVariant.Output("bar") + expectedInput := "out/soong/.intermediates/bar/android_arm64_armv8-a/unstripped/bar" + android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input) + + entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0] + expectedData := []string{ + "out/soong/.intermediates/bar/android_arm64_armv8-a/bar:bar", + } + actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"] + android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData) +} + +func TestDataDeviceBinsAutogenTradefedConfig(t *testing.T) { + bp := ` + java_test_host { + name: "foo", + srcs: ["test.java"], + data_device_bins: ["bar"], + } + + cc_binary { + name: "bar", + } + ` + + ctx := android.GroupFixturePreparers( + PrepareForIntegrationTestWithJava, + ).RunTestWithBp(t, bp) + + buildOS := ctx.Config.BuildOS.String() + fooModule := ctx.ModuleForTests("foo", buildOS+"_common") + expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />` + + autogen := fooModule.Rule("autogen") + if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) { + t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig) + } +} diff --git a/java/plugin.go b/java/plugin.go index 297ac2cb8..4b174b930 100644 --- a/java/plugin.go +++ b/java/plugin.go @@ -14,7 +14,10 @@ package java -import "android/soong/android" +import ( + "android/soong/android" + "android/soong/bazel" +) func init() { registerJavaPluginBuildComponents(android.InitRegistrationContext) @@ -24,7 +27,6 @@ func registerJavaPluginBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("java_plugin", PluginFactory) } -// A java_plugin module describes a host java library that will be used by javac as an annotation processor. func PluginFactory() android.Module { module := &Plugin{} @@ -32,9 +34,13 @@ func PluginFactory() android.Module { module.AddProperties(&module.pluginProperties) InitJavaModule(module, android.HostSupported) + + android.InitBazelModule(module) + return module } +// Plugin describes a java_plugin module, a host java library that will be used by javac as an annotation processor. type Plugin struct { Library @@ -50,3 +56,29 @@ type PluginProperties struct { // parallelism and cause more recompilation for modules that depend on modules that use this plugin. Generates_api *bool } + +type pluginAttributes struct { + *javaLibraryAttributes + Processor_class *string + Target_compatible_with bazel.LabelListAttribute +} + +// ConvertWithBp2build is used to convert android_app to Bazel. +func (p *Plugin) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + libAttrs := p.convertLibraryAttrsBp2Build(ctx) + attrs := &pluginAttributes{ + libAttrs, + nil, + bazel.LabelListAttribute{}, + } + + if p.pluginProperties.Processor_class != nil { + attrs.Processor_class = p.pluginProperties.Processor_class + } + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "java_plugin", + } + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: p.Name()}, attrs) +} diff --git a/java/rro.go b/java/rro.go index 0b4d0916a..be84afffc 100644 --- a/java/rro.go +++ b/java/rro.go @@ -139,7 +139,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC aaptLinkFlags = append(aaptLinkFlags, "--rename-overlay-target-package "+*r.overridableProperties.Target_package_name) } - r.aapt.buildActions(ctx, r, nil, aaptLinkFlags...) + r.aapt.buildActions(ctx, r, nil, nil, aaptLinkFlags...) // Sign the built package _, certificates := collectAppDeps(ctx, r, false, false) diff --git a/java/sdk_library.go b/java/sdk_library.go index 57ab2686f..6a2a7a845 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2755,7 +2755,7 @@ type sdkLibrarySdkMemberProperties struct { android.SdkMemberPropertiesBase // Scope to per scope properties. - Scopes map[*apiScope]scopeProperties + Scopes map[*apiScope]*scopeProperties // The Java stubs source files. Stub_srcs []string @@ -2808,14 +2808,14 @@ type scopeProperties struct { StubsSrcJar android.Path CurrentApiFile android.Path RemovedApiFile android.Path - AnnotationsZip android.Path + AnnotationsZip android.Path `supported_build_releases:"T+"` SdkVersion string } func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { sdk := variant.(*SdkLibrary) - s.Scopes = make(map[*apiScope]scopeProperties) + s.Scopes = make(map[*apiScope]*scopeProperties) for _, apiScope := range allApiScopes { paths := sdk.findScopePaths(apiScope) if paths == nil { @@ -2838,7 +2838,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe if paths.annotationsZip.Valid() { properties.AnnotationsZip = paths.annotationsZip.Path() } - s.Scopes[apiScope] = properties + s.Scopes[apiScope] = &properties } } |