diff options
| -rw-r--r-- | android/api_levels.go | 1 | ||||
| -rw-r--r-- | android/neverallow.go | 80 | ||||
| -rw-r--r-- | android/neverallow_test.go | 50 | ||||
| -rw-r--r-- | cc/config/clang.go | 14 | ||||
| -rw-r--r-- | cc/sanitize.go | 3 | ||||
| -rw-r--r-- | cmd/soong_ui/main.go | 19 | ||||
| -rw-r--r-- | java/config/config.go | 3 | ||||
| -rw-r--r-- | java/java_test.go | 2 | ||||
| -rw-r--r-- | java/robolectric.go | 69 | ||||
| -rw-r--r-- | java/testing.go | 1 |
10 files changed, 123 insertions, 119 deletions
diff --git a/android/api_levels.go b/android/api_levels.go index 961685aa8..4f6efee70 100644 --- a/android/api_levels.go +++ b/android/api_levels.go @@ -71,6 +71,7 @@ func getApiLevelsMap(config Config) map[string]int { "O": 26, "O-MR1": 27, "P": 28, + "Q": 29, } for i, codename := range config.PlatformVersionCombinedCodenames() { apiLevelsMap[codename] = baseApiLevel + i diff --git a/android/neverallow.go b/android/neverallow.go index 23b645413..ad1d5bd23 100644 --- a/android/neverallow.go +++ b/android/neverallow.go @@ -48,9 +48,9 @@ func registerNeverallowMutator(ctx RegisterMutatorsContext) { var neverallows = []Rule{} func init() { - AddNeverAllowRules(createIncludeDirsRules()...) AddNeverAllowRules(createTrebleRules()...) AddNeverAllowRules(createLibcoreRules()...) + AddNeverAllowRules(createMediaRules()...) AddNeverAllowRules(createJavaDeviceForHostRules()...) } @@ -59,42 +59,6 @@ func AddNeverAllowRules(rules ...Rule) { neverallows = append(neverallows, rules...) } -func createIncludeDirsRules() []Rule { - // The list of paths that cannot be referenced using include_dirs - paths := []string{ - "art", - "libcore", - "libnativehelper", - "external/apache-harmony", - "external/apache-xml", - "external/boringssl", - "external/bouncycastle", - "external/conscrypt", - "external/icu", - "external/okhttp", - "external/vixl", - "external/wycheproof", - "system/core/libnativebridge", - "system/core/libnativehelper", - } - - // Create a composite matcher that will match if the value starts with any of the restricted - // paths. A / is appended to the prefix to ensure that restricting path X does not affect paths - // XY. - rules := make([]Rule, 0, len(paths)) - for _, path := range paths { - rule := - NeverAllow(). - WithMatcher("include_dirs", StartsWith(path+"/")). - Because("include_dirs is deprecated, all usages of '" + path + "' have been migrated" + - " to use alternate mechanisms and so can no longer be used.") - - rules = append(rules, rule) - } - - return rules -} - func createTrebleRules() []Rule { return []Rule{ NeverAllow(). @@ -110,7 +74,7 @@ func createTrebleRules() []Rule { // TODO(b/67974785): always enforce the manifest NeverAllow(). - Without("name", "libhidltransport"). + Without("name", "libhidltransport-impl-internal"). With("product_variables.enforce_vintf_manifest.cflags", "*"). Because("manifest enforcement should be independent of ."), @@ -151,6 +115,14 @@ func createLibcoreRules() []Rule { return rules } +func createMediaRules() []Rule { + return []Rule{ + NeverAllow(). + With("libs", "updatable-media"). + Because("updatable-media includes private APIs. Use updatable_media_stubs instead."), + } +} + func createJavaDeviceForHostRules() []Rule { javaDeviceForHostProjectsWhitelist := []string{ "external/guava", @@ -223,18 +195,6 @@ func (m *anyMatcher) String() string { var anyMatcherInstance = &anyMatcher{} -type startsWithMatcher struct { - prefix string -} - -func (m *startsWithMatcher) test(value string) bool { - return strings.HasPrefix(value, m.prefix) -} - -func (m *startsWithMatcher) String() string { - return ".starts-with(" + m.prefix + ")" -} - type ruleProperty struct { fields []string // e.x.: Vndk.Enabled matcher ValueMatcher @@ -252,12 +212,8 @@ type Rule interface { With(properties, value string) Rule - WithMatcher(properties string, matcher ValueMatcher) Rule - Without(properties, value string) Rule - WithoutMatcher(properties string, matcher ValueMatcher) Rule - Because(reason string) Rule } @@ -301,25 +257,17 @@ func (r *rule) NotModuleType(types ...string) Rule { } func (r *rule) With(properties, value string) Rule { - return r.WithMatcher(properties, selectMatcher(value)) -} - -func (r *rule) WithMatcher(properties string, matcher ValueMatcher) Rule { r.props = append(r.props, ruleProperty{ fields: fieldNamesForProperties(properties), - matcher: matcher, + matcher: selectMatcher(value), }) return r } func (r *rule) Without(properties, value string) Rule { - return r.WithoutMatcher(properties, selectMatcher(value)) -} - -func (r *rule) WithoutMatcher(properties string, matcher ValueMatcher) Rule { r.unlessProps = append(r.unlessProps, ruleProperty{ fields: fieldNamesForProperties(properties), - matcher: matcher, + matcher: selectMatcher(value), }) return r } @@ -378,10 +326,6 @@ func (r *rule) appliesToProperties(properties []interface{}) bool { return includeProps && !excludeProps } -func StartsWith(prefix string) ValueMatcher { - return &startsWithMatcher{prefix} -} - // assorted utils func cleanPaths(paths []string) []string { diff --git a/android/neverallow_test.go b/android/neverallow_test.go index 02b436211..17e40f0bd 100644 --- a/android/neverallow_test.go +++ b/android/neverallow_test.go @@ -23,29 +23,6 @@ var neverallowTests = []struct { fs map[string][]byte expectedError string }{ - // include_dir rule tests - { - name: "include_dir not allowed to reference art", - fs: map[string][]byte{ - "other/Blueprints": []byte(` - cc_library { - name: "libother", - include_dirs: ["art/libdexfile/include"], - }`), - }, - expectedError: "all usages of 'art' have been migrated", - }, - { - name: "include_dir can reference another location", - fs: map[string][]byte{ - "other/Blueprints": []byte(` - cc_library { - name: "libother", - include_dirs: ["another/include"], - }`), - }, - }, - // Treble rule tests { name: "no vndk.enabled under vendor directory", fs: map[string][]byte{ @@ -112,21 +89,6 @@ var neverallowTests = []struct { }, expectedError: "manifest enforcement should be independent", }, - { - name: "libhidltransport enforce_vintf_manifest.cflags", - fs: map[string][]byte{ - "Blueprints": []byte(` - cc_library { - name: "libhidltransport", - product_variables: { - enforce_vintf_manifest: { - cflags: ["-DSHOULD_NOT_EXIST"], - }, - }, - }`), - }, - expectedError: "", - }, { name: "no treble_linker_namespaces.cflags", @@ -159,6 +121,17 @@ var neverallowTests = []struct { expectedError: "", }, { + name: "dependency on updatable-media", + fs: map[string][]byte{ + "Blueprints": []byte(` + java_library { + name: "needs_updatable_media", + libs: ["updatable-media"], + }`), + }, + expectedError: "updatable-media includes private APIs. Use updatable_media_stubs instead.", + }, + { name: "java_device_for_host", fs: map[string][]byte{ "Blueprints": []byte(` @@ -240,7 +213,6 @@ func testNeverallow(t *testing.T, config Config, fs map[string][]byte) (*TestCon } type mockCcLibraryProperties struct { - Include_dirs []string Vendor_available *bool Vndk struct { diff --git a/cc/config/clang.go b/cc/config/clang.go index 47b60e713..59c78a620 100644 --- a/cc/config/clang.go +++ b/cc/config/clang.go @@ -101,9 +101,8 @@ func init() { // not emit the table by default on Android since NDK still uses GNU binutils. "-faddrsig", - // Make implicit fallthrough an error in the future. + // -Wimplicit-fallthrough is not enabled by -Wall. "-Wimplicit-fallthrough", - "-Wno-error=implicit-fallthrough", // Help catch common 32/64-bit errors. "-Werror=int-conversion", @@ -171,11 +170,6 @@ func init() { "-Wno-tautological-unsigned-enum-zero-compare", "-Wno-tautological-unsigned-zero-compare", - // http://b/72330874 Disable -Wenum-compare until the instances detected by this new - // warning are fixed. - "-Wno-enum-compare", - "-Wno-enum-compare-switch", - // Disable c++98-specific warning since Android is not concerned with C++98 // compatibility. "-Wno-c++98-compat-extra-semi", @@ -184,9 +178,11 @@ func init() { "-Wno-return-std-move-in-c++11", }, " ")) - // Extra cflags for projects under external/ directory + // Extra cflags for projects under external/ directory to disable warnings that are infeasible + // to fix in all the external projects and their upstream repos. pctx.StaticVariable("ClangExtraExternalCflags", strings.Join([]string{ - // TODO(yikong): Move -Wno flags here + "-Wno-enum-compare", + "-Wno-enum-compare-switch", // http://b/72331524 Allow null pointer arithmetic until the instances detected by // this new warning are fixed. diff --git a/cc/sanitize.go b/cc/sanitize.go index c59f53a04..2f5e4d8a0 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -58,7 +58,8 @@ var ( minimalRuntimeFlags = []string{"-fsanitize-minimal-runtime", "-fno-sanitize-trap=integer,undefined", "-fno-sanitize-recover=integer,undefined"} - hwasanGlobalOptions = []string{"heap_history_size=1023,stack_history_size=512"} + hwasanGlobalOptions = []string{"heap_history_size=1023", "stack_history_size=512", + "export_memory_stats=0", "max_malloc_fill_size=0"} ) type sanitizerType int diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go index 0eaed76ce..87347111f 100644 --- a/cmd/soong_ui/main.go +++ b/cmd/soong_ui/main.go @@ -180,6 +180,11 @@ func main() { } } + // Fix up the source tree due to a repo bug where it doesn't remove + // linkfiles that have been removed + fixBadDanglingLink(buildCtx, "hardware/qcom/sdm710/Android.bp") + fixBadDanglingLink(buildCtx, "hardware/qcom/sdm710/Android.mk") + f := build.NewSourceFinder(buildCtx, config) defer f.Shutdown() build.FindSources(buildCtx, config, f) @@ -187,6 +192,20 @@ func main() { c.run(buildCtx, config, args, logsDir) } +func fixBadDanglingLink(ctx build.Context, name string) { + _, err := os.Lstat(name) + if err != nil { + return + } + _, err = os.Stat(name) + if os.IsNotExist(err) { + err = os.Remove(name) + if err != nil { + ctx.Fatalf("Failed to remove dangling link %q: %v", name, err) + } + } +} + func dumpVar(ctx build.Context, config build.Config, args []string, _ string) { flags := flag.NewFlagSet("dumpvar", flag.ExitOnError) flags.Usage = func() { diff --git a/java/config/config.go b/java/config/config.go index d017ae67f..470ce2bbc 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -29,7 +29,7 @@ var ( DefaultBootclasspathLibraries = []string{"core.platform.api.stubs", "core-lambda-stubs"} DefaultSystemModules = "core-platform-api-stubs-system-modules" - DefaultLibraries = []string{"ext", "framework"} + DefaultLibraries = []string{"ext", "framework", "updatable_media_stubs"} DefaultLambdaStubsLibrary = "core-lambda-stubs" SdkLambdaStubsPath = "prebuilts/sdk/tools/core-lambda-stubs.jar" @@ -44,6 +44,7 @@ var ( "conscrypt", "core-oj", "core-libart", + "updatable-media", } ) diff --git a/java/java_test.go b/java/java_test.go index 4c85bed99..cdfe4a998 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -1085,7 +1085,7 @@ func TestPatchModule(t *testing.T) { checkPatchModuleFlag(t, ctx, "foo", "") expected := "java.base=.:" + buildDir checkPatchModuleFlag(t, ctx, "bar", expected) - expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework")}, ":") + expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework"), moduleToPath("updatable_media_stubs")}, ":") checkPatchModuleFlag(t, ctx, "baz", expected) }) } diff --git a/java/robolectric.go b/java/robolectric.go index 1de56a5cd..cbe3557bc 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -34,10 +34,17 @@ var robolectricDefaultLibs = []string{ "truth-prebuilt", } +var ( + roboCoverageLibsTag = dependencyTag{name: "roboSrcs"} +) + type robolectricProperties struct { // The name of the android_app module that the tests will run against. Instrumentation_for *string + // Additional libraries for which coverage data should be generated + Coverage_libs []string + Test_options struct { // Timeout in seconds when running the tests. Timeout *int64 @@ -54,6 +61,8 @@ type robolectricTest struct { libs []string tests []string + + roboSrcJar android.Path } func (r *robolectricTest) DepsMutator(ctx android.BottomUpMutatorContext) { @@ -66,11 +75,35 @@ func (r *robolectricTest) DepsMutator(ctx android.BottomUpMutatorContext) { } ctx.AddVariationDependencies(nil, libTag, robolectricDefaultLibs...) + + ctx.AddVariationDependencies(nil, roboCoverageLibsTag, r.robolectricProperties.Coverage_libs...) } func (r *robolectricTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { + roboTestConfig := android.PathForModuleGen(ctx, "robolectric"). + Join(ctx, "com/android/tools/test_config.properties") + + // TODO: this inserts paths to built files into the test, it should really be inserting the contents. + instrumented := ctx.GetDirectDepsWithTag(instrumentationForTag) + + if len(instrumented) != 1 { + panic(fmt.Errorf("expected exactly 1 instrumented dependency, got %d", len(instrumented))) + } + + instrumentedApp, ok := instrumented[0].(*AndroidApp) + if !ok { + ctx.PropertyErrorf("instrumentation_for", "dependency must be an android_app") + } + + generateRoboTestConfig(ctx, roboTestConfig, instrumentedApp) + r.extraResources = android.Paths{roboTestConfig} + r.Library.GenerateAndroidBuildActions(ctx) + roboSrcJar := android.PathForModuleGen(ctx, "robolectric", ctx.ModuleName()+".srcjar") + r.generateRoboSrcJar(ctx, roboSrcJar, instrumentedApp) + r.roboSrcJar = roboSrcJar + for _, dep := range ctx.GetDirectDepsWithTag(libTag) { r.libs = append(r.libs, ctx.OtherModuleName(dep)) } @@ -109,6 +142,41 @@ func shardTests(paths []string, shards int) [][]string { return ret } +func generateRoboTestConfig(ctx android.ModuleContext, outputFile android.WritablePath, instrumentedApp *AndroidApp) { + manifest := instrumentedApp.mergedManifestFile + resourceApk := instrumentedApp.outputFile + + rule := android.NewRuleBuilder() + + rule.Command().Text("rm -f").Output(outputFile) + rule.Command(). + Textf(`echo "android_merged_manifest=%s" >>`, manifest.String()).Output(outputFile).Text("&&"). + Textf(`echo "android_resource_apk=%s" >>`, resourceApk.String()).Output(outputFile). + // Make it depend on the files to which it points so the test file's timestamp is updated whenever the + // contents change + Implicit(manifest). + Implicit(resourceApk) + + rule.Build(pctx, ctx, "generate_test_config", "generate test_config.properties") +} + +func (r *robolectricTest) generateRoboSrcJar(ctx android.ModuleContext, outputFile android.WritablePath, + instrumentedApp *AndroidApp) { + + srcJarArgs := copyOf(instrumentedApp.srcJarArgs) + srcJarDeps := append(android.Paths(nil), instrumentedApp.srcJarDeps...) + + for _, m := range ctx.GetDirectDepsWithTag(roboCoverageLibsTag) { + if dep, ok := m.(Dependency); ok { + depSrcJarArgs, depSrcJarDeps := dep.SrcJarArgs() + srcJarArgs = append(srcJarArgs, depSrcJarArgs...) + srcJarDeps = append(srcJarDeps, depSrcJarDeps...) + } + } + + TransformResourcesToJar(ctx, outputFile, srcJarArgs, srcJarDeps) +} + func (r *robolectricTest) AndroidMk() android.AndroidMkData { data := r.Library.AndroidMk() @@ -144,6 +212,7 @@ func (r *robolectricTest) writeTestRunner(w io.Writer, module, name string, test fmt.Fprintln(w, "LOCAL_JAVA_LIBRARIES :=", module) fmt.Fprintln(w, "LOCAL_JAVA_LIBRARIES += ", strings.Join(r.libs, " ")) fmt.Fprintln(w, "LOCAL_TEST_PACKAGE :=", String(r.robolectricProperties.Instrumentation_for)) + fmt.Fprintln(w, "LOCAL_INSTRUMENT_SRCJARS :=", r.roboSrcJar.String()) fmt.Fprintln(w, "LOCAL_ROBOTEST_FILES :=", strings.Join(tests, " ")) if t := r.robolectricProperties.Test_options.Timeout; t != nil { fmt.Fprintln(w, "LOCAL_ROBOTEST_TIMEOUT :=", *t) diff --git a/java/testing.go b/java/testing.go index 5d116a787..a37c0a9dc 100644 --- a/java/testing.go +++ b/java/testing.go @@ -38,6 +38,7 @@ func GatherRequiredDepsForTest() string { extraModules := []string{ "core-lambda-stubs", "ext", + "updatable_media_stubs", "android_stubs_current", "android_system_stubs_current", "android_test_stubs_current", |