-
Notifications
You must be signed in to change notification settings - Fork 564
Improve AndroidToolTask Error Reporting #7012
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
729d7fb to
c4f662b
Compare
jonathanpeppers
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a test we could add to just assert the error message is better now?
Maybe assert the assembly name from the AssemblyIdentityMap, and which we didn't have before?
I could try to write a test which produces the same error message and add that. |
|
@dellis1972 wrote: That's, uh, kinda unreadable, as it looks like all newlines are removed. Particularly odd is all the occurrences of Is there a good way to preserve newlines, so that the error message is more readable? |
@jonpryor I applied the changes and these are the actual results. With the Error list collapsed. With the Error List expanded. |
|
Proposed commit message: Proposed commit message:
```markdown
[Xamarin.Android.Build.Tasks] JavaToolTask Error Reporting (#7012)
Fixes: https://github.com/xamarin/xamarin-android/issues/7009
Context: https://github.com/xamarin/monodroid/commit/b60c77feb371ba4e3b4f1aea4d8dfd4edcedcac0
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` |
|
TODO: figure out why no error code is emitted. |
I figured it out. The |
Fixes: dotnet#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 XA1234: Error in obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class: error XA1234: 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 XA1234: Compilation failed error XA1234: 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 XA1234: at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:98) error XA1234: at com.android.tools.r8.D8.main(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:4) error XA1234: 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 XA1234: at Version.fakeStackEntry(Version_3.3.28.java:0) error XA1234: at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:75) error XA1234: … error XA1234: 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 XA1234: at com.android.tools.r8.internal.DT.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:14) error XA1234: … 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 XA1234: Directory `obj/Debug/net7.0-android/lp/59` is from `androidx.interpolator.interpolator.aar` error XA1234: Directory `obj/Debug/net7.0-android/lp/4` is from `Xamarin.Android.Support.Compat.dll`



Fixes #7009
Our build system currently isn't great at reporting Java tooling errors. Users are constantly required to turn on diagnostic
logging in order to see what causes the probem. They currently see output like this
Which is not helpful. So the problem was that in the
ProcessOutputmethod there was an if statement to detectjava errors. If it found one, it would log that exception and then abort the processing of the output. This resulted in
only the first line of the error being logged as an actual error. The rest would be logged as typical output.
So if we detect an error we should continue to process the output so that we get the entire thing. The resulting error
will look like this in Visual Studio.
It will contain ALL the data from the error message. But also some additional information to help users unpack the
mappeddirectories in thelpfolder.