Reland "Also package recursive jni_libs deps of android_apps as well as direct deps." with bug fix.

This time, exclude NDK libraries instead of LLNDK libraries from the
package. This is necessary because there are libraries such as libvndksupport
which are LLNDK but are not accessible to apps.

Original commit message:
> Previously, android_app targets for which a.shouldEmbedJnis(ctx) = true
> (e.g. CtsSelinuxTargetSdk25TestCases) would need to specify all of their
> recursive library dependencies, including for example libc++ when depending
> on the platform libc++. This means unnecessary churn when we add a new
> dependency to libc++ (e.g. libunwind [1]). To avoid the churn and allow
> jni_libs clauses to be simplified, make the build system search for the
> recursive dependencies and automatically include them.
>
> This change allows us to remove code that was previously adding NDK libc++
> as a special case, as it is now covered by the generic code.
>
> Also fix some improper quoting that was exposed as a result of this change
> causing more files to be packaged than before.
>
> [1] https://android-review.googlesource.com/q/topic:%22libunwind-so%22

Bug: 144430859
Test: atest CtsAppOpsTestCases
Test: atest FrameworksNetSmokeTests
Change-Id: I8311ede0b44d7e50b9f272912ead8ef07e82b074
This commit is contained in:
Peter Collingbourne 2019-12-17 16:46:18 -08:00
parent 9fd9b92d51
commit ad84f975d2
5 changed files with 69 additions and 22 deletions

View File

@ -755,7 +755,7 @@ func (c *Module) isCoverageVariant() bool {
return c.coverage.Properties.IsCoverageVariant
}
func (c *Module) isNdk() bool {
func (c *Module) IsNdk() bool {
return inList(c.Name(), ndkMigratedLibs)
}
@ -995,7 +995,7 @@ func (ctx *moduleContextImpl) useVndk() bool {
}
func (ctx *moduleContextImpl) isNdk() bool {
return ctx.mod.isNdk()
return ctx.mod.IsNdk()
}
func (ctx *moduleContextImpl) isLlndk(config android.Config) bool {

View File

@ -167,18 +167,11 @@ func (a *AndroidApp) DepsMutator(ctx android.BottomUpMutatorContext) {
a.aapt.deps(ctx, sdkDep)
}
tag := &jniDependencyTag{}
for _, jniTarget := range ctx.MultiTargets() {
variation := append(jniTarget.Variations(),
blueprint.Variation{Mutator: "link", Variation: "shared"})
tag := &jniDependencyTag{
target: jniTarget,
}
ctx.AddFarVariationDependencies(variation, tag, a.appProperties.Jni_libs...)
if String(a.appProperties.Stl) == "c++_shared" {
if a.shouldEmbedJnis(ctx) {
ctx.AddFarVariationDependencies(variation, tag, "ndk_libc++_shared")
}
}
}
a.usesLibrary.deps(ctx, sdkDep.hasFrameworkLibs())
@ -471,7 +464,7 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
dexJarFile := a.dexBuildActions(ctx)
jniLibs, certificateDeps := collectAppDeps(ctx)
jniLibs, certificateDeps := collectAppDeps(ctx, a.shouldEmbedJnis(ctx))
jniJarFile := a.jniBuildActions(jniLibs, ctx)
if ctx.Failed() {
@ -507,22 +500,33 @@ func (a *AndroidApp) generateAndroidBuildActions(ctx android.ModuleContext) {
}
}
func collectAppDeps(ctx android.ModuleContext) ([]jniLib, []Certificate) {
func collectAppDeps(ctx android.ModuleContext, shouldCollectRecursiveNativeDeps bool) ([]jniLib, []Certificate) {
var jniLibs []jniLib
var certificates []Certificate
seenModulePaths := make(map[string]bool)
ctx.VisitDirectDeps(func(module android.Module) {
ctx.WalkDeps(func(module android.Module, parent android.Module) bool {
otherName := ctx.OtherModuleName(module)
tag := ctx.OtherModuleDependencyTag(module)
if jniTag, ok := tag.(*jniDependencyTag); ok {
if IsJniDepTag(tag) || tag == cc.SharedDepTag {
if dep, ok := module.(*cc.Module); ok {
if dep.IsNdk() || dep.IsStubs() {
return false
}
lib := dep.OutputFile()
path := lib.Path()
if seenModulePaths[path.String()] {
return false
}
seenModulePaths[path.String()] = true
if lib.Valid() {
jniLibs = append(jniLibs, jniLib{
name: ctx.OtherModuleName(module),
path: lib.Path(),
target: jniTag.target,
path: path,
target: module.Target(),
})
} else {
ctx.ModuleErrorf("dependency %q missing output file", otherName)
@ -530,13 +534,19 @@ func collectAppDeps(ctx android.ModuleContext) ([]jniLib, []Certificate) {
} else {
ctx.ModuleErrorf("jni_libs dependency %q must be a cc library", otherName)
}
} else if tag == certificateTag {
return shouldCollectRecursiveNativeDeps
}
if tag == certificateTag {
if dep, ok := module.(*AndroidAppCertificate); ok {
certificates = append(certificates, dep.Certificate)
} else {
ctx.ModuleErrorf("certificate dependency %q must be an android_app_certificate module", otherName)
}
}
return false
})
return jniLibs, certificates
@ -968,7 +978,7 @@ func (a *AndroidAppImport) generateAndroidBuildActions(ctx android.ModuleContext
ctx.ModuleErrorf("One and only one of certficate, presigned, and default_dev_cert properties must be set")
}
_, certificates := collectAppDeps(ctx)
_, certificates := collectAppDeps(ctx, false)
// TODO: LOCAL_EXTRACT_APK/LOCAL_EXTRACT_DPI_APK
// TODO: LOCAL_PACKAGE_SPLITS

View File

@ -200,14 +200,14 @@ func TransformJniLibsToJar(ctx android.ModuleContext, outputFile android.Writabl
}
if uncompressJNI {
jarArgs = append(jarArgs, "-L 0")
jarArgs = append(jarArgs, "-L", "0")
}
for _, j := range jniLibs {
deps = append(deps, j.path)
jarArgs = append(jarArgs,
"-P "+targetToJniDir(j.target),
"-f "+j.path.String())
"-P", targetToJniDir(j.target),
"-f", j.path.String())
}
ctx.Build(pctx, android.BuildParams{

View File

@ -1630,8 +1630,46 @@ func TestAndroidTestImport(t *testing.T) {
func TestStl(t *testing.T) {
ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
cc_library {
name: "ndk_libunwind",
sdk_version: "current",
stl: "none",
system_shared_libs: [],
}
cc_library {
name: "libc.ndk.current",
sdk_version: "current",
stl: "none",
system_shared_libs: [],
}
cc_library {
name: "libm.ndk.current",
sdk_version: "current",
stl: "none",
system_shared_libs: [],
}
cc_library {
name: "libdl.ndk.current",
sdk_version: "current",
stl: "none",
system_shared_libs: [],
}
cc_object {
name: "ndk_crtbegin_so.27",
}
cc_object {
name: "ndk_crtend_so.27",
}
cc_library {
name: "libjni",
sdk_version: "current",
stl: "c++_shared",
}
android_test {

View File

@ -466,7 +466,6 @@ type dependencyTag struct {
type jniDependencyTag struct {
blueprint.BaseDependencyTag
target android.Target
}
func IsJniDepTag(depTag blueprint.DependencyTag) bool {