diff --git a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs index 937739f6759..f7687fb1a5e 100644 --- a/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs +++ b/src/Xamarin.Android.Build.Debugging.Tasks/Tasks/FastDeploy.cs @@ -334,7 +334,11 @@ public async Task RunInstall () return; } if (!await IsPackageInstalled (PackageName)) { - LogDiagnostic ($"`pm path {PackageName}` still reports no package after reinstall; continuing — the run-as probe will surface the failure."); + LogDiagnostic ($"`pm path {PackageName}` still reports no package after reinstall."); + LogDiagnosticDataError ("XA0132", Resources.XA0132_PackageNotInstalled); + PrintDiagnostics (); + LogCodedError ("XA0132", Resources.XA0132_PackageNotInstalled); + return; } } @@ -593,6 +597,11 @@ async Task IsPackageInstalled (string packageName) args.Add (packageName); string output = await Device.RunShellCommand (CancellationToken, args.ToArray ()); LogDiagnostic ($"`pm path {packageName}` returned: {(string.IsNullOrWhiteSpace (output) ? "" : output.Trim ())}"); + return IsPackageInstalledOutput (output); + } + + internal static bool IsPackageInstalledOutput (string output) + { return !string.IsNullOrWhiteSpace (output) && output.IndexOf ("package:", StringComparison.OrdinalIgnoreCase) >= 0; } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DebuggingTasksTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DebuggingTasksTests.cs index 4f432db926b..8f7d5ede5c5 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DebuggingTasksTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DebuggingTasksTests.cs @@ -211,5 +211,20 @@ public void IsTransientRunAsStatRace_ReturnsFalseForNonTransientOutput (string o Assert.IsFalse (FastDeploy.IsTransientRunAsStatRace (output), $"Expected no transient-race detection for: {output}"); } + + [TestCase ("package:/data/app/~~hash/com.example.app-base/base.apk")] + [TestCase ("package:/data/app/~~hash/com.example.app-base/base.apk\npackage:/data/app/~~hash/com.example.app-split/split_config.en.apk")] + public void IsPackageInstalledOutput_ReturnsTrueForPackagePaths (string output) + { + Assert.IsTrue (FastDeploy.IsPackageInstalledOutput (output)); + } + + [TestCase (null)] + [TestCase ("")] + [TestCase ("Error: package com.example.app was not found")] + public void IsPackageInstalledOutput_ReturnsFalseWithoutPackagePath (string output) + { + Assert.IsFalse (FastDeploy.IsPackageInstalledOutput (output)); + } } }