From ec00900f83804e74e633229022f4962b04ec19a6 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm Date: Sat, 27 Mar 2021 15:18:31 +0000 Subject: [PATCH] Allow dependencies from platform variants to APEX modules (reland). When `test_for` dependencies are added from libraries to APEX modules, they can be created from the platform variants of the libraries, since those are used for building tests. Hence we need an alias from the platform variant of the APEX module to have a target for those dependencies. This is only necessary for libraries that are split by the APEX mutator, i.e. is a member of some APEX. Normally that's not the case for test libraries, but there may be exceptions (read com.android.art.testing). This relands https://r.android.com/1654679 after decoupling it from the topic that caused b/184239856. Test: m nothing Bug: 183882457 Change-Id: If643c75ce9bc25fa01ad9d1e3ba8e1d060d03bb2 --- apex/apex.go | 14 +++++++++++++ apex/apex_test.go | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/apex/apex.go b/apex/apex.go index 9d06e1c8f..efc12b35d 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1049,6 +1049,16 @@ func apexMutator(mctx android.BottomUpMutatorContext) { if a, ok := mctx.Module().(*apexBundle); ok && !a.vndkApex { apexBundleName := mctx.ModuleName() mctx.CreateVariations(apexBundleName) + if strings.HasPrefix(apexBundleName, "com.android.art") { + // Create an alias from the platform variant. This is done to make + // test_for dependencies work for modules that are split by the APEX + // mutator, since test_for dependencies always go to the platform variant. + // This doesn't happen for normal APEXes that are disjunct, so only do + // this for the overlapping ART APEXes. + // TODO(b/183882457): Remove this if the test_for functionality is + // refactored to depend on the proper APEX variants instead of platform. + mctx.CreateAliasVariation("", apexBundleName) + } } else if o, ok := mctx.Module().(*OverrideApex); ok { apexBundleName := o.GetOverriddenModuleName() if apexBundleName == "" { @@ -1056,6 +1066,10 @@ func apexMutator(mctx android.BottomUpMutatorContext) { return } mctx.CreateVariations(apexBundleName) + if strings.HasPrefix(apexBundleName, "com.android.art") { + // TODO(b/183882457): See note for CreateAliasVariation above. + mctx.CreateAliasVariation("", apexBundleName) + } } } diff --git a/apex/apex_test.go b/apex/apex_test.go index e47bd1e03..87d551b74 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -6947,6 +6947,56 @@ func TestIndirectTestFor(t *testing.T) { ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so") } +func TestTestForForLibInOtherApex(t *testing.T) { + // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes. + _ = testApex(t, ` + apex { + name: "com.android.art", + key: "myapex.key", + native_shared_libs: ["mylib"], + updatable: false, + } + + apex { + name: "com.android.art.debug", + key: "myapex.key", + native_shared_libs: ["mylib", "mytestlib"], + updatable: false, + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + cc_library { + name: "mylib", + srcs: ["mylib.cpp"], + system_shared_libs: [], + stl: "none", + stubs: { + versions: ["1"], + }, + apex_available: ["com.android.art", "com.android.art.debug"], + } + + cc_library { + name: "mytestlib", + srcs: ["mylib.cpp"], + system_shared_libs: [], + shared_libs: ["mylib"], + stl: "none", + apex_available: ["com.android.art.debug"], + test_for: ["com.android.art"], + } + `, + android.MockFS{ + "system/sepolicy/apex/com.android.art-file_contexts": nil, + "system/sepolicy/apex/com.android.art.debug-file_contexts": nil, + }.AddToFixture()) +} + // TODO(jungjw): Move this to proptools func intPtr(i int) *int { return &i