Sandbox should not mount directory for nonempty tree artifacts.

Instead they mount the individual files. Currently, non-empty tree artifacts result in ERR_DIRECTORY_NOT_EMPTY because we attempt to mount both the directory and the files inside it.

Fixes https://github.com/bazelbuild/bazel/issues/1745.

--
PiperOrigin-RevId: 141599030
MOS_MIGRATED_REVID=141599030
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
index 1bfa16b..0abf331 100644
--- a/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/sandbox/SpawnHelpers.java
@@ -30,6 +30,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -193,8 +194,14 @@
     // inputs.
     for (ActionInput input : spawn.getInputFiles()) {
       if (input instanceof Artifact && ((Artifact) input).isTreeArtifact()) {
-        PathFragment mount = new PathFragment(input.getExecPathString());
-        mounts.put(mount, execRoot.getRelative(mount));
+        List<Artifact> containedArtifacts = new ArrayList<>();
+        actionExecutionContext.getArtifactExpander().expand((Artifact) input, containedArtifacts);
+        // Attempting to mount a non-empty directory results in ERR_DIRECTORY_NOT_EMPTY, so we only
+        // mount empty TreeArtifacts as directories.
+        if (containedArtifacts.isEmpty()) {
+          PathFragment mount = new PathFragment(input.getExecPathString());
+          mounts.put(mount, execRoot.getRelative(mount));
+        }
       }
     }
 
diff --git a/src/test/shell/bazel/android/android_integration_test.sh b/src/test/shell/bazel/android/android_integration_test.sh
index e8f4509..3cedc40 100755
--- a/src/test/shell/bazel/android/android_integration_test.sh
+++ b/src/test/shell/bazel/android/android_integration_test.sh
@@ -257,6 +257,28 @@
   bazel build :test
 }
 
+function test_nonempty_aar_resources_tree_artifact() {
+  create_new_workspace
+  setup_android_support
+  cat > AndroidManifest.xml <<EOF
+<manifest package="com.test"/>
+EOF
+  mkdir -p res/values
+  cat > res/values/values.xml <<EOF
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+</resources>
+EOF
+  zip test.aar AndroidManifest.xml res/values/values.xml
+  cat > BUILD <<EOF
+aar_import(
+  name = "test",
+  aar = "test.aar",
+)
+EOF
+  bazel build :test
+}
+
 # ndk r10 and earlier
 if [[ ! -r "${TEST_SRCDIR}/androidndk/ndk/RELEASE.TXT" ]]; then
   # ndk r11 and later