From efb184e499edd2f0a1f717ab68e2052eb597adab Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Thu, 25 Jun 2020 17:14:25 +0900 Subject: [PATCH] apex: use SubName for requiredDeps apexBundle keeps the required dependencies for native modules which are external dependencies and then records it in .mk file as LOCAL_REQUIRED_MODULES key. LOCAL_REQUIRED_MODULES should list module name which are made of cc.BaseModuleName() + SubName. By the way, because a use_vendor:true apex is supposed to be installed in /system/apex, we don't append SubName(.vendor) suffix. Bug: 159211312 Bug: 155841765 Test: m Change-Id: Ifd2858dda0b373110a0cd18a0c55db41f0fc2a99 --- apex/apex.go | 15 ++++++++--- apex/apex_test.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/apex/apex.go b/apex/apex.go index 289696557..28d02c165 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -2124,7 +2124,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } af := apexFileForNativeLibrary(ctx, cc, handleSpecialLibs) af.transitiveDep = true - if !a.Host() && !android.DirectlyInApex(ctx.ModuleName(), ctx.OtherModuleName(cc)) && (cc.IsStubs() || cc.HasStubsVariants()) { + if !a.Host() && !android.DirectlyInApex(ctx.ModuleName(), depName) && (cc.IsStubs() || cc.HasStubsVariants()) { // If the dependency is a stubs lib, don't include it in this APEX, // but make sure that the lib is installed on the device. // In case no APEX is having the lib, the lib is installed to the system @@ -2132,8 +2132,17 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { // // Always include if we are a host-apex however since those won't have any // system libraries. - if !android.DirectlyInAnyApex(ctx, cc.Name()) && !android.InList(cc.BaseModuleName(), a.requiredDeps) { - a.requiredDeps = append(a.requiredDeps, cc.BaseModuleName()) + if !android.DirectlyInAnyApex(ctx, depName) { + // we need a module name for Make + name := cc.BaseModuleName() + cc.Properties.SubName + if proptools.Bool(a.properties.Use_vendor) { + // we don't use subName(.vendor) for a "use_vendor: true" apex + // which is supposed to be installed in /system + name = cc.BaseModuleName() + } + if !android.InList(name, a.requiredDeps) { + a.requiredDeps = append(a.requiredDeps, name) + } } requireNativeLibs = append(requireNativeLibs, af.Stem()) // Don't track further diff --git a/apex/apex_test.go b/apex/apex_test.go index d5eb45761..befb81483 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -2202,6 +2202,71 @@ func TestVendorApex(t *testing.T) { ensureContains(t, androidMk, `LOCAL_MODULE_PATH := /tmp/target/product/test_device/vendor/apex`) } +func TestAndroidMk_UseVendorRequired(t *testing.T) { + ctx, config := testApex(t, ` + apex { + name: "myapex", + key: "myapex.key", + use_vendor: true, + native_shared_libs: ["mylib"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + cc_library { + name: "mylib", + vendor_available: true, + apex_available: ["myapex"], + } + `, func(fs map[string][]byte, config android.Config) { + setUseVendorAllowListForTest(config, []string{"myapex"}) + }) + + apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle) + data := android.AndroidMkDataForTest(t, config, "", apexBundle) + name := apexBundle.BaseModuleName() + prefix := "TARGET_" + var builder strings.Builder + data.Custom(&builder, name, prefix, "", data) + androidMk := builder.String() + ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n") +} + +func TestAndroidMk_VendorApexRequired(t *testing.T) { + ctx, config := testApex(t, ` + apex { + name: "myapex", + key: "myapex.key", + vendor: true, + native_shared_libs: ["mylib"], + } + + apex_key { + name: "myapex.key", + public_key: "testkey.avbpubkey", + private_key: "testkey.pem", + } + + cc_library { + name: "mylib", + vendor_available: true, + } + `) + + apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle) + data := android.AndroidMkDataForTest(t, config, "", apexBundle) + name := apexBundle.BaseModuleName() + prefix := "TARGET_" + var builder strings.Builder + data.Custom(&builder, name, prefix, "", data) + androidMk := builder.String() + ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n") +} + func TestAndroidMkWritesCommonProperties(t *testing.T) { ctx, config := testApex(t, ` apex {