diff --git a/android/Android.bp b/android/Android.bp
index da36959..a20aedc 100644
--- a/android/Android.bp
+++ b/android/Android.bp
@@ -47,7 +47,6 @@
         "image.go",
         "license.go",
         "license_kind.go",
-        "license_metadata.go",
         "license_sdk_member.go",
         "licenses.go",
         "makefile_goal.go",
diff --git a/android/androidmk.go b/android/androidmk.go
index 85f9ded..0adc2a6 100644
--- a/android/androidmk.go
+++ b/android/androidmk.go
@@ -474,7 +474,6 @@
 	ModuleDir(module blueprint.Module) string
 	Config() Config
 	ModuleProvider(module blueprint.Module, provider blueprint.ProviderKey) interface{}
-	ModuleHasProvider(module blueprint.Module, provider blueprint.ProviderKey) bool
 }
 
 func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint.Module) {
@@ -610,11 +609,6 @@
 		}
 	}
 
-	if ctx.ModuleHasProvider(mod, LicenseMetadataProvider) {
-		licenseMetadata := ctx.ModuleProvider(mod, LicenseMetadataProvider).(*LicenseMetadataInfo)
-		a.SetPath("LOCAL_SOONG_LICENSE_METADATA", licenseMetadata.LicenseMetadataPath)
-	}
-
 	extraCtx := &androidMkExtraEntriesContext{
 		ctx: ctx,
 		mod: mod,
diff --git a/android/license_metadata.go b/android/license_metadata.go
deleted file mode 100644
index 3bc53d6..0000000
--- a/android/license_metadata.go
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2021 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package android
-
-import (
-	"fmt"
-	"sort"
-	"strings"
-
-	"github.com/google/blueprint"
-	"github.com/google/blueprint/proptools"
-)
-
-var (
-	_ = pctx.HostBinToolVariable("licenseMetadataCmd", "build_license_metadata")
-
-	licenseMetadataRule = pctx.AndroidStaticRule("licenseMetadataRule", blueprint.RuleParams{
-		Command:        "${licenseMetadataCmd} -o $out @${out}.rsp",
-		CommandDeps:    []string{"${licenseMetadataCmd}"},
-		Rspfile:        "${out}.rsp",
-		RspfileContent: "${args}",
-	}, "args")
-)
-
-func buildLicenseMetadata(ctx ModuleContext) {
-	base := ctx.Module().base()
-
-	if !base.Enabled() {
-		return
-	}
-
-	if exemptFromRequiredApplicableLicensesProperty(ctx.Module()) {
-		return
-	}
-
-	var allDepMetadataFiles Paths
-	var allDepMetadataArgs []string
-	var allDepOutputFiles Paths
-
-	ctx.VisitDirectDepsBlueprint(func(bpdep blueprint.Module) {
-		dep, _ := bpdep.(Module)
-		if dep == nil {
-			return
-		}
-		if !dep.Enabled() {
-			return
-		}
-
-		if ctx.OtherModuleHasProvider(dep, LicenseMetadataProvider) {
-			info := ctx.OtherModuleProvider(dep, LicenseMetadataProvider).(*LicenseMetadataInfo)
-			allDepMetadataFiles = append(allDepMetadataFiles, info.LicenseMetadataPath)
-
-			depAnnotations := licenseAnnotationsFromTag(ctx.OtherModuleDependencyTag(dep))
-
-			allDepMetadataArgs = append(allDepMetadataArgs, info.LicenseMetadataPath.String()+depAnnotations)
-
-			if depInstallFiles := dep.base().installFiles; len(depInstallFiles) > 0 {
-				allDepOutputFiles = append(allDepOutputFiles, depInstallFiles.Paths()...)
-			} else if depOutputFiles, err := outputFilesForModule(ctx, dep, ""); err == nil {
-				depOutputFiles = PathsIfNonNil(depOutputFiles...)
-				allDepOutputFiles = append(allDepOutputFiles, depOutputFiles...)
-			}
-		}
-	})
-
-	allDepMetadataFiles = SortedUniquePaths(allDepMetadataFiles)
-	sort.Strings(allDepMetadataArgs)
-	allDepOutputFiles = SortedUniquePaths(allDepOutputFiles)
-
-	var orderOnlyDeps Paths
-	var args []string
-
-	if t := ctx.ModuleType(); t != "" {
-		args = append(args,
-			"-mt "+proptools.NinjaAndShellEscape(t))
-	}
-
-	args = append(args,
-		"-r "+proptools.NinjaAndShellEscape(ctx.ModuleDir()),
-		"-mc UNKNOWN")
-
-	if p := base.commonProperties.Effective_package_name; p != nil {
-		args = append(args,
-			"-p "+proptools.NinjaAndShellEscape(*p))
-	}
-
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.commonProperties.Effective_license_kinds), "-k "))
-
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.commonProperties.Effective_license_conditions), "-c "))
-
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.commonProperties.Effective_license_text.Strings()), "-n "))
-
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(allDepMetadataArgs), "-d "))
-	orderOnlyDeps = append(orderOnlyDeps, allDepMetadataFiles...)
-
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(allDepOutputFiles.Strings()), "-s "))
-
-	// Install map
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.licenseInstallMap), "-m "))
-
-	// Built files
-	var outputFiles Paths
-	if outputFileProducer, ok := ctx.Module().(OutputFileProducer); ok {
-		outputFiles, _ = outputFileProducer.OutputFiles("")
-		outputFiles = PathsIfNonNil(outputFiles...)
-	}
-
-	if len(outputFiles) > 0 {
-		args = append(args,
-			JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(outputFiles.Strings()), "-t "))
-	} else {
-		args = append(args, fmt.Sprintf("-t //%s:%s", ctx.ModuleDir(), ctx.ModuleName()))
-	}
-
-	// Installed files
-	args = append(args,
-		JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.installFiles.Strings()), "-i "))
-
-	isContainer := isContainerFromFileExtensions(base.installFiles, outputFiles)
-	if isContainer {
-		args = append(args, "--is_container")
-	}
-
-	licenseMetadataFile := PathForModuleOut(ctx, "meta_lic")
-
-	ctx.Build(pctx, BuildParams{
-		Rule:        licenseMetadataRule,
-		Output:      licenseMetadataFile,
-		OrderOnly:   orderOnlyDeps,
-		Description: "license metadata",
-		Args: map[string]string{
-			"args": strings.Join(args, " "),
-		},
-	})
-
-	ctx.SetProvider(LicenseMetadataProvider, &LicenseMetadataInfo{
-		LicenseMetadataPath: licenseMetadataFile,
-	})
-}
-
-func isContainerFromFileExtensions(installPaths InstallPaths, builtPaths Paths) bool {
-	var paths Paths
-	if len(installPaths) > 0 {
-		paths = installPaths.Paths()
-	} else {
-		paths = builtPaths
-	}
-
-	for _, path := range paths {
-		switch path.Ext() {
-		case ".zip", ".tar", ".tgz", ".tar.gz", ".img", ".srcszip", ".apex":
-			return true
-		}
-	}
-
-	return false
-}
-
-// LicenseMetadataProvider is used to propagate license metadata paths between modules.
-var LicenseMetadataProvider = blueprint.NewProvider(&LicenseMetadataInfo{})
-
-// LicenseMetadataInfo stores the license metadata path for a module.
-type LicenseMetadataInfo struct {
-	LicenseMetadataPath Path
-}
-
-// licenseAnnotationsFromTag returns the LicenseAnnotations for a tag (if any) converted into
-// a string, or an empty string if there are none.
-func licenseAnnotationsFromTag(tag blueprint.DependencyTag) string {
-	if annoTag, ok := tag.(LicenseAnnotationsDependencyTag); ok {
-		annos := annoTag.LicenseAnnotations()
-		if len(annos) > 0 {
-			annoStrings := make([]string, len(annos))
-			for i, s := range annos {
-				annoStrings[i] = string(s)
-			}
-			return ":" + strings.Join(annoStrings, ",")
-		}
-	}
-	return ""
-}
-
-// LicenseAnnotationsDependencyTag is implemented by dependency tags in order to provide a
-// list of license dependency annotations.
-type LicenseAnnotationsDependencyTag interface {
-	LicenseAnnotations() []LicenseAnnotation
-}
-
-// LicenseAnnotation is an enum of annotations that can be applied to dependencies for propagating
-// license information.
-type LicenseAnnotation string
-
-const (
-	// LicenseAnnotationSharedDependency should be returned by LicenseAnnotations implementations
-	// of dependency tags when the usage of the dependency is dynamic, for example a shared library
-	// linkage for native modules or as a classpath library for java modules.
-	LicenseAnnotationSharedDependency LicenseAnnotation = "dynamic"
-
-	// LicenseAnnotationToolchain should be returned by LicenseAnnotations implementations of
-	// dependency tags when the dependency is used as a toolchain.
-	//
-	// Dependency tags that need to always return LicenseAnnotationToolchain
-	// can embed LicenseAnnotationToolchainDependencyTag to implement LicenseAnnotations.
-	LicenseAnnotationToolchain LicenseAnnotation = "toolchain"
-)
-
-// LicenseAnnotationToolchainDependencyTag can be embedded in a dependency tag to implement
-// LicenseAnnotations that always returns LicenseAnnotationToolchain.
-type LicenseAnnotationToolchainDependencyTag struct{}
-
-func (LicenseAnnotationToolchainDependencyTag) LicenseAnnotations() []LicenseAnnotation {
-	return []LicenseAnnotation{LicenseAnnotationToolchain}
-}
diff --git a/android/module.go b/android/module.go
index df01dc5..767f9f4 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1230,10 +1230,6 @@
 
 	initRcPaths         Paths
 	vintfFragmentsPaths Paths
-
-	// set of dependency module:location mappings used to populate the license metadata for
-	// apex containers.
-	licenseInstallMap []string
 }
 
 // A struct containing all relevant information about a Bazel target converted via bp2build.
@@ -1778,12 +1774,6 @@
 	return append(Paths{}, m.vintfFragmentsPaths...)
 }
 
-// SetLicenseInstallMap stores the set of dependency module:location mappings for files in an
-// apex container for use when generation the license metadata file.
-func (m *ModuleBase) SetLicenseInstallMap(installMap []string) {
-	m.licenseInstallMap = append(m.licenseInstallMap, installMap...)
-}
-
 func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) {
 	var allInstalledFiles InstallPaths
 	var allCheckbuildFiles Paths
@@ -2059,8 +2049,6 @@
 	m.installFilesDepSet = newInstallPathsDepSet(m.installFiles, dependencyInstallFiles)
 	m.packagingSpecsDepSet = newPackagingSpecsDepSet(m.packagingSpecs, dependencyPackagingSpecs)
 
-	buildLicenseMetadata(ctx)
-
 	m.buildParams = ctx.buildParams
 	m.ruleParams = ctx.ruleParams
 	m.variables = ctx.variables
diff --git a/apex/androidmk.go b/apex/androidmk.go
index f001fa2..7764b6b 100644
--- a/apex/androidmk.go
+++ b/apex/androidmk.go
@@ -309,17 +309,19 @@
 	return moduleNames
 }
 
-func (a *apexBundle) writeRequiredModules(w io.Writer) {
+func (a *apexBundle) writeRequiredModules(w io.Writer, apexBundleName string) {
 	var required []string
 	var targetRequired []string
 	var hostRequired []string
 	required = append(required, a.RequiredModuleNames()...)
 	targetRequired = append(targetRequired, a.TargetRequiredModuleNames()...)
 	hostRequired = append(hostRequired, a.HostRequiredModuleNames()...)
+	installMapSet := make(map[string]bool) // set of dependency module:location mappings
 	for _, fi := range a.filesInfo {
 		required = append(required, fi.requiredModuleNames...)
 		targetRequired = append(targetRequired, fi.targetRequiredModuleNames...)
 		hostRequired = append(hostRequired, fi.hostRequiredModuleNames...)
+		installMapSet[a.fullModuleName(apexBundleName, &fi)+":"+fi.installDir+"/"+fi.builtFile.Base()] = true
 	}
 
 	if len(required) > 0 {
@@ -331,6 +333,11 @@
 	if len(hostRequired) > 0 {
 		fmt.Fprintln(w, "LOCAL_HOST_REQUIRED_MODULES +=", strings.Join(hostRequired, " "))
 	}
+	if len(installMapSet) > 0 {
+		var installs []string
+		installs = append(installs, android.SortedStringKeys(installMapSet)...)
+		fmt.Fprintln(w, "LOCAL_LICENSE_INSTALL_MAP +=", strings.Join(installs, " "))
+	}
 }
 
 func (a *apexBundle) androidMkForType() android.AndroidMkData {
@@ -352,7 +359,7 @@
 				if len(moduleNames) > 0 {
 					fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(moduleNames, " "))
 				}
-				a.writeRequiredModules(w)
+				a.writeRequiredModules(w, name)
 				fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)")
 
 			} else {
@@ -394,7 +401,7 @@
 				if len(a.requiredDeps) > 0 {
 					fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(a.requiredDeps, " "))
 				}
-				a.writeRequiredModules(w)
+				a.writeRequiredModules(w, name)
 
 				if a.mergedNotices.Merged.Valid() {
 					fmt.Fprintln(w, "LOCAL_NOTICE_FILE :=", a.mergedNotices.Merged.Path().String())
diff --git a/apex/builder.go b/apex/builder.go
index 5910784..0880e2b 100644
--- a/apex/builder.go
+++ b/apex/builder.go
@@ -434,10 +434,7 @@
 	// Avoid creating duplicate build rules for multi-installed APEXes.
 	if proptools.BoolDefault(a.properties.Multi_install_skip_symbol_files, false) {
 		installSymbolFiles = false
-
 	}
-	// set of dependency module:location mappings
-	installMapSet := make(map[string]bool)
 
 	// TODO(jiyong): use the RuleBuilder
 	var copyCommands []string
@@ -445,6 +442,7 @@
 	pathWhenActivated := android.PathForModuleInPartitionInstall(ctx, "apex", apexName)
 	for _, fi := range a.filesInfo {
 		destPath := imageDir.Join(ctx, fi.path()).String()
+		var installedPath android.InstallPath
 		// Prepare the destination path
 		destPathDir := filepath.Dir(destPath)
 		if fi.class == appSet {
@@ -452,8 +450,6 @@
 		}
 		copyCommands = append(copyCommands, "mkdir -p "+destPathDir)
 
-		installMapPath := fi.builtFile
-
 		// Copy the built file to the directory. But if the symlink optimization is turned
 		// on, place a symlink to the corresponding file in /system partition instead.
 		if a.linkToSystemLib && fi.transitiveDep && fi.availableToPlatform() {
@@ -461,7 +457,6 @@
 			pathOnDevice := filepath.Join("/system", fi.path())
 			copyCommands = append(copyCommands, "ln -sfn "+pathOnDevice+" "+destPath)
 		} else {
-			var installedPath android.InstallPath
 			if fi.class == appSet {
 				copyCommands = append(copyCommands,
 					fmt.Sprintf("unzip -qDD -d %s %s", destPathDir,
@@ -480,19 +475,17 @@
 			if installSymbolFiles {
 				implicitInputs = append(implicitInputs, installedPath)
 			}
+		}
 
-			// Create additional symlinks pointing the file inside the APEX (if any). Note that
-			// this is independent from the symlink optimization.
-			for _, symlinkPath := range fi.symlinkPaths() {
-				symlinkDest := imageDir.Join(ctx, symlinkPath).String()
-				copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest)
-				if installSymbolFiles {
-					installedSymlink := ctx.InstallSymlink(pathWhenActivated.Join(ctx, filepath.Dir(symlinkPath)), filepath.Base(symlinkPath), installedPath)
-					implicitInputs = append(implicitInputs, installedSymlink)
-				}
+		// Create additional symlinks pointing the file inside the APEX (if any). Note that
+		// this is independent from the symlink optimization.
+		for _, symlinkPath := range fi.symlinkPaths() {
+			symlinkDest := imageDir.Join(ctx, symlinkPath).String()
+			copyCommands = append(copyCommands, "ln -sfn "+filepath.Base(destPath)+" "+symlinkDest)
+			if installSymbolFiles {
+				installedSymlink := ctx.InstallSymlink(pathWhenActivated.Join(ctx, filepath.Dir(symlinkPath)), filepath.Base(symlinkPath), installedPath)
+				implicitInputs = append(implicitInputs, installedSymlink)
 			}
-
-			installMapPath = installedPath
 		}
 
 		// Copy the test files (if any)
@@ -509,8 +502,6 @@
 			copyCommands = append(copyCommands, "cp -f "+d.SrcPath.String()+" "+dataDest)
 			implicitInputs = append(implicitInputs, d.SrcPath)
 		}
-
-		installMapSet[installMapPath.String()+":"+fi.installDir+"/"+fi.builtFile.Base()] = true
 	}
 	implicitInputs = append(implicitInputs, a.manifestPbOut)
 	if installSymbolFiles {
@@ -519,12 +510,6 @@
 		implicitInputs = append(implicitInputs, installedManifest, installedKey)
 	}
 
-	if len(installMapSet) > 0 {
-		var installs []string
-		installs = append(installs, android.SortedStringKeys(installMapSet)...)
-		a.SetLicenseInstallMap(installs)
-	}
-
 	////////////////////////////////////////////////////////////////////////////////////////////
 	// Step 1.a: Write the list of files in this APEX to a txt file and compare it against
 	// the allowed list given via the allowed_files property. Build fails when the two lists
diff --git a/java/sdk_library.go b/java/sdk_library.go
index daf932e..3065d57 100644
--- a/java/sdk_library.go
+++ b/java/sdk_library.go
@@ -1206,16 +1206,11 @@
 
 func (module *SdkLibrary) OutputFiles(tag string) (android.Paths, error) {
 	paths, err := module.commonOutputFiles(tag)
-	if paths != nil || err != nil {
+	if paths == nil && err == nil {
+		return module.Library.OutputFiles(tag)
+	} else {
 		return paths, err
 	}
-	if module.requiresRuntimeImplementationLibrary() {
-		return module.Library.OutputFiles(tag)
-	}
-	if tag == "" {
-		return nil, nil
-	}
-	return nil, fmt.Errorf("unsupported module reference tag %q", tag)
 }
 
 func (module *SdkLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
