From 7db57e0a775be3892149b9431df468be1dfae76a Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Thu, 17 Jun 2021 14:56:05 +0100 Subject: [PATCH] Remove javalib special case in createDeapexerModuleIfNeeded Removes the special case in createDeapexerModuleIfNeeded for handling java libraries and just get the Import and SdkLibraryImport module types to implement RequiredFilesFromPrebuiltApex instead. Bug: 177892522 Test: m nothing Merged-In: I5cc341b5b4168b8eb196f72273a00d498de6856f Change-Id: I5cc341b5b4168b8eb196f72273a00d498de6856f (cherry picked from commit fef5500a766d1f515ff19038e8e0e8f606e07287) --- android/deapexer.go | 9 +++++++++ apex/prebuilt.go | 22 ++++++++++++---------- java/bootclasspath_fragment.go | 4 ++++ java/java.go | 18 ++++++++++++++++++ java/sdk_library.go | 7 +++++++ 5 files changed, 50 insertions(+), 10 deletions(-) diff --git a/android/deapexer.go b/android/deapexer.go index f3c541c17..c189dc114 100644 --- a/android/deapexer.go +++ b/android/deapexer.go @@ -128,3 +128,12 @@ type RequiredFilesFromPrebuiltApex interface { // can then be retrieved using the PrebuiltExportPath(name, tag) method. RequiredFilesFromPrebuiltApex(ctx BaseModuleContext) map[string]string } + +// Marker interface that identifies dependencies on modules that may require files from a prebuilt +// apex. +type RequiresFilesFromPrebuiltApexTag interface { + blueprint.DependencyTag + + // Method that differentiates this interface from others. + RequiresFilesFromPrebuiltApex() +} diff --git a/apex/prebuilt.go b/apex/prebuilt.go index d4867767a..51792421d 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -17,7 +17,6 @@ package apex import ( "fmt" "io" - "path/filepath" "strconv" "strings" @@ -559,15 +558,13 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam ctx.WalkDeps(func(child, parent android.Module) bool { tag := ctx.OtherModuleDependencyTag(child) + // If the child is not in the same apex as the parent then ignore it and all its children. + if !android.IsDepInSameApex(ctx, parent, child) { + return false + } + name := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) - if java.IsBootclasspathFragmentContentDepTag(tag) || tag == exportedJavaLibTag { - commonModules = append(commonModules, name) - - // Add the dex implementation jar to the set of exported files. The path here must match the - // path of the file in the APEX created by apexFileForJavaModule(...). - exportedFilesByKey[name+"{.dexjar}"] = filepath.Join("javalib", name+".jar") - - } else if tag == exportedBootclasspathFragmentTag { + if _, ok := tag.(android.RequiresFilesFromPrebuiltApexTag); ok { commonModules = append(commonModules, name) requiredFiles := child.(android.RequiredFilesFromPrebuiltApex).RequiredFilesFromPrebuiltApex(ctx) @@ -582,7 +579,8 @@ func createDeapexerModuleIfNeeded(ctx android.TopDownMutatorContext, deapexerNam requiringModulesByKey[k] = child } - // Make sure to visit the children of the bootclasspath_fragment. + // Visit the dependencies of this module just in case they also require files from the + // prebuilt apex. return true } @@ -659,6 +657,10 @@ type exportedDependencyTag struct { // incorrectly. func (t exportedDependencyTag) ExcludeFromVisibilityEnforcement() {} +func (t exportedDependencyTag) RequiresFilesFromPrebuiltApex() {} + +var _ android.RequiresFilesFromPrebuiltApexTag = exportedDependencyTag{} + var ( exportedJavaLibTag = exportedDependencyTag{name: "exported_java_libs"} exportedBootclasspathFragmentTag = exportedDependencyTag{name: "exported_bootclasspath_fragments"} diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index 4d005875d..07df165a6 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -81,6 +81,9 @@ func (b bootclasspathFragmentContentDependencyTag) ExportMember() bool { // they were listed in java_libs. func (b bootclasspathFragmentContentDependencyTag) CopyDirectlyInAnyApex() {} +// Contents of bootclasspath fragments require files from prebuilt apex files. +func (b bootclasspathFragmentContentDependencyTag) RequiresFilesFromPrebuiltApex() {} + // The tag used for the dependency between the bootclasspath_fragment module and its contents. var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{} @@ -88,6 +91,7 @@ var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContent var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag var _ android.SdkMemberTypeDependencyTag = bootclasspathFragmentContentDepTag var _ android.CopyDirectlyInAnyApexTag = bootclasspathFragmentContentDepTag +var _ android.RequiresFilesFromPrebuiltApexTag = bootclasspathFragmentContentDepTag func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool { return tag == bootclasspathFragmentContentDepTag diff --git a/java/java.go b/java/java.go index 2bbb5b102..3b6c9c884 100644 --- a/java/java.go +++ b/java/java.go @@ -1426,6 +1426,24 @@ func (j *Import) ShouldSupportSdkVersion(ctx android.BaseModuleContext, return nil } +// requiredFilesFromPrebuiltApexForImport returns information about the files that a java_import or +// java_sdk_library_import with the specified base module name requires to be exported from a +// prebuilt_apex/apex_set. +func requiredFilesFromPrebuiltApexForImport(name string) map[string]string { + // Add the dex implementation jar to the set of exported files. The path here must match the + // path of the file in the APEX created by apexFileForJavaModule(...). + return map[string]string{ + name + "{.dexjar}": filepath.Join("javalib", name+".jar"), + } +} + +var _ android.RequiredFilesFromPrebuiltApex = (*Import)(nil) + +func (j *Import) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) map[string]string { + name := j.BaseModuleName() + return requiredFilesFromPrebuiltApexForImport(name) +} + // Add compile time check for interface implementation var _ android.IDEInfo = (*Import)(nil) var _ android.IDECustomizedModuleName = (*Import)(nil) diff --git a/java/sdk_library.go b/java/sdk_library.go index 133deda75..2ae7f09fb 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2265,6 +2265,13 @@ func (module *SdkLibraryImport) ImplementationAndResourcesJars() android.Paths { } } +var _ android.RequiredFilesFromPrebuiltApex = (*SdkLibraryImport)(nil) + +func (module *SdkLibraryImport) RequiredFilesFromPrebuiltApex(ctx android.BaseModuleContext) map[string]string { + name := module.BaseModuleName() + return requiredFilesFromPrebuiltApexForImport(name) +} + // // java_sdk_library_xml //