Loading apex/apex.go +15 −3 Original line number Diff line number Diff line Loading @@ -136,7 +136,8 @@ func init() { pctx.HostBinToolVariable("zip2zip", "zip2zip") pctx.HostBinToolVariable("zipalign", "zipalign") android.RegisterModuleType("apex", ApexBundleFactory) android.RegisterModuleType("apex", apexBundleFactory) android.RegisterModuleType("apex_test", testApexBundleFactory) android.RegisterModuleType("apex_defaults", defaultsFactory) android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { Loading @@ -154,7 +155,7 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) { depName := mctx.OtherModuleName(child) // If the parent is apexBundle, this child is directly depended. _, directDep := parent.(*apexBundle) if a.installable() { if a.installable() && !a.testApex { // TODO(b/123892969): Workaround for not having any way to annotate test-apexs // non-installable apex's cannot be installed and so should not prevent libraries from being // installed to the system. Loading Loading @@ -375,6 +376,8 @@ type apexBundle struct { filesInfo []apexFile flattened bool testApex bool } func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, Loading Loading @@ -1091,9 +1094,18 @@ func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkD }} } func ApexBundleFactory() android.Module { func testApexBundleFactory() android.Module { return ApexBundleFactory( /*testApex*/ true) } func apexBundleFactory() android.Module { return ApexBundleFactory( /*testApex*/ false) } func ApexBundleFactory(testApex bool) android.Module { module := &apexBundle{ outputFiles: map[apexPackaging]android.WritablePath{}, testApex: testApex, } module.AddProperties(&module.properties) module.AddProperties(&module.targetProperties) Loading apex/apex_test.go +101 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,8 @@ func testApex(t *testing.T, bp string) *android.TestContext { defer teardown(buildDir) ctx := android.NewTestArchContext() ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(ApexBundleFactory)) ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apexBundleFactory)) ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory)) ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) Loading Loading @@ -904,6 +905,105 @@ func TestHeaderLibsDependency(t *testing.T) { ensureContains(t, cFlags, "-Imy_include") } func TestNonTestApex(t *testing.T) { ctx := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib_common"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib_common", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex { t.Log("Apex was a test apex!") t.Fail() } // Ensure that main rule creates an output ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") // Ensure that apex variant is created for the direct dep ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so") // Ensure that the platform variant ends with _core_shared ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared") if !android.InAnyApex("mylib_common") { t.Log("Found mylib_common not in any apex!") t.Fail() } } func TestTestApex(t *testing.T) { if android.InAnyApex("mylib_common_test") { t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!") } ctx := testApex(t, ` apex_test { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib_common_test"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib_common_test", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex { t.Log("Apex was not a test apex!") t.Fail() } // Ensure that main rule creates an output ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") // Ensure that apex variant is created for the direct dep ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared_myapex") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so") // Ensure that the platform variant ends with _core_shared ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared") if android.InAnyApex("mylib_common_test") { t.Log("Found mylib_common_test in some apex!") t.Fail() } } func TestApexWithTarget(t *testing.T) { ctx := testApex(t, ` apex { Loading Loading
apex/apex.go +15 −3 Original line number Diff line number Diff line Loading @@ -136,7 +136,8 @@ func init() { pctx.HostBinToolVariable("zip2zip", "zip2zip") pctx.HostBinToolVariable("zipalign", "zipalign") android.RegisterModuleType("apex", ApexBundleFactory) android.RegisterModuleType("apex", apexBundleFactory) android.RegisterModuleType("apex_test", testApexBundleFactory) android.RegisterModuleType("apex_defaults", defaultsFactory) android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { Loading @@ -154,7 +155,7 @@ func apexDepsMutator(mctx android.TopDownMutatorContext) { depName := mctx.OtherModuleName(child) // If the parent is apexBundle, this child is directly depended. _, directDep := parent.(*apexBundle) if a.installable() { if a.installable() && !a.testApex { // TODO(b/123892969): Workaround for not having any way to annotate test-apexs // non-installable apex's cannot be installed and so should not prevent libraries from being // installed to the system. Loading Loading @@ -375,6 +376,8 @@ type apexBundle struct { filesInfo []apexFile flattened bool testApex bool } func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, Loading Loading @@ -1091,9 +1094,18 @@ func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkD }} } func ApexBundleFactory() android.Module { func testApexBundleFactory() android.Module { return ApexBundleFactory( /*testApex*/ true) } func apexBundleFactory() android.Module { return ApexBundleFactory( /*testApex*/ false) } func ApexBundleFactory(testApex bool) android.Module { module := &apexBundle{ outputFiles: map[apexPackaging]android.WritablePath{}, testApex: testApex, } module.AddProperties(&module.properties) module.AddProperties(&module.targetProperties) Loading
apex/apex_test.go +101 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,8 @@ func testApex(t *testing.T, bp string) *android.TestContext { defer teardown(buildDir) ctx := android.NewTestArchContext() ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(ApexBundleFactory)) ctx.RegisterModuleType("apex", android.ModuleFactoryAdaptor(apexBundleFactory)) ctx.RegisterModuleType("apex_test", android.ModuleFactoryAdaptor(testApexBundleFactory)) ctx.RegisterModuleType("apex_key", android.ModuleFactoryAdaptor(apexKeyFactory)) ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) Loading Loading @@ -904,6 +905,105 @@ func TestHeaderLibsDependency(t *testing.T) { ensureContains(t, cFlags, "-Imy_include") } func TestNonTestApex(t *testing.T) { ctx := testApex(t, ` apex { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib_common"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib_common", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex { t.Log("Apex was a test apex!") t.Fail() } // Ensure that main rule creates an output ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") // Ensure that apex variant is created for the direct dep ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared_myapex") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so") // Ensure that the platform variant ends with _core_shared ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_core_shared") if !android.InAnyApex("mylib_common") { t.Log("Found mylib_common not in any apex!") t.Fail() } } func TestTestApex(t *testing.T) { if android.InAnyApex("mylib_common_test") { t.Fatal("mylib_common_test must not be used in any other tests since this checks that global state is not updated in an illegal way!") } ctx := testApex(t, ` apex_test { name: "myapex", key: "myapex.key", native_shared_libs: ["mylib_common_test"], } apex_key { name: "myapex.key", public_key: "testkey.avbpubkey", private_key: "testkey.pem", } cc_library { name: "mylib_common_test", srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", } `) module := ctx.ModuleForTests("myapex", "android_common_myapex") apexRule := module.Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex { t.Log("Apex was not a test apex!") t.Fail() } // Ensure that main rule creates an output ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned") // Ensure that apex variant is created for the direct dep ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared_myapex") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so") // Ensure that the platform variant ends with _core_shared ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_core_shared") if android.InAnyApex("mylib_common_test") { t.Log("Found mylib_common_test in some apex!") t.Fail() } } func TestApexWithTarget(t *testing.T) { ctx := testApex(t, ` apex { Loading