Add support for transitive resources to android_library_import
Collect and propagate resource jars from static dependencies of android_library_import modules. Bug: 288358614 Test: TestAndroidLibraryOutputFilesRel Change-Id: I076f3c8e4ce42f71a52b612b77eb0265fa1e974c
This commit is contained in:
40
java/aar.go
40
java/aar.go
@@ -976,6 +976,7 @@ type AARImport struct {
|
|||||||
|
|
||||||
headerJarFile android.WritablePath
|
headerJarFile android.WritablePath
|
||||||
implementationJarFile android.WritablePath
|
implementationJarFile android.WritablePath
|
||||||
|
implementationAndResourcesJarFile android.WritablePath
|
||||||
proguardFlags android.WritablePath
|
proguardFlags android.WritablePath
|
||||||
exportPackage android.WritablePath
|
exportPackage android.WritablePath
|
||||||
transitiveAaptResourcePackagesFile android.Path
|
transitiveAaptResourcePackagesFile android.Path
|
||||||
@@ -1011,7 +1012,7 @@ func (a *AARImport) OutputFiles(tag string) (android.Paths, error) {
|
|||||||
case ".aar":
|
case ".aar":
|
||||||
return []android.Path{a.aarPath}, nil
|
return []android.Path{a.aarPath}, nil
|
||||||
case "":
|
case "":
|
||||||
return []android.Path{a.implementationJarFile}, nil
|
return []android.Path{a.implementationAndResourcesJarFile}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unsupported module reference tag %q", tag)
|
return nil, fmt.Errorf("unsupported module reference tag %q", tag)
|
||||||
}
|
}
|
||||||
@@ -1153,8 +1154,9 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
|
TransformJetifier(ctx, a.aarPath.(android.WritablePath), inputFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jarName := ctx.ModuleName() + ".jar"
|
||||||
extractedAARDir := android.PathForModuleOut(ctx, "aar")
|
extractedAARDir := android.PathForModuleOut(ctx, "aar")
|
||||||
classpathFile := extractedAARDir.Join(ctx, ctx.ModuleName()+".jar")
|
classpathFile := extractedAARDir.Join(ctx, jarName)
|
||||||
a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
|
a.manifest = extractedAARDir.Join(ctx, "AndroidManifest.xml")
|
||||||
a.rTxt = extractedAARDir.Join(ctx, "R.txt")
|
a.rTxt = extractedAARDir.Join(ctx, "R.txt")
|
||||||
a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
|
a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip")
|
||||||
@@ -1264,6 +1266,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
|
|
||||||
var staticJars android.Paths
|
var staticJars android.Paths
|
||||||
var staticHeaderJars android.Paths
|
var staticHeaderJars android.Paths
|
||||||
|
var staticResourceJars android.Paths
|
||||||
ctx.VisitDirectDeps(func(module android.Module) {
|
ctx.VisitDirectDeps(func(module android.Module) {
|
||||||
if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
if dep, ok := android.OtherModuleProvider(ctx, module, JavaInfoProvider); ok {
|
||||||
tag := ctx.OtherModuleDependencyTag(module)
|
tag := ctx.OtherModuleDependencyTag(module)
|
||||||
@@ -1271,6 +1274,7 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
case staticLibTag:
|
case staticLibTag:
|
||||||
staticJars = append(staticJars, dep.ImplementationJars...)
|
staticJars = append(staticJars, dep.ImplementationJars...)
|
||||||
staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
|
staticHeaderJars = append(staticHeaderJars, dep.HeaderJars...)
|
||||||
|
staticResourceJars = append(staticResourceJars, dep.ResourceJars...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
addCLCFromDep(ctx, module, a.classLoaderContexts)
|
addCLCFromDep(ctx, module, a.classLoaderContexts)
|
||||||
@@ -1279,18 +1283,39 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
var implementationJarFile android.OutputPath
|
var implementationJarFile android.OutputPath
|
||||||
if len(staticJars) > 0 {
|
if len(staticJars) > 0 {
|
||||||
combineJars := append(android.Paths{classpathFile}, staticJars...)
|
combineJars := append(android.Paths{classpathFile}, staticJars...)
|
||||||
implementationJarFile = android.PathForModuleOut(ctx, "combined", ctx.ModuleName()+".jar").OutputPath
|
implementationJarFile = android.PathForModuleOut(ctx, "combined", jarName).OutputPath
|
||||||
TransformJarsToJar(ctx, implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil)
|
TransformJarsToJar(ctx, implementationJarFile, "combine", combineJars, android.OptionalPath{}, false, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
implementationJarFile = classpathFile
|
implementationJarFile = classpathFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var resourceJarFile android.Path
|
||||||
|
if len(staticResourceJars) > 1 {
|
||||||
|
combinedJar := android.PathForModuleOut(ctx, "res-combined", jarName)
|
||||||
|
TransformJarsToJar(ctx, combinedJar, "for resources", staticResourceJars, android.OptionalPath{},
|
||||||
|
false, nil, nil)
|
||||||
|
resourceJarFile = combinedJar
|
||||||
|
} else if len(staticResourceJars) == 1 {
|
||||||
|
resourceJarFile = staticResourceJars[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge implementation jar with resources if necessary
|
||||||
|
implementationAndResourcesJar := implementationJarFile
|
||||||
|
if resourceJarFile != nil {
|
||||||
|
jars := android.Paths{resourceJarFile, implementationAndResourcesJar}
|
||||||
|
combinedJar := android.PathForModuleOut(ctx, "withres", jarName).OutputPath
|
||||||
|
TransformJarsToJar(ctx, combinedJar, "for resources", jars, android.OptionalPath{},
|
||||||
|
false, nil, nil)
|
||||||
|
implementationAndResourcesJar = combinedJar
|
||||||
|
}
|
||||||
|
|
||||||
|
a.implementationJarFile = implementationJarFile
|
||||||
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
|
// Save the output file with no relative path so that it doesn't end up in a subdirectory when used as a resource
|
||||||
a.implementationJarFile = implementationJarFile.WithoutRel()
|
a.implementationAndResourcesJarFile = implementationAndResourcesJar.WithoutRel()
|
||||||
|
|
||||||
if len(staticHeaderJars) > 0 {
|
if len(staticHeaderJars) > 0 {
|
||||||
combineJars := append(android.Paths{classpathFile}, staticHeaderJars...)
|
combineJars := append(android.Paths{classpathFile}, staticHeaderJars...)
|
||||||
a.headerJarFile = android.PathForModuleOut(ctx, "turbine-combined", ctx.ModuleName()+".jar")
|
a.headerJarFile = android.PathForModuleOut(ctx, "turbine-combined", jarName)
|
||||||
TransformJarsToJar(ctx, a.headerJarFile, "combine header jars", combineJars, android.OptionalPath{}, false, nil, nil)
|
TransformJarsToJar(ctx, a.headerJarFile, "combine header jars", combineJars, android.OptionalPath{}, false, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
a.headerJarFile = classpathFile
|
a.headerJarFile = classpathFile
|
||||||
@@ -1298,9 +1323,10 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
|
|
||||||
android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
|
android.SetProvider(ctx, JavaInfoProvider, JavaInfo{
|
||||||
HeaderJars: android.PathsIfNonNil(a.headerJarFile),
|
HeaderJars: android.PathsIfNonNil(a.headerJarFile),
|
||||||
|
ResourceJars: android.PathsIfNonNil(resourceJarFile),
|
||||||
TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
|
TransitiveLibsHeaderJars: a.transitiveLibsHeaderJars,
|
||||||
TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
|
TransitiveStaticLibsHeaderJars: a.transitiveStaticLibsHeaderJars,
|
||||||
ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationJarFile),
|
ImplementationAndResourcesJars: android.PathsIfNonNil(a.implementationAndResourcesJarFile),
|
||||||
ImplementationJars: android.PathsIfNonNil(a.implementationJarFile),
|
ImplementationJars: android.PathsIfNonNil(a.implementationJarFile),
|
||||||
StubsLinkType: Implementation,
|
StubsLinkType: Implementation,
|
||||||
// TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
|
// TransitiveAconfigFiles: // TODO(b/289117800): LOCAL_ACONFIG_FILES for prebuilts
|
||||||
@@ -1338,7 +1364,7 @@ func (a *AARImport) HeaderJars() android.Paths {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
|
func (a *AARImport) ImplementationAndResourcesJars() android.Paths {
|
||||||
return android.Paths{a.implementationJarFile}
|
return android.Paths{a.implementationAndResourcesJarFile}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
|
func (a *AARImport) DexJarBuildPath(ctx android.ModuleErrorfContext) OptionalDexJarPath {
|
||||||
|
@@ -136,18 +136,19 @@ func TestAndroidLibraryOutputFilesRel(t *testing.T) {
|
|||||||
android_library {
|
android_library {
|
||||||
name: "foo",
|
name: "foo",
|
||||||
srcs: ["a.java"],
|
srcs: ["a.java"],
|
||||||
|
java_resources: ["foo.txt"],
|
||||||
}
|
}
|
||||||
|
|
||||||
android_library_import {
|
android_library_import {
|
||||||
name: "bar",
|
name: "bar",
|
||||||
aars: ["bar.aar"],
|
aars: ["bar_prebuilt.aar"],
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
android_library_import {
|
android_library_import {
|
||||||
name: "baz",
|
name: "baz",
|
||||||
aars: ["baz.aar"],
|
aars: ["baz_prebuilt.aar"],
|
||||||
static_libs: ["bar"],
|
static_libs: ["foo", "bar"],
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
|
|
||||||
@@ -160,11 +161,11 @@ func TestAndroidLibraryOutputFilesRel(t *testing.T) {
|
|||||||
bazOutputPath := android.OutputFileForModule(android.PathContext(nil), baz.Module(), "")
|
bazOutputPath := android.OutputFileForModule(android.PathContext(nil), baz.Module(), "")
|
||||||
|
|
||||||
android.AssertPathRelativeToTopEquals(t, "foo output path",
|
android.AssertPathRelativeToTopEquals(t, "foo output path",
|
||||||
"out/soong/.intermediates/foo/android_common/javac/foo.jar", fooOutputPath)
|
"out/soong/.intermediates/foo/android_common/withres/foo.jar", fooOutputPath)
|
||||||
android.AssertPathRelativeToTopEquals(t, "bar output path",
|
android.AssertPathRelativeToTopEquals(t, "bar output path",
|
||||||
"out/soong/.intermediates/bar/android_common/aar/bar.jar", barOutputPath)
|
"out/soong/.intermediates/bar/android_common/aar/bar.jar", barOutputPath)
|
||||||
android.AssertPathRelativeToTopEquals(t, "baz output path",
|
android.AssertPathRelativeToTopEquals(t, "baz output path",
|
||||||
"out/soong/.intermediates/baz/android_common/combined/baz.jar", bazOutputPath)
|
"out/soong/.intermediates/baz/android_common/withres/baz.jar", bazOutputPath)
|
||||||
|
|
||||||
android.AssertStringEquals(t, "foo relative output path",
|
android.AssertStringEquals(t, "foo relative output path",
|
||||||
"foo.jar", fooOutputPath.Rel())
|
"foo.jar", fooOutputPath.Rel())
|
||||||
|
Reference in New Issue
Block a user