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

Commit aa53324a authored by Jiyong Park's avatar Jiyong Park
Browse files

Split Java libraries per apex

Just like native libs, a java library that is included in an APEX is
mutated for the APEX. This allows us to infer the context (e.g.
sdk_version, etc.) for building a java library in an APEX.

Bug: 138182343
Test: apex_test added
Change-Id: I9292ea097b98e74a8a794f164bd2bed3921d6337
parent 1ecfa940
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -91,6 +91,8 @@ func testApexContext(t *testing.T, bp string) (*android.TestContext, android.Con
	ctx.RegisterModuleType("sh_binary", android.ModuleFactoryAdaptor(android.ShBinaryFactory))
	ctx.RegisterModuleType("android_app_certificate", android.ModuleFactoryAdaptor(java.AndroidAppCertificateFactory))
	ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
	ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(java.LibraryFactory))

	ctx.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
		ctx.BottomUp("prebuilts", android.PrebuiltMutator).Parallel()
	})
@@ -205,6 +207,7 @@ func testApexContext(t *testing.T, bp string) (*android.TestContext, android.Con
		"mytest3.cpp":                          nil,
		"myprebuilt":                           nil,
		"my_include":                           nil,
		"foo/bar/MyClass.java":                 nil,
		"vendor/foo/devkeys/test.x509.pem":     nil,
		"vendor/foo/devkeys/test.pk8":          nil,
		"testkey.x509.pem":                     nil,
@@ -280,7 +283,8 @@ func TestBasicApex(t *testing.T) {
				both: {
					binaries: ["foo",],
				}
			}
			},
			java_libs: ["myjar"],
		}

		apex {
@@ -338,6 +342,23 @@ func TestBasicApex(t *testing.T) {
			stl: "none",
			notice: "custom_notice",
		}

		java_library {
			name: "myjar",
			srcs: ["foo/bar/MyClass.java"],
			sdk_version: "none",
			system_modules: "none",
			compile_dex: true,
			static_libs: ["myotherjar"],
		}

		java_library {
			name: "myotherjar",
			srcs: ["foo/bar/MyClass.java"],
			sdk_version: "none",
			system_modules: "none",
			compile_dex: true,
		}
	`)

	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
@@ -354,17 +375,24 @@ func TestBasicApex(t *testing.T) {

	// Ensure that apex variant is created for the direct dep
	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared_myapex")
	ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_myapex")

	// Ensure that apex variant is created for the indirect dep
	ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared_myapex")
	ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_myapex")

	// Ensure that both direct and indirect deps are copied into apex
	ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
	ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
	ensureContains(t, copyCmds, "image.apex/javalib/myjar.jar")
	// .. but not for java libs
	ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")

	// Ensure that the platform variant ends with _core_shared
	// Ensure that the platform variant ends with _core_shared or _common
	ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_core_shared")
	ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_core_shared")
	ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
	ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")

	// Ensure that all symlinks are present.
	found_foo_link_64 := false
+15 −0
Original line number Diff line number Diff line
@@ -55,6 +55,11 @@ func (library *Library) AndroidMkHostDex(w io.Writer, name string, data android.
}

func (library *Library) AndroidMk() android.AndroidMkData {
	if !library.IsForPlatform() {
		return android.AndroidMkData{
			Disabled: true,
		}
	}
	return android.AndroidMkData{
		Class:      "JAVA_LIBRARIES",
		OutputFile: android.OptionalPathForPath(library.outputFile),
@@ -141,6 +146,11 @@ func (j *TestHelperLibrary) AndroidMk() android.AndroidMkData {
}

func (prebuilt *Import) AndroidMk() android.AndroidMkData {
	if !prebuilt.IsForPlatform() {
		return android.AndroidMkData{
			Disabled: true,
		}
	}
	return android.AndroidMkData{
		Class:      "JAVA_LIBRARIES",
		OutputFile: android.OptionalPathForPath(prebuilt.combinedClasspathFile),
@@ -157,6 +167,11 @@ func (prebuilt *Import) AndroidMk() android.AndroidMkData {
}

func (prebuilt *DexImport) AndroidMk() android.AndroidMkData {
	if !prebuilt.IsForPlatform() {
		return android.AndroidMkData{
			Disabled: true,
		}
	}
	return android.AndroidMkData{
		Class:      "JAVA_LIBRARIES",
		OutputFile: android.OptionalPathForPath(prebuilt.maybeStrippedDexJarFile),
+8 −0
Original line number Diff line number Diff line
@@ -152,6 +152,14 @@ func stubFlagsRule(ctx android.SingletonContext) {
		// Collect dex jar paths for modules that had hiddenapi encode called on them.
		if h, ok := module.(hiddenAPIIntf); ok {
			if jar := h.bootDexJar(); jar != nil {
				// For a java lib included in an APEX, only take the one built for
				// the platform variant, and skip the variants for APEXes.
				// Otherwise, the hiddenapi tool will complain about duplicated classes
				if a, ok := module.(android.ApexModule); ok {
					if android.InAnyApex(module.Name()) && !a.IsForPlatform() {
						return
					}
				}
				bootDexJars = append(bootDexJars, jar)
			}
		}
+10 −1
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ func (me *CompilerDeviceProperties) EffectiveOptimizeEnabled() bool {
type Module struct {
	android.ModuleBase
	android.DefaultableModuleBase
	android.ApexModuleBase

	properties       CompilerProperties
	protoProperties  android.ProtoProperties
@@ -1581,6 +1582,7 @@ func LibraryFactory() android.Module {
		&module.Module.protoProperties)

	InitJavaModule(module, android.HostAndDeviceSupported)
	android.InitApexModule(module)
	return module
}

@@ -1603,6 +1605,7 @@ func LibraryHostFactory() android.Module {
	module.Module.properties.Installable = proptools.BoolPtr(true)

	InitJavaModule(module, android.HostSupported)
	android.InitApexModule(module)
	return module
}

@@ -1858,6 +1861,7 @@ type ImportProperties struct {
type Import struct {
	android.ModuleBase
	android.DefaultableModuleBase
	android.ApexModuleBase
	prebuilt android.Prebuilt

	properties ImportProperties
@@ -2014,6 +2018,7 @@ func ImportFactory() android.Module {

	android.InitPrebuiltModule(module, &module.properties.Jars)
	InitJavaModule(module, android.HostAndDeviceSupported)
	android.InitApexModule(module)
	return module
}

@@ -2029,6 +2034,7 @@ func ImportFactoryHost() android.Module {

	android.InitPrebuiltModule(module, &module.properties.Jars)
	InitJavaModule(module, android.HostSupported)
	android.InitApexModule(module)
	return module
}

@@ -2041,6 +2047,7 @@ type DexImportProperties struct {
type DexImport struct {
	android.ModuleBase
	android.DefaultableModuleBase
	android.ApexModuleBase
	prebuilt android.Prebuilt

	properties DexImportProperties
@@ -2132,6 +2139,7 @@ func DexImportFactory() android.Module {

	android.InitPrebuiltModule(module, &module.properties.Jars)
	InitJavaModule(module, android.DeviceSupported)
	android.InitApexModule(module)
	return module
}

@@ -2141,6 +2149,7 @@ func DexImportFactory() android.Module {
type Defaults struct {
	android.ModuleBase
	android.DefaultsModuleBase
	android.ApexModuleBase
}

// java_defaults provides a set of properties that can be inherited by other java or android modules.
@@ -2199,7 +2208,7 @@ func DefaultsFactory(props ...interface{}) android.Module {
	)

	android.InitDefaultsModule(module)

	android.InitApexModule(module)
	return module
}