Skip to content

Improve AndroidToolTask Error Reporting #7009

@jonpryor

Description

@jonpryor

Android application type

Classic Xamarin.Android (MonoAndroid12.0, etc.), Android for .NET (net6.0-android, etc.)

Affected platform version

All

Description

Context: https://developercommunity.visualstudio.com/t/Android-does-not-compile-R8-Could-not-c/10041869
Context: https://discord.com/channels/732297728826277939/732297837953679412/976106729123242034
Context? https://developercommunity.visualstudio.com/t/Xamarin-Forms-Android-project-will-not-b/10038789
Context: …

The ideal error message lets you know what went wrong in such a fashion that you can fix it.

This is not ideal:

1>R8 : error : Could not create the Java Virtual Machine.
1>R8 : error : A fatal exception has occurred. Program will exit.

Nor is this:

/usr/local/share/dotnet/packs/Microsoft.Android.Sdk.Darwin/32.0.300-rc.3.45/tools/Xamarin.Android.D8.targets(5,5): Error: java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj/Debug/net6.0-android/lp/63/jl/classes.jar : android/support/v4/app/INotificationSideChannel$Stub.class (WearOSNet6Test)

Nor is this:

Xamarin.Android.Common.targets: … error MSB6006: “java.exe” exited with code 1

We should do better.

"Guiding principal": if we need to ask someone for a diagnostic build log to understand a problem, we have failed. We must do better.

At minimum, we should update AndroidToolTask (and others) so that all output, stdout & stderr, is collected. When an error occurs, all output should be re-printed as part of the error message. (We currently attempt to do this in JavaToolTask, but it's clearly not doing enough. We need to improve JavaToolTask/etc. & do that everywhere.)

Additionally, we need to "demangle" our paths. Consider: https://discord.com/channels/732297728826277939/732297837953679412/976109392413990982

here's the problem

Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj/Debug/net6.0-android/lp/63/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj/Debug/net6.0-android/lp/4/jl/bin/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class

Where do obj/Debug/net6.0-android/lp/4/jl/bin/classes.jar:android and obj/Debug/net6.0-android/lp/63/classes.jar come from?

We know that we can use obj/Debug/net6.0-android/lp/map.cache to associate 4 with "something in lines 3-6 in map.cache" (yay off-by-one errors), but this isn't particularly helpful; it requires additional "back and forth" between the customer experiencing the error and us, trying to help the customer.

Instead, we should print additional error output, informing that obj/Debug/net6.0-android/lp/4 is from e.g. Xamarin.Android.Support.Annotations.dll, and obj/Debug/net6.0-android/63 is from e.g. androidx.core.core.aar.

This "demangling" should be done for all error messages, including "non-Java" tools such as aapt2.

Steps to Reproduce

Consider #7003:

  1. Download WearOSNet6Test.zip

  2. Extract it:

    unzip WearOSNet6Test.zip
    cd WearOSNet6Test
    
  3. Build it:

    dotnet build
    

Actual output:

C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.300-rc.1.4\tools\Xamarin.Android.D8.targets(79,5): error : java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\net6.0-android31\lp\59\jl\classes.jar : android/support/v4/app/INotificationSideChannel$Stub.class [C:\Users\jopryo\Downloads\WearOSNet6Test\WearOSNet6Test.csproj]

Desired output: something more useful?

error XA0000: Error in obj\Debug\net6.0-android31\lp\59\jl\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class: (TaskId:207)
error XA0000: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj\Debug\net6.0-android31\lp\59\jl\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj\Debug\net6.0-android31\lp\4\jl\bin\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class (TaskId:207)
error XA0000: Compilation failed (TaskId:207)
error XA0000: Exception in thread "main" java.lang.RuntimeException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\net6.0-android31\lp\59\jl\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:92) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.main(D8.java:4) (TaskId:207)
error XA0000: Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: obj\Debug\net6.0-android31\lp\59\jl\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class (TaskId:207)
error XA0000: 	at Version.fakeStackEntry(Version_3.1.51.java:0) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:68) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:28) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:27) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.b(SourceFile:3) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.a(D8.java:17) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.a(D8.java:15) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:84) (TaskId:207)
error XA0000: 	... 1 more (TaskId:207)
error XA0000: Caused by: com.android.tools.r8.internal.b: Type android.support.v4.app.INotificationSideChannel$Stub is defined multiple times: obj\Debug\net6.0-android31\lp\59\jl\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class, obj\Debug\net6.0-android31\lp\4\jl\bin\classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.il1.a(SourceFile:14) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.il1.a(SourceFile:22) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.lf1.b(SourceFile:6) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.lf1.a(SourceFile:23) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.lf1.a(SourceFile:10) (TaskId:207)
error XA0000: 	at java.base/java.util.concurrent.ConcurrentHashMap.merge(ConcurrentHashMap.java:2048) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.lf1.a(SourceFile:6) (TaskId:207)
error XA0000: 	at com.android.tools.r8.graph.r2$a.f(SourceFile:4) (TaskId:207)
error XA0000: 	at com.android.tools.r8.dex.b.a(SourceFile:96) (TaskId:207)
error XA0000: 	at com.android.tools.r8.dex.b.a(SourceFile:21) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.a(D8.java:21) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.d(D8.java:11) (TaskId:207)
error XA0000: 	at com.android.tools.r8.D8.c(D8.java:1) (TaskId:207)
error XA0000: 	at com.android.tools.r8.internal.oO0.a(SourceFile:24) (TaskId:207)
error XA0000: 	... 5 more (TaskId:207)
error XA0000: Directory `obj\Debug\net6.0-android31\lp\59` is from `androidx.core.core.aar`
error XA0000: Directory `obj\Debug\net6.0-android31\lp\4` is from `Xamarin.Android.Support.Compat.dll`

Did you find any workaround?

Collect diagnostic build output / .binlog files.

Everybody does that, right? Right?

(Narrator: no, not everybody does that.)

Relevant log output

No response

Metadata

Metadata

Assignees

Labels

Area: App+Library BuildIssues when building Library projects or Application projects.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions