Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Xamarin.Android.Build.Tasks] JavaToolTask Error Reporting (#7012)
Fixes: #7009 Context: xamarin/monodroid@b60c77f Let's create a `java`-related error message! 1. Create an `android` app: dotnet new -n bad_error 2. Edit `bad_error.csproj` to change `$(SupportedOSPlatformVersion)`=23, and add this item group: <ItemGroup> <PackageReference Include="Xamarin.AndroidX.Wear" Version="1.2.0.5" /> <PackageReference Include="Xamarin.Android.Wear" Version="2.2.0" /> <PackageReference Include="Xamarin.AndroidX.PercentLayout" Version="1.0.0.14" /> <PackageReference Include="Xamarin.AndroidX.Legacy.Support.Core.UI" Version="1.0.0.14" /> </ItemGroup> 3. Build dotnet build bad_error/bad_error.csproj It should fail to build: error : java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net7.0-android/lp/59/jl/classes.jar : android/support/v4/app/INotificationSideChannel$Stub.class It is expected to fail. The problem is that *why* it fails is opaque, and thus it's very hard to know what the problem is so that it can be fixed. If you rebuild with diagnostic logging enabled: dotnet build -v diag bad_error/bad_error.csproj We get additional, *useful*, contextual information: Task "D8" Task Parameter:JavaMaximumHeapSize=1G Task Parameter:OutputDirectory=obj/Debug/net7.0-android/android/bin/ Task Parameter: JavaLibrariesToEmbed= …/dotnet/packs/Microsoft.Android.Ref.32/33.0.0-preview.4.20/ref/net7.0/mono.android.jar … Task Parameter:JarPath=…/dotnet/packs/Microsoft.Android.Sdk.Darwin/33.0.0-preview.4.20/tools/r8.jar … processing ClassesZip, JavaLibrariesToEmbed... $HOME/android-toolchain/jdk-11/bin/java -Xmx1G -classpath …/dotnet/packs/Microsoft.Android.Sdk.Darwin/33.0.0-preview.4.20/tools/r8.jar com.android.tools.r8.D8 --debug --min-api 23 --output obj/Debug/net7.0-android/android/bin/ … Error in obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj/Debug/net7.0-android/lp/4/jl/bin/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class Compilation failed Exception in thread "main" java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:98) at com.android.tools.r8.D8.main(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:4) Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class at Version.fakeStackEntry(Version_3.3.28.java:0) at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:75) … Caused by: com.android.tools.r8.internal.f: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj/Debug/net7.0-android/lp/4/jl/bin/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class at com.android.tools.r8.internal.DT.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:14) … *Now* we see what the error is: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: The fundamental problem is that this entire process is "broken": we shouldn't require that the project be rebuilt with diagnostic logging enabled in order to *begin* to understand what the error was. Part of why the original error message was so "unhelpful" was because of an explicit attempt to produce a more "helpful" message; from xamarin/monodroid@b60c77fe > we need to pick out the exception and then ignore the rest of the > infromation [sic]. We also need to produce more 'helpful' messages > to the user for these kind of exceptions. In retrospect, attempting to "trim out extraneous information" was a mistake, as it's very hard to know what is and isn't extraneous. Improve `<JavaToolTask/>` so that we go the other way: capture *all* output from `java`, and when an error is detected, dump out all the output from the `java` command. This way, instead of: error : java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: … we can provide a more complete error message *without* needing to enable diagnostic logs: error JAVA0000: Error in obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class: error JAVA0000: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj/Debug/net7.0-android/lp/4/jl/bin/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class error JAVA0000: Compilation failed error JAVA0000: Exception in thread "main" java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class error JAVA0000: at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:98) error JAVA0000: at com.android.tools.r8.D8.main(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:4) error JAVA0000: Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class error JAVA0000: at Version.fakeStackEntry(Version_3.3.28.java:0) error JAVA0000: at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:75) error JAVA0000: … error JAVA0000: Caused by: com.android.tools.r8.internal.f: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj/Debug/net7.0-android/lp/4/jl/bin/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class error JAVA0000: at com.android.tools.r8.internal.DT.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:14) error JAVA0000: … Unfortunately, this error message is still cryptic: what does `obj/Debug/net7.0-android/lp/59/jl/classes.jar` come from? What about `obj/Debug/net7.0-android/lp/4/jl/bin/classes.jar`? At the end of the full `java` output, dump a mapping of the encountered `…/lp/…` paths to where they came from: error JAVA0000: Directory `obj/Debug/net7.0-android/lp/59` is from `androidx.interpolator.interpolator.aar` error JAVA0000: Directory `obj/Debug/net7.0-android/lp/4` is from `Xamarin.Android.Support.Compat.dll`
- Loading branch information