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

Commit 8a49643e authored by Spandan Das's avatar Spandan Das
Browse files

Use a partition packaging spec filter for android_filesystem

This revives https://r.android.com/3308803. The use case for this filter
is
1. To remove the transitive shared library dependencies of `system_ext`
   binaries that are intended to be installed in `system`. Without this
   filter, we get two copies of libc.so, libz.so, ... on device
2. To filter out dexpreopt files of apps. Even if an app is installed in
   `/system_ext`, its dexpreopt files will be installed in
   `system_other`. Kati allows this by allowing ctx.InstallFile to
   specify the path relative to device root.

Diff in autogenerated `system_ext` partition for aosp cf before and
after this CL https://diff.googleplex.com/#key=6ekb09PtreNh

Test: go test ./filesystem
Bug: 372487849
Change-Id: Ie52723be2469d3b210ee1ebb62997d378d44788b
parent d9875bc1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@ func (f *filesystem) partitionName() string {
func (f *filesystem) filterInstallablePackagingSpec(ps android.PackagingSpec) bool {
	// Filesystem module respects the installation semantic. A PackagingSpec from a module with
	// IsSkipInstall() is skipped.
	return !ps.SkipInstall()
	return !ps.SkipInstall() && (ps.Partition() == f.PartitionType())
}

var pctx = android.NewPackageContext("android/soong/filesystem")
+25 −0
Original line number Diff line number Diff line
@@ -584,3 +584,28 @@ func TestErofsPartition(t *testing.T) {
	android.AssertStringDoesContain(t, "erofs fs type compress hint", buildImageConfig, "erofs_default_compress_hints=compress_hints.txt")
	android.AssertStringDoesContain(t, "erofs fs type sparse", buildImageConfig, "erofs_sparse_flag=-s")
}

// If a system_ext/ module depends on system/ module, the dependency should *not*
// be installed in system_ext/
func TestDoNotPackageCrossPartitionDependencies(t *testing.T) {
	result := fixture.RunTestWithBp(t, `
		android_filesystem {
			name: "myfilesystem",
			deps: ["binfoo"],
			partition_type: "system_ext",
		}

		cc_binary {
			name: "binfoo",
			shared_libs: ["libfoo"],
			system_ext_specific: true,
		}
		cc_library_shared {
			name: "libfoo", // installed in system/
		}
	`)

	partition := result.ModuleForTests("myfilesystem", "android_common")
	fileList := android.ContentFromFileRuleForTests(t, result.TestContext, partition.Output("fileList"))
	android.AssertDeepEquals(t, "filesystem with dependencies on different partition", "bin/binfoo\n", fileList)
}
+1 −1
Original line number Diff line number Diff line
@@ -103,6 +103,6 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
// partition.  Note that "apex" module installs its contents to "apex"(fake partition) as well
// for symbol lookup by imitating "activated" paths.
func (s *systemImage) filterPackagingSpec(ps android.PackagingSpec) bool {
	return s.filesystem.filterInstallablePackagingSpec(ps) &&
	return !ps.SkipInstall() &&
		(ps.Partition() == "system" || ps.Partition() == "root")
}