cake-contrib / cake-contrib/Cake.Android.Adb
Exception: "Object reference not set to an instance of an object" when `adb` can not be found
- Dominant language
- C#
- Stars
- 5
- Forks
- 7
- PR merge metrics
- No merged PRs in 30d
Description
Coming from https://stackoverflow.com/questions/69986655/cake-adbinstall-object-reference-not-set-to-an-instance-of-an-object
The message when `adb` can not be found is:
```text
Error: One or more errors occurred. (Object reference not set to an instance of an object.)
Object reference not set to an instance of an object.
```
Which is a bit misleading.
## Expected Behavior
Some nice message, maybe "adb could not be found. Make sure adb is available in PATH".
## Current Behavior
Diagnostics show:
```text
Could not resolve path for tool "adb" using these directories: /usr/local/bin,/usr/bin,/bin,/usr/sbin,/sbin,/usr/local/share/dotnet,~/.dotnet/tools,/Library/Apple/usr/bin,/Library/Frameworks/Mono.framework/Versions/Current/Commands,/opt/homebrew/bin,/opt/homebrew/sbin
Could not resolve path for tool "adb.exe" using these directories: /usr/local/bin,/usr/bin,/bin,/usr/sbin,/sbin,/usr/local/share/dotnet,~/.dotnet/tools,/Library/Apple/usr/bin,/Library/Frameworks/Mono.framework/Versions/Current/Commands,/opt/homebrew/bin,/opt/homebrew/sbin
An error occurred when executing task 'Test'.
Error: System.AggregateException: One or more errors occurred. (Object reference not set to an instance of an object.)
---> System.NullReferenceException: Object reference not set to an instance of an object.
at Cake.AndroidAdb.AdbTool.GetAlternativeToolPaths(AdbToolSettings settings)
at Cake.Core.Tooling.Tool`1.GetToolPathUsingToolService(TSettings settings) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 285
at Cake.Core.Tooling.Tool`1.GetToolPath(TSettings settings) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 266
at Cake.Core.Tooling.Tool`1.RunProcess(TSettings settings, ProcessArgumentBuilder arguments, ProcessSettings processSettings) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 160
at Cake.Core.Tooling.Tool`1.Run(TSettings settings, ProcessArgumentBuilder arguments, ProcessSettings processSettings, Action`1 postAction) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 81
at Cake.Core.Tooling.Tool`1.Run(TSettings settings, ProcessArgumentBuilder arguments) in C:\projects\cake\src\Cake.Core\Tooling\Tool.cs:line 60
at Cake.AndroidAdb.AdbTool.Uninstall(String packageName, Boolean keepDataAndCacheDirs, AdbToolSettings settings)
at Cake.AndroidAdb.AdbAliases.AdbUninstall(ICakeContext context, String packageName, Boolean keepDataAndCacheDirs, AdbToolSettings settings)
at Submission#0.AdbUninstall(String packageName, Boolean keepDataAndCacheDirs, AdbToolSettings settings)
at Submission#0.<>b__0_4()
at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass31_0.b__0(ICakeContext _) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 26
at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass34_0.b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 81
at Cake.Core.CakeTask.Execute(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTask.cs:line 119
at Cake.Core.DefaultExecutionStrategy.ExecuteAsync(CakeTask task, ICakeContext context) in C:\projects\cake\src\Cake.Core\DefaultExecutionStrategy.cs:line 72
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 278
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 301
at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 311
at Cake.Core.CakeEngine.RunTask(ICakeContext context, IExecutionStrategy strategy, CakeTask task, String target, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 226
at Cake.Core.CakeEngine.RunTargetAsync(ICakeContext context, IExecutionStrategy strategy, ExecutionSettings settings) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 189
at Cake.Cli.BuildScriptHost`1.RunTargetAsync(String target) in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 73
at Cake.Core.Scripting.ScriptHost.RunTarget(String target) in C:\projects\cake\src\Cake.Core\Scripting\ScriptHost.cs:line 105
at Submission#0.<>d__0.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.RunSubmissionsAsync[TResult](ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, StrongBox`1 exceptionHolderOpt, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Scripting.Script`1.RunSubmissionsAsync(ScriptExecutionState executionState, ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at Cake.Infrastructure.Scripting.RoslynScriptSession.Execute(Script script) in C:\projects\cake\src\Cake\Infrastructure\Scripting\RoslynScriptSession.cs:line 90
at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath) in C:\projects\cake\src\Cake.Core\Scripting\ScriptRunner.cs:line 172
at Cake.Features.Building.BuildFeature.RunCore(IRemainingArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 99
at Cake.Features.Building.BuildFeature.Run(IRemainingArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 49
at Cake.Commands.DefaultCommand.Execute(CommandContext context, DefaultCommandSettings settings) in C:\projects\cake\src\Cake\Commands\DefaultCommand.cs:line 73
```
Which leads me to believe this is in fact a bug in the `GetAlternativeToolPaths` method.
I suspect somewhere along the lines of:

## Steps to Reproduce (for bugs)
1. Make sure `adb` can not be found
2. Use the followin Cake file:
```cs
#addin "nuget:?package=Cake.Xamarin&version=3.0.2"
#addin "nuget:?package=Cake.Android.Adb&version=3.2.0"
#addin "nuget:?package=Cake.Android.SdkManager&version=3.0.2"
const string NEXUS_GO_ANDROID = "/Users/***/***.Android.csproj";
Task("Test")
.Does(() =>
{
FilePath androidApk = BuildAndroidApk(projectFile: NEXUS_GO_ANDROID, sign: true, configuration: "Debug", configurator: null);
//FilePath androidApk = BuildAndroidApk(projectFile: NEXUS_GO_ANDROID, sign: false, configuration: "Debug", configurator: null);
Console.WriteLine($"!!! android APK {androidApk}");
//AdbUninstall("uk.co.pallex.nexusgo");
AdbInstall(apkFile: androidApk);
});
RunTarget("Test");
```
3. Run `dotnet cake`
## Context
From [SO](https://stackoverflow.com/questions/69986655/cake-adbinstall-object-reference-not-set-to-an-instance-of-an-object):
> My goal is to build once and run apk in two enumerators(where one is LTR and second is RTL). But now I can't run even on one of them.
## Your Environment
* Module version used: 3.2.0
* Operating System and PowerShell version: Mackbook M1
Contributor guide
Assessment
This issue has not been assessed yet.