diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index 1ed8538c60e599..3799714ea24623 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -1815,7 +1815,7 @@ static Artifact createMainDexListAction( Artifact jar, @Nullable Artifact mainDexProguardSpec, @Nullable Artifact proguardOutputMap) - throws InterruptedException { + throws InterruptedException, RuleErrorException { AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); // Create the main dex classes list. Artifact mainDexList = AndroidBinary.getDxArtifact(ruleContext, "main_dex_list.txt"); @@ -1841,6 +1841,11 @@ static Artifact createMainDexListAction( // legacy_main_dex_list_generator is provided, use that tool instead. // TODO(b/147692286): Remove the old main-dex list generation that relied on ProGuard. if (legacyMainDexListGenerator == null) { + if (sdk.getShrinkedAndroidJar() == null) { + ruleContext.throwWithRuleError( + "In \"legacy\" multidex mode, either legacy_main_dex_list_generator or " + + "shrinked_android_jar must be set in the android_sdk."); + } // Process the input jar through Proguard into an intermediate, streamlined jar. Artifact strippedJar = AndroidBinary.getDxArtifact(ruleContext, "main_dex_intermediate.jar"); SpawnAction.Builder streamlinedBuilder = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java index df268c20c81b43..fc860b05add2ee 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java @@ -54,7 +54,7 @@ public final class AndroidSdkProvider extends NativeInfo private final TransitiveInfoCollection aidlLib; private final Artifact androidJar; private final Artifact sourceProperties; - private final Artifact shrinkedAndroidJar; + @Nullable private final Artifact shrinkedAndroidJar; private final Artifact mainDexClasses; private final FilesToRunProvider adb; private final FilesToRunProvider dx; @@ -75,7 +75,7 @@ public AndroidSdkProvider( @Nullable TransitiveInfoCollection aidlLib, Artifact androidJar, @Nullable Artifact sourceProperties, - Artifact shrinkedAndroidJar, + @Nullable Artifact shrinkedAndroidJar, Artifact mainDexClasses, FilesToRunProvider adb, FilesToRunProvider dx, @@ -234,6 +234,7 @@ public Artifact getSourceProperties() { } @Override + @Nullable public Artifact getShrinkedAndroidJar() { return shrinkedAndroidJar; } @@ -320,7 +321,7 @@ public AndroidSdkProvider createInfo( Object aidlLib, Artifact androidJar, Object sourceProperties, - Artifact shrinkedAndroidJar, + Object shrinkedAndroidJar, Artifact mainDexClasses, FilesToRunProvider adb, FilesToRunProvider dx, @@ -341,7 +342,7 @@ public AndroidSdkProvider createInfo( fromNoneable(aidlLib, TransitiveInfoCollection.class), androidJar, fromNoneable(sourceProperties, Artifact.class), - shrinkedAndroidJar, + fromNoneable(shrinkedAndroidJar, Artifact.class), mainDexClasses, adb, dx, diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java index f1d91f1df7d6f2..c25fabe5a92791 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java @@ -80,7 +80,13 @@ public interface AndroidSdkProviderApi< @Nullable FileT getSourceProperties(); - @StarlarkMethod(name = "shrinked_android_jar", structField = true, doc = "", documented = false) + @StarlarkMethod( + name = "shrinked_android_jar", + structField = true, + doc = "", + documented = false, + allowReturnNones = true) + @Nullable FileT getShrinkedAndroidJar(); @StarlarkMethod(name = "main_dex_classes", structField = true, doc = "", documented = false) @@ -186,7 +192,11 @@ interface Provider< name = "shrinked_android_jar", doc = "An artifact of the shrunk Android Jar.", positional = true, - named = false), + named = false, + allowedTypes = { + @ParamType(type = FileApi.class), + @ParamType(type = NoneType.class), + }), @Param( name = "main_dex_classes", doc = "An artifact of the main dex classes.", @@ -270,7 +280,7 @@ AndroidSdkProviderApi createInfo( Object aidlLib, FileT androidJar, Object sourceProperties, - FileT shrinkedAndroidJar, + Object shrinkedAndroidJar, FileT mainDexClasses, FilesToRunProviderT adb, FilesToRunProviderT dx, diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java index f7caed4237fcc5..a65cd88c46dee0 100644 --- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java +++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidSdkProvider.java @@ -53,6 +53,7 @@ public FileApi getSourceProperties() { return null; } + @Nullable @Override public FileApi getShrinkedAndroidJar() { return null; @@ -144,7 +145,7 @@ public static class FakeProvider Object aidlLib, FileApi androidJar, Object sourceProperties, - FileApi shrinkedAndroidJar, + Object shrinkedAndroidJar, FileApi mainDexClasses, FilesToRunProviderApi adb, FilesToRunProviderApi dx,