Skip to content

Commit 1e77944

Browse files
ahumeskycopybara-github
authored andcommitted
Enable aar_import JNI libs to work with --android_platforms.
Fixes #21225 PiperOrigin-RevId: 610551472 Change-Id: I7e62919dd41d0d4e2b923df1942920162f554809
1 parent 9fbfbd2 commit 1e77944

4 files changed

Lines changed: 76 additions & 4 deletions

File tree

src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414
package com.google.devtools.build.lib.rules.android;
1515

16+
1617
import com.google.common.collect.ImmutableList;
1718
import com.google.common.collect.ImmutableMap;
1819
import com.google.common.collect.ImmutableSet;
@@ -33,8 +34,11 @@
3334
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
3435
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
3536
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
37+
import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
38+
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
3639
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
3740
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
41+
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
3842
import com.google.devtools.build.lib.rules.android.databinding.DataBinding;
3943
import com.google.devtools.build.lib.rules.android.databinding.DataBindingV2Provider;
4044
import com.google.devtools.build.lib.rules.java.ImportDepsCheckActionBuilder;
@@ -54,6 +58,7 @@
5458
import com.google.devtools.build.lib.starlarkbuildapi.android.DataBindingV2ProviderApi;
5559
import com.google.devtools.build.lib.vfs.PathFragment;
5660
import java.util.List;
61+
import java.util.Map;
5762
import javax.annotation.Nullable;
5863

5964
/**
@@ -466,7 +471,48 @@ private static SpawnAction createAarJarsMergingActions(
466471
}
467472

468473
private static SpawnAction createAarNativeLibsFilterActions(
469-
RuleContext ruleContext, Artifact aar, Artifact outputZip) {
474+
RuleContext ruleContext, Artifact aar, Artifact outputZip) throws RuleErrorException {
475+
476+
BuildConfigurationValue configuration = ruleContext.getConfiguration();
477+
478+
String cpu = null;
479+
AndroidConfiguration androidConfiguration =
480+
configuration.getFragment(AndroidConfiguration.class);
481+
482+
if (androidConfiguration.incompatibleUseToolchainResolution()) {
483+
484+
// Maps a CPU name as used in an AAR to the corresponding CPU constraint.
485+
ImmutableMap<String, ConstraintValueInfo> aarCpuToConstraint =
486+
ImmutableMap.of(
487+
"arm64-v8a",
488+
ruleContext.getPrerequisite("$constraint_arm64", ConstraintValueInfo.PROVIDER),
489+
"armeabi-v7a",
490+
ruleContext.getPrerequisite("$constraint_armv7", ConstraintValueInfo.PROVIDER),
491+
"x86", ruleContext.getPrerequisite("$constraint_x86", ConstraintValueInfo.PROVIDER),
492+
"x86_64",
493+
ruleContext.getPrerequisite("$constraint_x86_64", ConstraintValueInfo.PROVIDER));
494+
495+
for (Map.Entry<String, ConstraintValueInfo> e : aarCpuToConstraint.entrySet()) {
496+
if (ruleContext.targetPlatformHasConstraint(e.getValue())) {
497+
cpu = e.getKey();
498+
break;
499+
}
500+
}
501+
502+
if (cpu == null) {
503+
throw ruleContext.throwWithRuleError(
504+
String.format(
505+
"Target platform %s does not match one of the applicable CPU constraints for"
506+
+ " aar_import %s. Applicable CPU constraints are listed in"
507+
+ " https://blog.bazel.build/2023/11/15/android-platforms.html",
508+
ruleContext.getToolchainContexts().getTargetPlatform().label(),
509+
ruleContext.getLabel()));
510+
}
511+
512+
} else {
513+
cpu = configuration.getCpu();
514+
}
515+
470516
SpawnAction.Builder actionBuilder = new SpawnAction.Builder();
471517
ParamFileInfo paramFileInfo = getParamFileInfo(ruleContext);
472518
modifyExecutionInfo(ruleContext, actionBuilder);
@@ -481,7 +527,7 @@ private static SpawnAction createAarNativeLibsFilterActions(
481527
.addCommandLine(
482528
CustomCommandLine.builder()
483529
.addExecPath("--input_aar", aar)
484-
.add("--cpu", ruleContext.getConfiguration().getCpu())
530+
.add("--cpu", cpu)
485531
.addExecPath("--output_zip", outputZip)
486532
.build(),
487533
paramFileInfo)

src/main/java/com/google/devtools/build/lib/rules/android/AarImportBaseRule.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.devtools.build.lib.analysis.RuleDefinition;
2222
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
2323
import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
24+
import com.google.devtools.build.lib.cmdline.Label;
2425
import com.google.devtools.build.lib.packages.RuleClass;
2526
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
2627
import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
@@ -92,6 +93,18 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env)
9293
.cfg(ExecutionTransitionFactory.createFactory())
9394
.exec()
9495
.value(env.getToolsLabel("//tools/zip:zipper")))
96+
.add(
97+
attr("$constraint_arm64", LABEL)
98+
.value(Label.parseCanonicalUnchecked("@platforms//cpu:arm64")))
99+
.add(
100+
attr("$constraint_armv7", LABEL)
101+
.value(Label.parseCanonicalUnchecked("@platforms//cpu:armv7")))
102+
.add(
103+
attr("$constraint_x86", LABEL)
104+
.value(Label.parseCanonicalUnchecked("@platforms//cpu:x86_32")))
105+
.add(
106+
attr("$constraint_x86_64", LABEL)
107+
.value(Label.parseCanonicalUnchecked("@platforms//cpu:x86_64")))
95108
.advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
96109
.requiresConfigurationFragments(AndroidConfiguration.class, JavaConfiguration.class)
97110
.build();

src/test/shell/bazel/android/aar_integration_test.sh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ EOF
8383
function test_android_binary_depends_on_aar() {
8484
create_new_workspace
8585
setup_android_sdk_support
86+
setup_android_platforms
87+
8688
cat > AndroidManifest.xml <<EOF
8789
<manifest package="com.example"/>
8890
EOF
@@ -91,9 +93,15 @@ EOF
9193
<?xml version="1.0" encoding="utf-8"?>
9294
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" />
9395
EOF
96+
9497
mkdir assets
9598
echo "some asset" > assets/a
96-
zip example.aar AndroidManifest.xml res/layout/mylayout.xml assets/a
99+
100+
mkdir -p jni/armeabi-v7a
101+
echo "an armeabi-v7a so" > jni/armeabi-v7a/libjni.so
102+
103+
zip example.aar AndroidManifest.xml res/layout/mylayout.xml assets/a jni/armeabi-v7a/libjni.so
104+
97105
cat > BUILD <<EOF
98106
aar_import(
99107
name = "example",
@@ -106,10 +114,12 @@ android_binary(
106114
deps = [":example"],
107115
)
108116
EOF
109-
assert_build :app
117+
118+
assert_build :app --android_platforms=//test_android_platforms:simple
110119
apk_contents="$(zipinfo -1 bazel-bin/app.apk)"
111120
assert_one_of $apk_contents "assets/a"
112121
assert_one_of $apk_contents "res/layout/mylayout.xml"
122+
assert_one_of $apk_contents "lib/armeabi-v7a/libjni.so"
113123
}
114124

115125
function test_android_binary_fat_apk_contains_all_shared_libraries() {

src/test/shell/bazel/android/android_sdk_integration_test.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,15 @@ function test_specifying_android_sdk_flag() {
8585
create_new_workspace
8686
setup_android_sdk_support
8787
create_android_binary
88+
setup_android_platforms
89+
8890
cat >> $(create_workspace_with_default_repos WORKSPACE) <<EOF
8991
android_sdk_repository(
9092
name = "a",
9193
)
9294
EOF
9395
ANDROID_HOME=$ANDROID_SDK bazel build --android_sdk=@a//:sdk-24 \
96+
--android_platforms=//test_android_platforms:simple \
9497
//java/bazel:bin || fail "build with --android_sdk failed"
9598
}
9699

0 commit comments

Comments
 (0)