Skip to content

Commit

Permalink
Pack all multi-arch libraries from aar_import deps when using --fat_a…
Browse files Browse the repository at this point in the history
…pk_cpu

Currently if `--fat_apk_cpu` is specified with more than one architecture and there are `aar_import` dependencies containing shared libraries for multiple architectures, android_binary will only pack one of the shared libraries. This is because it's unaware of the split transition during artifact discovery.

RELNOTES: Fixed an issue with Android builds where `--fat_apk_cpu` doesn't pack all selected shared libraries from `aar_import` targets into the APK. See [bazelbuild#8283](bazelbuild#8283).

Fixes bazelbuild#8283

Closes bazelbuild#8510.

Change-Id: I5432aff47310c4ca8881d41be226829c98254ea5
PiperOrigin-RevId: 250776117
  • Loading branch information
jin authored and irengrig committed Jul 15, 2019
1 parent 01fb8db commit 0d71e75
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.google.devtools.build.lib.actions.ParamFileInfo;
import com.google.devtools.build.lib.actions.ParameterFile;
import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
import com.google.devtools.build.lib.analysis.AnalysisUtils;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
Expand All @@ -46,6 +47,7 @@
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
Expand Down Expand Up @@ -454,8 +456,20 @@ public static RuleConfiguredTargetBuilder createAndroidBinary(
derivedJarFunction,
proguardOutputMap);

NestedSet<Artifact> nativeLibsAar =
AndroidCommon.collectTransitiveNativeLibs(ruleContext).build();
// Collect all native shared libraries across split transitions. Some AARs contain shared
// libraries across multiple architectures, e.g. x86 and armeabi-v7a, and need to be packed
// into the APK.
NestedSetBuilder<Artifact> transitiveNativeLibs = NestedSetBuilder.naiveLinkOrder();
for (Map.Entry<
com.google.common.base.Optional<String>,
? extends List<? extends TransitiveInfoCollection>>
entry : ruleContext.getSplitPrerequisites("deps").entrySet()) {
for (AndroidNativeLibsInfo provider :
AnalysisUtils.getProviders(entry.getValue(), AndroidNativeLibsInfo.PROVIDER)) {
transitiveNativeLibs.addTransitive(provider.getNativeLibs());
}
}
NestedSet<Artifact> nativeLibsAar = transitiveNativeLibs.build();

DexPostprocessingOutput dexPostprocessingOutput =
androidSemantics.postprocessClassesDexZip(
Expand Down
1 change: 1 addition & 0 deletions src/test/shell/bazel/android/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ sh_test(
srcs = ["aar_integration_test.sh"],
data = [
":android_helper",
"//external:android_ndk_for_testing",
"//external:android_sdk_for_testing",
"//src/test/shell/bazel:test-deps",
],
Expand Down
27 changes: 27 additions & 0 deletions src/test/shell/bazel/android/aar_integration_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,31 @@ EOF
assert_one_of $apk_contents "res/layout/mylayout.xml"
}

function test_android_binary_fat_apk_contains_all_shared_libraries() {
create_new_workspace
setup_android_sdk_support
setup_android_ndk_support
# sample.aar contains native shared libraries for x86 and armeabi-v7a
cp "${TEST_SRCDIR}/io_bazel/src/test/shell/bazel/android/sample.aar" .
cat > AndroidManifest.xml <<EOF
<manifest package="com.example"/>
EOF
cat > BUILD <<EOF
aar_import(
name = "sample",
aar = "sample.aar",
)
android_binary(
name = "app",
custom_package = "com.example",
manifest = "AndroidManifest.xml",
deps = [":sample"],
)
EOF
assert_build :app --fat_apk_cpu=x86,armeabi-v7a
apk_contents="$(zipinfo -1 bazel-bin/app.apk)"
assert_one_of $apk_contents "lib/x86/libapp.so"
assert_one_of $apk_contents "lib/armeabi-v7a/libapp.so"
}

run_suite "aar_import integration tests"
Binary file modified src/test/shell/bazel/android/sample.aar
Binary file not shown.

0 comments on commit 0d71e75

Please sign in to comment.