diff options
| -rw-r--r-- | android/config.go | 15 | ||||
| -rw-r--r-- | android/variable.go | 16 | ||||
| -rw-r--r-- | apex/apex.go | 22 | ||||
| -rw-r--r-- | apex/apex_test.go | 150 | ||||
| -rw-r--r-- | apex/vndk.go | 8 | ||||
| -rw-r--r-- | cc/config/clang.go | 16 | ||||
| -rw-r--r-- | cc/config/global.go | 4 | ||||
| -rw-r--r-- | cc/fuzz.go | 14 | ||||
| -rw-r--r-- | cc/sanitize.go | 2 | ||||
| -rw-r--r-- | cc/tidy.go | 6 | ||||
| -rw-r--r-- | dexpreopt/dexpreopt.go | 15 | ||||
| -rwxr-xr-x | java/app.go | 22 | ||||
| -rw-r--r-- | java/app_builder.go | 16 | ||||
| -rw-r--r-- | java/app_test.go | 60 | ||||
| -rw-r--r-- | java/dexpreopt_bootjars.go | 12 | ||||
| -rw-r--r-- | java/dexpreopt_bootjars_test.go | 2 | ||||
| -rw-r--r-- | java/dexpreopt_config.go | 25 | ||||
| -rw-r--r-- | java/java.go | 12 | ||||
| -rw-r--r-- | java/sdk.go | 5 | ||||
| -rw-r--r-- | rust/compiler_test.go | 30 | ||||
| -rw-r--r-- | ui/build/config.go | 3 |
21 files changed, 299 insertions, 156 deletions
diff --git a/android/config.go b/android/config.go index c297b0597..ee31c1003 100644 --- a/android/config.go +++ b/android/config.go @@ -906,13 +906,18 @@ func SplitApexJarPair(apexJarValue string) (string, string) { return apexJarPair[0], apexJarPair[1] } -func (c *config) BootJars() []string { - jars := c.productVariables.BootJars - for _, p := range c.productVariables.UpdatableBootJars { +func GetJarsFromApexJarPairs(apexJarPairs []string) []string { + modules := make([]string, len(apexJarPairs)) + for i, p := range apexJarPairs { _, jar := SplitApexJarPair(p) - jars = append(jars, jar) + modules[i] = jar } - return jars + return modules +} + +func (c *config) BootJars() []string { + return append(GetJarsFromApexJarPairs(c.productVariables.BootJars), + GetJarsFromApexJarPairs(c.productVariables.UpdatableBootJars)...) } func (c *config) DexpreoptGlobalConfig(ctx PathContext) ([]byte, error) { diff --git a/android/variable.go b/android/variable.go index 3b3916e2f..3c08405dd 100644 --- a/android/variable.go +++ b/android/variable.go @@ -49,6 +49,14 @@ type variableProperties struct { Exclude_static_libs []string `android:"arch_variant"` } `android:"arch_variant"` + Malloc_zero_contents struct { + Cflags []string `android:"arch_variant"` + } `android:"arch_variant"` + + Malloc_pattern_fill_contents struct { + Cflags []string `android:"arch_variant"` + } `android:"arch_variant"` + Safestack struct { Cflags []string `android:"arch_variant"` } `android:"arch_variant"` @@ -210,6 +218,8 @@ type productVariables struct { Unbundled_build *bool `json:",omitempty"` Unbundled_build_sdks_from_source *bool `json:",omitempty"` Malloc_not_svelte *bool `json:",omitempty"` + Malloc_zero_contents *bool `json:",omitempty"` + Malloc_pattern_fill_contents *bool `json:",omitempty"` Safestack *bool `json:",omitempty"` HostStaticBinaries *bool `json:",omitempty"` Binder32bit *bool `json:",omitempty"` @@ -376,8 +386,10 @@ func (v *productVariables) SetDefaultConfig() { AAPTCharacteristics: stringPtr("nosdcard"), AAPTPrebuiltDPI: []string{"xhdpi", "xxhdpi"}, - Malloc_not_svelte: boolPtr(true), - Safestack: boolPtr(false), + Malloc_not_svelte: boolPtr(true), + Malloc_zero_contents: boolPtr(false), + Malloc_pattern_fill_contents: boolPtr(false), + Safestack: boolPtr(false), } if runtime.GOOS == "linux" { diff --git a/apex/apex.go b/apex/apex.go index 714cf9c4c..a2a75efa0 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1885,6 +1885,8 @@ func (a *apexBundle) checkUpdatable(ctx android.ModuleContext) { if String(a.properties.Min_sdk_version) == "" { ctx.PropertyErrorf("updatable", "updatable APEXes should set min_sdk_version as well") } + + a.checkJavaStableSdkVersion(ctx) } } @@ -1954,7 +1956,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.checkApexAvailability(ctx) a.checkUpdatable(ctx) - a.collectDepsInfo(ctx) handleSpecialLibs := !android.Bool(a.properties.Ignore_system_library_special_case) @@ -2082,13 +2083,13 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // We do not add this variation to `filesInfo`, as it has no output; // however, we do add the other variations of this module as indirect // dependencies (see below). - return true } else { // Single-output test module (where `test_per_src: false`). af := apexFileForExecutable(ctx, ccTest) af.class = nativeTest filesInfo = append(filesInfo, af) } + return true // track transitive dependencies } else { ctx.PropertyErrorf("tests", "%q is not a cc module", depName) } @@ -2274,6 +2275,23 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.buildApexDependencyInfo(ctx) } +// Enforce that Java deps of the apex are using stable SDKs to compile +func (a *apexBundle) checkJavaStableSdkVersion(ctx android.ModuleContext) { + // Visit direct deps only. As long as we guarantee top-level deps are using + // stable SDKs, java's checkLinkType guarantees correct usage for transitive deps + ctx.VisitDirectDepsBlueprint(func(module blueprint.Module) { + tag := ctx.OtherModuleDependencyTag(module) + switch tag { + case javaLibTag, androidAppTag: + if m, ok := module.(interface{ CheckStableSdkVersion() error }); ok { + if err := m.CheckStableSdkVersion(); err != nil { + ctx.ModuleErrorf("cannot depend on \"%v\": %v", ctx.OtherModuleName(module), err) + } + } + } + }) +} + func whitelistedApexAvailable(apex, moduleName string) bool { key := apex moduleName = normalizeModuleName(moduleName) diff --git a/apex/apex_test.go b/apex/apex_test.go index dea7a087e..d30b4292b 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -1411,6 +1411,122 @@ func TestInvalidMinSdkVersion(t *testing.T) { `) } +func TestJavaStableSdkVersion(t *testing.T) { + testCases := []struct { + name string + expectedError string + bp string + }{ + { + name: "Non-updatable apex with non-stable dep", + bp: ` + apex { + name: "myapex", + java_libs: ["myjar"], + key: "myapex.key", + } + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "core_platform", + apex_available: ["myapex"], + } + `, + }, + { + name: "Updatable apex with stable dep", + bp: ` + apex { + name: "myapex", + java_libs: ["myjar"], + key: "myapex.key", + updatable: true, + min_sdk_version: "29", + } + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "current", + apex_available: ["myapex"], + } + `, + }, + { + name: "Updatable apex with non-stable dep", + expectedError: "cannot depend on \"myjar\"", + bp: ` + apex { + name: "myapex", + java_libs: ["myjar"], + key: "myapex.key", + updatable: true, + } + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "core_platform", + apex_available: ["myapex"], + } + `, + }, + { + name: "Updatable apex with non-stable transitive dep", + expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against non-public Android API.", + bp: ` + apex { + name: "myapex", + java_libs: ["myjar"], + key: "myapex.key", + updatable: true, + } + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + java_library { + name: "myjar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "current", + apex_available: ["myapex"], + static_libs: ["transitive-jar"], + } + java_library { + name: "transitive-jar", + srcs: ["foo/bar/MyClass.java"], + sdk_version: "core_platform", + apex_available: ["myapex"], + } + `, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + if test.expectedError == "" { + testApex(t, test.bp) + } else { + testApexError(t, test.expectedError, test.bp) + } + }) + } +} + func TestFilesInSubDir(t *testing.T) { ctx, _ := testApex(t, ` apex { @@ -3145,11 +3261,19 @@ func TestApexWithTests(t *testing.T) { gtest: false, srcs: ["mytest.cpp"], relative_install_path: "test", + shared_libs: ["mylib"], system_shared_libs: [], static_executable: true, stl: "none", } + cc_library { + name: "mylib", + srcs: ["mylib.cpp"], + system_shared_libs: [], + stl: "none", + } + cc_test { name: "mytests", gtest: false, @@ -3169,8 +3293,9 @@ func TestApexWithTests(t *testing.T) { apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] - // Ensure that test dep is copied into apex. + // Ensure that test dep (and their transitive dependencies) are copied into apex. ensureContains(t, copyCmds, "image.apex/bin/test/mytest") + ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") // Ensure that test deps built with `test_per_src` are copied into apex. ensureContains(t, copyCmds, "image.apex/bin/test/mytest1") @@ -4449,6 +4574,7 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { java_library { name: "some-updatable-apex-lib", srcs: ["a.java"], + sdk_version: "current", apex_available: [ "some-updatable-apex", ], @@ -4465,12 +4591,14 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { java_library { name: "some-platform-lib", srcs: ["a.java"], + sdk_version: "current", installable: true, } java_library { name: "some-art-lib", srcs: ["a.java"], + sdk_version: "current", apex_available: [ "com.android.art.something", ], @@ -4517,68 +4645,68 @@ func TestNoUpdatableJarsInBootImage(t *testing.T) { // updatable jar from ART apex in the ART boot image => ok transform = func(config *dexpreopt.GlobalConfig) { - config.ArtApexJars = []string{"some-art-lib"} + config.ArtApexJars = []string{"com.android.art.something:some-art-lib"} } testNoUpdatableJarsInBootImage(t, "", bp, transform) // updatable jar from ART apex in the framework boot image => error error = "module 'some-art-lib' from updatable apex 'com.android.art.something' is not allowed in the framework boot image" transform = func(config *dexpreopt.GlobalConfig) { - config.BootJars = []string{"some-art-lib"} + config.BootJars = []string{"com.android.art.something:some-art-lib"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // updatable jar from some other apex in the ART boot image => error error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the ART boot image" transform = func(config *dexpreopt.GlobalConfig) { - config.ArtApexJars = []string{"some-updatable-apex-lib"} + config.ArtApexJars = []string{"some-updatable-apex:some-updatable-apex-lib"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // non-updatable jar from some other apex in the ART boot image => error error = "module 'some-non-updatable-apex-lib' is not allowed in the ART boot image" transform = func(config *dexpreopt.GlobalConfig) { - config.ArtApexJars = []string{"some-non-updatable-apex-lib"} + config.ArtApexJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // updatable jar from some other apex in the framework boot image => error error = "module 'some-updatable-apex-lib' from updatable apex 'some-updatable-apex' is not allowed in the framework boot image" transform = func(config *dexpreopt.GlobalConfig) { - config.BootJars = []string{"some-updatable-apex-lib"} + config.BootJars = []string{"some-updatable-apex:some-updatable-apex-lib"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // non-updatable jar from some other apex in the framework boot image => ok transform = func(config *dexpreopt.GlobalConfig) { - config.BootJars = []string{"some-non-updatable-apex-lib"} + config.BootJars = []string{"some-non-updatable-apex:some-non-updatable-apex-lib"} } testNoUpdatableJarsInBootImage(t, "", bp, transform) // nonexistent jar in the ART boot image => error error = "failed to find a dex jar path for module 'nonexistent'" transform = func(config *dexpreopt.GlobalConfig) { - config.ArtApexJars = []string{"nonexistent"} + config.ArtApexJars = []string{"platform:nonexistent"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // nonexistent jar in the framework boot image => error error = "failed to find a dex jar path for module 'nonexistent'" transform = func(config *dexpreopt.GlobalConfig) { - config.BootJars = []string{"nonexistent"} + config.BootJars = []string{"platform:nonexistent"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // platform jar in the ART boot image => error error = "module 'some-platform-lib' is not allowed in the ART boot image" transform = func(config *dexpreopt.GlobalConfig) { - config.ArtApexJars = []string{"some-platform-lib"} + config.ArtApexJars = []string{"platform:some-platform-lib"} } testNoUpdatableJarsInBootImage(t, error, bp, transform) // platform jar in the framework boot image => ok transform = func(config *dexpreopt.GlobalConfig) { - config.BootJars = []string{"some-platform-lib"} + config.BootJars = []string{"platform:some-platform-lib"} } testNoUpdatableJarsInBootImage(t, "", bp, transform) } diff --git a/apex/vndk.go b/apex/vndk.go index f948d7608..5cc0e2a43 100644 --- a/apex/vndk.go +++ b/apex/vndk.go @@ -154,10 +154,12 @@ func makeCompatSymlinks(name string, ctx android.ModuleContext) (symlinks []stri // TODO(b/124106384): Clean up compat symlinks for ART binaries. if strings.HasPrefix(name, "com.android.art.") { - artBinaries := []string{"dalvikvm", "dex2oat"} - for _, b := range artBinaries { - addSymlink("/apex/com.android.art/bin/"+b, "$(TARGET_OUT)/bin", b) + addSymlink("/apex/com.android.art/bin/dalvikvm", "$(TARGET_OUT)/bin", "dalvikvm") + dex2oat := "dex2oat32" + if ctx.Config().Android64() { + dex2oat = "dex2oat64" } + addSymlink("/apex/com.android.art/bin/"+dex2oat, "$(TARGET_OUT)/bin", "dex2oat") return } return diff --git a/cc/config/clang.go b/cc/config/clang.go index bdd9030f4..24dc6b932 100644 --- a/cc/config/clang.go +++ b/cc/config/clang.go @@ -48,6 +48,8 @@ var ClangUnknownCflags = sorted([]string{ "-Wunused-but-set-parameter", "-Wunused-but-set-variable", "-fdiagnostics-color", + // http://b/153759688 + "-fuse-init-array", // arm + arm64 "-fgcse-after-reload", @@ -113,9 +115,6 @@ func init() { // color codes if it is not running in a terminal. "-fcolor-diagnostics", - // http://b/68236239 Allow 0/NULL instead of using nullptr everywhere. - "-Wno-zero-as-null-pointer-constant", - // Warnings from clang-7.0 "-Wno-sign-compare", @@ -166,6 +165,17 @@ func init() { "-Wno-int-in-bool-context", // http://b/148287349 "-Wno-sizeof-array-div", // http://b/148815709 "-Wno-tautological-overlap-compare", // http://b/148815696 + // New warnings to be fixed after clang-r383902. + "-Wno-deprecated-copy", // http://b/153746672 + "-Wno-range-loop-construct", // http://b/153747076 + "-Wno-misleading-indentation", // http://b/153746954 + "-Wno-zero-as-null-pointer-constant", // http://b/68236239 + "-Wno-deprecated-anon-enum-enum-conversion", // http://b/153746485 + "-Wno-deprecated-enum-enum-conversion", // http://b/153746563 + "-Wno-string-compare", // http://b/153764102 + "-Wno-enum-enum-conversion", // http://b/154138986 + "-Wno-enum-float-conversion", // http://b/154255917 + "-Wno-pessimizing-move", // http://b/154270751 }, " ")) // Extra cflags for external third-party projects to disable warnings that diff --git a/cc/config/global.go b/cc/config/global.go index f9255be24..923dd2956 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -128,8 +128,8 @@ var ( // prebuilts/clang default settings. ClangDefaultBase = "prebuilts/clang/host" - ClangDefaultVersion = "clang-r377782d" - ClangDefaultShortVersion = "10.0.6" + ClangDefaultVersion = "clang-r383902" + ClangDefaultShortVersion = "11.0.1" // Directories with warnings from Android.bp files. WarningAllowedProjects = []string{ diff --git a/cc/fuzz.go b/cc/fuzz.go index ebe42524a..948595bb2 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -126,7 +126,7 @@ func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags { func collectAllSharedDependencies(ctx android.SingletonContext, module android.Module) android.Paths { var fringe []android.Module - seen := make(map[android.Module]bool) + seen := make(map[string]bool) // Enumerate the first level of dependencies, as we discard all non-library // modules in the BFS loop below. @@ -140,15 +140,15 @@ func collectAllSharedDependencies(ctx android.SingletonContext, module android.M for i := 0; i < len(fringe); i++ { module := fringe[i] - if seen[module] { + if seen[module.Name()] { continue } - seen[module] = true + seen[module.Name()] = true ccModule := module.(*Module) sharedLibraries = append(sharedLibraries, ccModule.UnstrippedOutputFile()) ctx.VisitDirectDeps(module, func(dep android.Module) { - if isValidSharedDependency(dep) && !seen[dep] { + if isValidSharedDependency(dep) && !seen[dep.Name()] { fringe = append(fringe, dep) } }) @@ -255,13 +255,13 @@ func (fuzz *fuzzBinary) install(ctx ModuleContext, file android.Path) { } // Grab the list of required shared libraries. - seen := make(map[android.Module]bool) + seen := make(map[string]bool) var sharedLibraries android.Paths ctx.WalkDeps(func(child, parent android.Module) bool { - if seen[child] { + if seen[child.Name()] { return false } - seen[child] = true + seen[child.Name()] = true if isValidSharedDependency(child) { sharedLibraries = append(sharedLibraries, child.(*Module).UnstrippedOutputFile()) diff --git a/cc/sanitize.go b/cc/sanitize.go index d32efda43..3412c9b21 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -1041,7 +1041,7 @@ func sanitizerMutator(t sanitizerType) func(android.BottomUpMutatorContext) { } // Export the static lib name to make - if c.static() { + if c.static() && c.ExportedToMake() { if t == cfi { appendStringSync(c.Name(), cfiStaticLibs(mctx.Config()), &cfiStaticLibsMutex) } else if t == hwasan { diff --git a/cc/tidy.go b/cc/tidy.go index cfb5b6886..364e56c5d 100644 --- a/cc/tidy.go +++ b/cc/tidy.go @@ -121,6 +121,12 @@ func (tidy *tidyFeature) flags(ctx ModuleContext, flags Flags) Flags { // many local projects enable cert-* checks, which // trigger bugprone-reserved-identifier. tidyChecks = tidyChecks + ",-bugprone-reserved-identifier*,-cert-dcl51-cpp,-cert-dcl37-c" + // http://b/153757728 + tidyChecks = tidyChecks + ",-readability-qualified-auto" + // http://b/155034563 + tidyChecks = tidyChecks + ",-bugprone-signed-char-misuse" + // http://b/155034972 + tidyChecks = tidyChecks + ",-bugprone-branch-clone" flags.TidyFlags = append(flags.TidyFlags, tidyChecks) if len(tidy.Properties.Tidy_checks_as_errors) > 0 { diff --git a/dexpreopt/dexpreopt.go b/dexpreopt/dexpreopt.go index f984966b4..f1dde9c22 100644 --- a/dexpreopt/dexpreopt.go +++ b/dexpreopt/dexpreopt.go @@ -82,7 +82,7 @@ func GenerateDexpreoptRule(ctx android.PathContext, globalSoong *GlobalSoongConf if !dexpreoptDisabled(ctx, global, module) { // Don't preopt individual boot jars, they will be preopted together. - if !contains(global.BootJars, module.Name) { + if !contains(android.GetJarsFromApexJarPairs(global.BootJars), module.Name) { appImage := (generateProfile || module.ForceCreateAppImage || global.DefaultAppImages) && !module.NoCreateAppImage @@ -113,7 +113,7 @@ func dexpreoptDisabled(ctx android.PathContext, global *GlobalConfig, module *Mo // Also preopt system server jars since selinux prevents system server from loading anything from // /data. If we don't do this they will need to be extracted which is not favorable for RAM usage // or performance. If PreoptExtractedApk is true, we ignore the only preopt boot image options. - if global.OnlyPreoptBootImageAndSystemServer && !contains(global.BootJars, module.Name) && + if global.OnlyPreoptBootImageAndSystemServer && !contains(android.GetJarsFromApexJarPairs(global.BootJars), module.Name) && !contains(global.SystemServerJars, module.Name) && !module.PreoptExtractedApk { return true } @@ -566,15 +566,6 @@ func GetJarLocationFromApexJarPair(apexJarValue string) string { return filepath.Join("/apex", apex, "javalib", jar+".jar") } -func GetJarsFromApexJarPairs(apexJarPairs []string) []string { - modules := make([]string, len(apexJarPairs)) - for i, p := range apexJarPairs { - _, jar := android.SplitApexJarPair(p) - modules[i] = jar - } - return modules -} - var nonUpdatableSystemServerJarsKey = android.NewOnceKey("nonUpdatableSystemServerJars") // TODO: eliminate the superficial global config parameter by moving global config definition @@ -582,7 +573,7 @@ var nonUpdatableSystemServerJarsKey = android.NewOnceKey("nonUpdatableSystemServ func NonUpdatableSystemServerJars(ctx android.PathContext, global *GlobalConfig) []string { return ctx.Config().Once(nonUpdatableSystemServerJarsKey, func() interface{} { return android.RemoveListFromList(global.SystemServerJars, - GetJarsFromApexJarPairs(global.UpdatableSystemServerJars)) + android.GetJarsFromApexJarPairs(global.UpdatableSystemServerJars)) }).([]string) } diff --git a/java/app.go b/java/app.go index 2fd397ae5..d535c5a67 100755 --- a/java/app.go +++ b/java/app.go @@ -580,28 +580,14 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) { // Build a final signed app package. packageFile := android.PathForModuleOut(ctx, a.installApkName+".apk") - v4SigningRequested := Bool(a.Module.deviceProperties.V4_signature) - var v4SignatureFile android.WritablePath = nil - if v4SigningRequested { - v4SignatureFile = android.PathForModuleOut(ctx, a.installApkName+".apk.idsig") - } - CreateAndSignAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates, apkDeps, v4SignatureFile) + CreateAndSignAppPackage(ctx, packageFile, a.exportPackage, jniJarFile, dexJarFile, certificates, apkDeps) a.outputFile = packageFile - if v4SigningRequested { - a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile) - } for _, split := range a.aapt.splits { // Sign the split APKs packageFile := android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk") - if v4SigningRequested { - v4SignatureFile = android.PathForModuleOut(ctx, a.installApkName+"_"+split.suffix+".apk.idsig") - } - CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps, v4SignatureFile) + CreateAndSignAppPackage(ctx, packageFile, split.path, nil, nil, certificates, apkDeps) a.extraOutputFiles = append(a.extraOutputFiles, packageFile) - if v4SigningRequested { - a.extraOutputFiles = append(a.extraOutputFiles, v4SignatureFile) - } } // Build an app bundle. @@ -1250,7 +1236,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext } a.certificate = certificates[0] signed := android.PathForModuleOut(ctx, "signed", apkFilename) - SignAppPackage(ctx, signed, dexOutput, certificates, nil) + SignAppPackage(ctx, signed, dexOutput, certificates) a.outputFile = signed } else { alignedApk := android.PathForModuleOut(ctx, "zip-aligned", apkFilename) @@ -1506,7 +1492,7 @@ func (r *RuntimeResourceOverlay) GenerateAndroidBuildActions(ctx android.ModuleC _, certificates := collectAppDeps(ctx, false, false) certificates = processMainCert(r.ModuleBase, String(r.properties.Certificate), certificates, ctx) signed := android.PathForModuleOut(ctx, "signed", r.Name()+".apk") - SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates, nil) + SignAppPackage(ctx, signed, r.aapt.exportPackage, certificates) r.certificate = certificates[0] r.outputFile = signed diff --git a/java/app_builder.go b/java/app_builder.go index b2780bc90..5e7fbe6de 100644 --- a/java/app_builder.go +++ b/java/app_builder.go @@ -45,7 +45,7 @@ var combineApk = pctx.AndroidStaticRule("combineApk", }) func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.WritablePath, - packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths, v4SignatureFile android.WritablePath) { + packageFile, jniJarFile, dexJarFile android.Path, certificates []Certificate, deps android.Paths) { unsignedApkName := strings.TrimSuffix(outputFile.Base(), ".apk") + "-unsigned.apk" unsignedApk := android.PathForModuleOut(ctx, unsignedApkName) @@ -66,10 +66,10 @@ func CreateAndSignAppPackage(ctx android.ModuleContext, outputFile android.Writa Implicits: deps, }) - SignAppPackage(ctx, outputFile, unsignedApk, certificates, v4SignatureFile) + SignAppPackage(ctx, outputFile, unsignedApk, certificates) } -func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, unsignedApk android.Path, certificates []Certificate, v4SignatureFile android.WritablePath) { +func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, unsignedApk android.Path, certificates []Certificate) { var certificateArgs []string var deps android.Paths @@ -78,22 +78,14 @@ func SignAppPackage(ctx android.ModuleContext, signedApk android.WritablePath, u deps = append(deps, c.Pem, c.Key) } - outputFiles := android.WritablePaths{signedApk} - var flag string = "" - if v4SignatureFile != nil { - outputFiles = append(outputFiles, v4SignatureFile) - flag = "--enable-v4" - } - ctx.Build(pctx, android.BuildParams{ Rule: Signapk, Description: "signapk", - Outputs: outputFiles, + Output: signedApk, Input: unsignedApk, Implicits: deps, Args: map[string]string{ "certificates": strings.Join(certificateArgs, " "), - "flags": flag, }, }) } diff --git a/java/app_test.go b/java/app_test.go index 336051095..998c76a32 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -1200,66 +1200,6 @@ func TestCertificates(t *testing.T) { } } -func TestRequestV4SigningFlag(t *testing.T) { - testCases := []struct { - name string - bp string - expected string - }{ - { - name: "default", - bp: ` - android_app { - name: "foo", - srcs: ["a.java"], - sdk_version: "current", - } - `, - expected: "", - }, - { - name: "default", - bp: ` - android_app { - name: "foo", - srcs: ["a.java"], - sdk_version: "current", - v4_signature: false, - } - `, - expected: "", - }, - { - name: "module certificate property", - bp: ` - android_app { - name: "foo", - srcs: ["a.java"], - sdk_version: "current", - v4_signature: true, - } - `, - expected: "--enable-v4", - }, - } - - for _, test := range testCases { - t.Run(test.name, func(t *testing.T) { - config := testAppConfig(nil, test.bp, nil) - ctx := testContext() - - run(t, ctx, config) - foo := ctx.ModuleForTests("foo", "android_common") - - signapk := foo.Output("foo.apk") - signFlags := signapk.Args["flags"] - if test.expected != signFlags { - t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags) - } - }) - } -} - func TestPackageNameOverride(t *testing.T) { testCases := []struct { name string diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index c3825cbc3..dffdc248f 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -113,7 +113,7 @@ func (image bootImageConfig) moduleName(idx int) string { // Dexpreopt on the boot class path produces multiple files. The first dex file // is converted into 'name'.art (to match the legacy assumption that 'name'.art // exists), and the rest are converted to 'name'-<jar>.art. - m := image.modules[idx] + _, m := android.SplitApexJarPair(image.modules[idx]) name := image.stem if idx != 0 || image.extends != nil { name += "-" + stemOf(m) @@ -261,7 +261,7 @@ func getBootImageJar(ctx android.SingletonContext, image *bootImageConfig, modul } name := ctx.ModuleName(module) - index := android.IndexList(name, image.modules) + index := android.IndexList(name, android.GetJarsFromApexJarPairs(image.modules)) if index == -1 { return -1, nil } @@ -314,13 +314,13 @@ func buildBootImage(ctx android.SingletonContext, image *bootImageConfig) *bootI // Ensure all modules were converted to paths for i := range bootDexJars { if bootDexJars[i] == nil { + _, m := android.SplitApexJarPair(image.modules[i]) if ctx.Config().AllowMissingDependencies() { - missingDeps = append(missingDeps, image.modules[i]) + missingDeps = append(missingDeps, m) bootDexJars[i] = android.PathForOutput(ctx, "missing") } else { ctx.Errorf("failed to find a dex jar path for module '%s'"+ - ", note that some jars may be filtered out by module constraints", - image.modules[i]) + ", note that some jars may be filtered out by module constraints", m) } } } @@ -614,7 +614,7 @@ func updatableBcpPackagesRule(ctx android.SingletonContext, image *bootImageConf return ctx.Config().Once(updatableBcpPackagesRuleKey, func() interface{} { global := dexpreopt.GetGlobalConfig(ctx) - updatableModules := dexpreopt.GetJarsFromApexJarPairs(global.UpdatableBootJars) + updatableModules := android.GetJarsFromApexJarPairs(global.UpdatableBootJars) // Collect `permitted_packages` for updatable boot jars. var updatablePackages []string diff --git a/java/dexpreopt_bootjars_test.go b/java/dexpreopt_bootjars_test.go index 127c20159..0946bf0a3 100644 --- a/java/dexpreopt_bootjars_test.go +++ b/java/dexpreopt_bootjars_test.go @@ -48,7 +48,7 @@ func TestDexpreoptBootJars(t *testing.T) { pathCtx := android.PathContextForTesting(config) dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx) - dexpreoptConfig.BootJars = []string{"foo", "bar", "baz"} + dexpreoptConfig.BootJars = []string{"platform:foo", "platform:bar", "platform:baz"} dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig) ctx := testContext() diff --git a/java/dexpreopt_config.go b/java/dexpreopt_config.go index 066694cc3..92c96e2e3 100644 --- a/java/dexpreopt_config.go +++ b/java/dexpreopt_config.go @@ -79,7 +79,20 @@ func stemOf(moduleName string) string { return moduleName } -func getDexLocation(ctx android.PathContext, target android.Target, subdir string, name string) string { +func getDexLocation(ctx android.PathContext, target android.Target, module string) string { + apex, jar := android.SplitApexJarPair(module) + + name := stemOf(jar) + ".jar" + + var subdir string + if apex == "platform" { + // Special apex name "platform" denotes jars do not come from an apex, but are part + // of the platform. Such jars are installed on the /system partition on device. + subdir = "system/framework" + } else { + subdir = filepath.Join("apex", apex, "javalib") + } + if target.Os.Class == android.Host { return filepath.Join(ctx.Config().Getenv("OUT_DIR"), "host", ctx.Config().PrebuiltOS(), subdir, name) } else { @@ -104,10 +117,9 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { artModules := global.ArtApexJars // With EMMA_INSTRUMENT_FRAMEWORK=true the Core libraries depend on jacoco. if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") { - artModules = append(artModules, "jacocoagent") + artModules = append(artModules, "com.android.art:jacocoagent") } - frameworkModules := android.RemoveListFromList(global.BootJars, - concat(artModules, dexpreopt.GetJarsFromApexJarPairs(global.UpdatableBootJars))) + frameworkModules := android.RemoveListFromList(global.BootJars, artModules) artSubdir := "apex/com.android.art/javalib" frameworkSubdir := "system/framework" @@ -150,7 +162,8 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { // TODO(b/143682396): use module dependencies instead inputDir := deviceDir.Join(ctx, "dex_"+c.name+"jars_input") for _, m := range c.modules { - c.dexPaths = append(c.dexPaths, inputDir.Join(ctx, stemOf(m)+".jar")) + _, jar := android.SplitApexJarPair(m) + c.dexPaths = append(c.dexPaths, inputDir.Join(ctx, stemOf(jar)+".jar")) } c.dexPathsDeps = c.dexPaths @@ -165,7 +178,7 @@ func genBootImageConfigs(ctx android.PathContext) map[string]*bootImageConfig { imagesDeps: c.moduleFiles(ctx, imageDir, ".art", ".oat", ".vdex"), } for _, m := range c.modules { - variant.dexLocations = append(variant.dexLocations, getDexLocation(ctx, target, c.installSubdir, stemOf(m)+".jar")) + variant.dexLocations = append(variant.dexLocations, getDexLocation(ctx, target, m)) } variant.dexLocationsDeps = variant.dexLocations c.variants = append(c.variants, variant) diff --git a/java/java.go b/java/java.go index f6fe76e18..f339a1a7b 100644 --- a/java/java.go +++ b/java/java.go @@ -86,6 +86,14 @@ func RegisterJavaBuildComponents(ctx android.RegistrationContext) { ctx.RegisterSingletonType("kythe_java_extract", kytheExtractJavaFactory) } +func (j *Module) CheckStableSdkVersion() error { + sdkVersion := j.sdkVersion() + if sdkVersion.stable() { + return nil + } + return fmt.Errorf("non stable SDK %v", sdkVersion) +} + func (j *Module) checkSdkVersions(ctx android.ModuleContext) { if j.SocSpecific() || j.DeviceSpecific() || (j.ProductSpecific() && ctx.Config().EnforceProductPartitionInterface()) { @@ -337,10 +345,6 @@ type CompilerDeviceProperties struct { UncompressDex bool `blueprint:"mutated"` IsSDKLibrary bool `blueprint:"mutated"` - - // If true, generate the signature file of APK Signing Scheme V4, along side the signed APK file. - // Defaults to false. - V4_signature *bool } func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool { diff --git a/java/sdk.go b/java/sdk.go index 92076f4b5..690451c60 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -169,9 +169,12 @@ func (s sdkSpec) stable() bool { return false } switch s.kind { + case sdkNone: + // there is nothing to manage and version in this case; de facto stable API. + return true case sdkCore, sdkPublic, sdkSystem, sdkModule, sdkSystemServer: return true - case sdkNone, sdkCorePlatform, sdkTest, sdkPrivate: + case sdkCorePlatform, sdkTest, sdkPrivate: return false default: panic(fmt.Errorf("unknown sdkKind=%v", s.kind)) diff --git a/rust/compiler_test.go b/rust/compiler_test.go index bbf9f8d11..bcde75795 100644 --- a/rust/compiler_test.go +++ b/rust/compiler_test.go @@ -74,3 +74,33 @@ func TestEnforceSingleSourceFile(t *testing.T) { host_supported: true, }`) } + +func TestInstallDir(t *testing.T) { + ctx := testRust(t, ` + rust_library_dylib { + name: "libfoo", + srcs: ["foo.rs"], + crate_name: "foo", + } + rust_binary { + name: "fizzbuzz", + srcs: ["foo.rs"], + }`) + + install_path_lib64 := ctx.ModuleForTests("libfoo", + "android_arm64_armv8-a_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() + install_path_lib32 := ctx.ModuleForTests("libfoo", + "android_arm_armv7-a-neon_dylib").Module().(*Module).compiler.(*libraryDecorator).path.String() + install_path_bin := ctx.ModuleForTests("fizzbuzz", + "android_arm64_armv8-a").Module().(*Module).compiler.(*binaryDecorator).path.String() + + if !strings.HasSuffix(install_path_lib64, "system/lib64/libfoo.dylib.so") { + t.Fatalf("unexpected install path for 64-bit library: %#v", install_path_lib64) + } + if !strings.HasSuffix(install_path_lib32, "system/lib/libfoo.dylib.so") { + t.Fatalf("unexpected install path for 32-bit library: %#v", install_path_lib32) + } + if !strings.HasSuffix(install_path_bin, "system/bin/fizzbuzz") { + t.Fatalf("unexpected install path for binary: %#v", install_path_bin) + } +} diff --git a/ui/build/config.go b/ui/build/config.go index 437e4412a..7fcc47199 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -517,6 +517,9 @@ func (c *configImpl) parseArgs(ctx Context, args []string) { ctx.Fatalln("Unknown option:", arg) } } else if k, v, ok := decodeKeyValue(arg); ok && len(k) > 0 { + if k == "OUT_DIR" { + ctx.Fatalln("OUT_DIR may only be set in the environment, not as a command line option.") + } c.environ.Set(k, v) } else if arg == "dist" { c.dist = true |