Skip to content

Commit

Permalink
[AndroidToolTask] Log tool output as error (#8861)
Browse files Browse the repository at this point in the history
`AndroidToolTask.Execute()` logs full tool output on error

Context: xamarin/xamarin-android-tools#208
Context: b002dc3

Very often the *context* to understand a tool error isn't printed to
stderr, but is instead printed earlier to stdout.  For example,
consider this annotated `r8` output snippet from
b002dc38 (`[stderr]` and `[stdout]` are
annotations):

	% $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/ …
	[stdout] Error in obj/Debug/net7.0-android/lp/59/jl/classes.jar:android/support/v4/app/INotificationSideChannel$Stub.class:
	[stdout] 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
	[stdout] Compilation failed
	[stdout] 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
	[stdout] 	at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:98)
	[stdout] 	at com.android.tools.r8.D8.main(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:4)
	[stdout] 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
	[stdout] 	at Version.fakeStackEntry(Version_3.3.28.java:0)
	[stdout] 	at com.android.tools.r8.internal.Bj.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:75)
	[stdout] 	…
	[stdout] 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
	[stdout] 	at com.android.tools.r8.internal.DT.a(R8_3.3.28_2aaf796388b4e9f6bed752d926eca110512a53a3f09a8d755196089c1cfdf799:14)
	[stdout] 	…
	[stderr] 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

When originally processed, the *only* output included in the error
message was the the only line written to stderr:

	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

The fix in b002dc38 was to update
`<JavaToolTask/>` to capture *all* output from `java …`, and when an
error occurred, dump *all* of it.

Bump to xamarin/xamarin-android-tools@1ea4e35eaf which updates
`AndroidToolTask` to do the same thing, "lowering" the logic
into a common base class of `<JavaToolTask/>`: capture all output
(stdout & stderr) from the tool, and when an error occurs, log *all*
of the captured output into an `XAccc0000` error message.

`ccc` is the `AndroidToolTask.TaskPrefix` property.

The `<Exec/>` tasks that ran `adb` directly have been replaced with
`<AndroidAdb/>` instances.  This task inherits from `AndroidToolTask`
and will now benefit from improved error logging.

Changes: xamarin/xamarin-android-tools@05f9a90...1ea4e35
  * xamarin/xamarin-android-tools@1ea4e35: [AndroidToolTask] Log tool output as error
  * xamarin/xamarin-android-tools@c8a5b5b: Check for ANDROID_HOME Sdk location on Windows
  • Loading branch information
pjcollins committed Apr 23, 2024
1 parent 7938f14 commit 771ee1d
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 17 deletions.
Expand Up @@ -7,6 +7,7 @@ This file contains targets specific for Android application projects.
***********************************************************************************************
-->
<Project>
<UsingTask TaskName="Xamarin.Android.Tasks.AndroidAdb" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
<UsingTask TaskName="Xamarin.Android.Tasks.GetAndroidActivityName" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />
<UsingTask TaskName="Xamarin.Android.BuildTools.PrepTasks.XASleepInternal" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />

Expand Down Expand Up @@ -55,17 +56,54 @@ This file contains targets specific for Android application projects.

<Message Text="Preparing application to log more information" Importance="High" />
<Message Text="Setting the debug.mono.log property to: $(_MonoLog)" Importance="High" />
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) shell setprop debug.mono.log $(_MonoLog)" />
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) logcat -G 16M" />
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) logcat -c" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="setprop debug.mono.log $(_MonoLog)"
/>
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="logcat"
Arguments="-G 16M"
/>
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="logcat"
Arguments="-c"
/>

<Message Text="Running the application and waiting for it to fully start" Importance="High" />
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) shell am start -S -W -n &quot;$(_AndroidPackage)/$(AndroidLaunchActivity)&quot;" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="am start -S -W -n &quot;$(_AndroidPackage)/$(AndroidLaunchActivity)&quot;"
/>

<Message Text="Sleeping for $(RunLogDelayInMS)ms to give logcat a chance to log all the messages" Importance="High" />
<XASleepInternal Milliseconds="$(RunLogDelayInMS)" />

<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) logcat -d > &quot;$(_RunLogFilePath)&quot;" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="logcat"
Arguments="-d"
>
<Output TaskParameter="Result" PropertyName="_LogcatOutput" />
</AndroidAdb>
<WriteLinesToFile
File="$(_RunLogFilePath)"
Lines="$(_LogcatOutput)"
Overwrite="true"
/>
<Message Text="Logcat output is available in $(_RunLogFilePath)" Importance="High" />
</Target>
</Project>
3 changes: 2 additions & 1 deletion src/Xamarin.Android.Build.Tasks/Tasks/AndroidZipAlign.cs
Expand Up @@ -48,7 +48,8 @@ protected override void LogEventsFromTextOutput (string singleLine, MessageImpor
{
if (ExitCode != 0)
Log.LogCodedError (DefaultErrorCode, singleLine);
base.LogEventsFromTextOutput (singleLine, messageImportance);
else
base.LogEventsFromTextOutput (singleLine, messageImportance);
}
}
}
Expand Down
Expand Up @@ -11,6 +11,7 @@ Copyright (C) 2019 Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Xamarin.Android.Tasks.AndroidAdb" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.GetAndroidActivityName" AssemblyFile="Xamarin.Android.Build.Tasks.dll" />
<Target Name="StartAndroidActivity"
DependsOnTargets="_ResolveMonoAndroidSdks;_GetAndroidPackageName">
Expand All @@ -19,11 +20,23 @@ Copyright (C) 2019 Microsoft Corporation. All rights reserved.
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml">
<Output TaskParameter="ActivityName" PropertyName="AndroidLaunchActivity" />
</GetAndroidActivityName>
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) shell am start -S -n &quot;$(_AndroidPackage)/$(AndroidLaunchActivity)&quot;" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="am start -S -n &quot;$(_AndroidPackage)/$(AndroidLaunchActivity)&quot;"
/>
</Target>
<Target Name="StopAndroidPackage"
DependsOnTargets="_ResolveMonoAndroidSdks;_GetAndroidPackageName">
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) shell am force-stop &quot;$(_AndroidPackage)&quot;" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="am force-stop &quot;$(_AndroidPackage)&quot;"
/>
</Target>
<PropertyGroup>
<AndroidAotCustomProfilePath Condition=" '$(AndroidAotCustomProfilePath)' == '' ">custom.aprof</AndroidAotCustomProfilePath>
Expand All @@ -42,14 +55,26 @@ Copyright (C) 2019 Microsoft Corporation. All rights reserved.
</PropertyGroup>
</Target>
<Target Name="_SetAotProfilingPropsOnDevice">
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) shell setprop debug.mono.profile aot:port=$(AndroidAotProfilerPort)" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="setprop debug.mono.profile aot:port=$(AndroidAotProfilerPort)"
/>
</Target>
<Target Name="BuildAndStartAotProfiling"
DependsOnTargets="$(_BeginAotProfilingDependsOnTargets)">
</Target>
<Target Name="FinishAotProfiling"
DependsOnTargets="_ResolveSdks;_ResolveMonoAndroidSdks">
<Exec Command="&quot;$(AdbToolPath)adb&quot; $(AdbTarget) forward tcp:$(AndroidAotProfilerPort) tcp:$(AndroidAotProfilerPort)" />
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="forward"
Arguments="tcp:$(AndroidAotProfilerPort) tcp:$(AndroidAotProfilerPort)"
/>
<Exec Command="&quot;$(AProfUtilToolPath)aprofutil&quot; $(AProfUtilExtraOptions) -s -v -p $(AndroidAotProfilerPort) -o &quot;$(AndroidAotCustomProfilePath)&quot;" />
</Target>
</Project>
Expand Up @@ -2583,9 +2583,6 @@ because xbuild doesn't support framework reference assemblies.

<Target Name="_DeployApk"
Condition=" '$(AndroidPackageFormat)' != 'aab' ">
<PropertyGroup>
<_DeployCommand>&quot;$(AdbToolPath)adb&quot; $(AdbTarget) install -r &quot;$(ApkFileSigned)&quot;</_DeployCommand>
</PropertyGroup>
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
Expand Down Expand Up @@ -2620,9 +2617,6 @@ because xbuild doesn't support framework reference assemblies.
<Target Name="_DeployAppBundle"
Condition=" '$(AndroidPackageFormat)' == 'aab' "
DependsOnTargets="_BuildApkSet">
<PropertyGroup>
<_UninstallCommand>&quot;$(AdbToolPath)adb&quot; $(AdbTarget) uninstall -k &quot;$(_AndroidPackage)&quot;</_UninstallCommand>
</PropertyGroup>
<AndroidAdb
Condition=" '$(EmbedAssembliesIntoApk)' == 'true' "
ContinueOnError="True"
Expand Down
Empty file added test
Empty file.

0 comments on commit 771ee1d

Please sign in to comment.