Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 381c2fa2 authored by Jihoon Kang's avatar Jihoon Kang
Browse files

Introduce "Exclude_static_libs" property for Java modules

Exclude_static_libs property can be used to specify static libs that
should not be used to build the module. The list acts as filter for
static_libs.

Bug: 285410821
Test: go test ./java
Change-Id: Iee7f160ba88b5f64bdd265c30d47c9f51feb0f5e
parent f508c252
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ func init() {
	AddNeverAllowRules(createProhibitFrameworkAccessRules()...)
	AddNeverAllowRules(createBp2BuildRule())
	AddNeverAllowRules(createCcStubsRule())
	AddNeverAllowRules(createJavaExcludeStaticLibsRule())
}

// Add a NeverAllow rule to the set of rules to apply.
@@ -253,6 +254,14 @@ func createProhibitFrameworkAccessRules() []Rule {
	}
}

func createJavaExcludeStaticLibsRule() Rule {
	return NeverAllow().
		NotIn("build/soong").
		ModuleType("java_library").
		WithMatcher("exclude_static_libs", isSetMatcherInstance).
		Because("exclude_static_libs property is only allowed for java modules defined in build/soong")
}

func neverallowMutator(ctx BottomUpMutatorContext) {
	m, ok := ctx.Module().(Module)
	if !ok {
+21 −3
Original line number Diff line number Diff line
@@ -344,6 +344,23 @@ var neverallowTests = []struct {
			`module "outside_allowed_list": violates neverallow`,
		},
	},
	// Test for the rule restricting use of exclude_static_libs
	{
		name: `"exclude_static_libs" outside allowed directory`,
		fs: map[string][]byte{
			"a/b/Android.bp": []byte(`
				java_library {
					name: "baz",
					exclude_static_libs: [
						"bar",
					],
				}
			`),
		},
		expectedErrors: []string{
			`exclude_static_libs property is only allowed for java modules defined in build/soong`,
		},
	},
}

var prepareForNeverAllowTest = GroupFixturePreparers(
@@ -433,6 +450,7 @@ type mockJavaLibraryProperties struct {
	Libs                []string
	Sdk_version         *string
	Uncompress_dex      *bool
	Exclude_static_libs []string
}

type mockJavaLibraryModule struct {
+5 −0
Original line number Diff line number Diff line
@@ -79,6 +79,9 @@ type CommonProperties struct {
	// list of java libraries that will be compiled into the resulting jar
	Static_libs []string `android:"arch_variant"`

	// list of java libraries that should not be used to build this module
	Exclude_static_libs []string `android:"arch_variant"`

	// manifest file to be included in resulting jar
	Manifest *string `android:"path"`

@@ -724,6 +727,8 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) {
	}

	libDeps := ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)

	j.properties.Static_libs = android.RemoveListFromList(j.properties.Static_libs, j.properties.Exclude_static_libs)
	ctx.AddVariationDependencies(nil, staticLibTag, j.properties.Static_libs...)

	// Add dependency on libraries that provide additional hidden api annotations.
+31 −0
Original line number Diff line number Diff line
@@ -2322,3 +2322,34 @@ java_test_host {
		t.Errorf("Expected args[\"extraTestRunnerConfigs\"] to equal %q, was %q", expected, args["extraTestRunnerConfigs"])
	}
}

func TestJavaExcludeStaticLib(t *testing.T) {
	ctx, _ := testJava(t, `
	java_library {
		name: "bar",
	}
	java_library {
		name: "foo",
	}
	java_library {
		name: "baz",
		static_libs: [
			"foo",
			"bar",
		],
		exclude_static_libs: [
			"bar",
		],
	}
	`)

	// "bar" not included as dependency of "baz"
	CheckModuleDependencies(t, ctx, "baz", "android_common", []string{
		`core-lambda-stubs`,
		`ext`,
		`foo`,
		`framework`,
		`stable-core-platform-api-stubs-system-modules`,
		`stable.core.platform.api.stubs`,
	})
}