Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions Documentation/docs-mobile/building-apps/build-targets.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,21 +214,22 @@ Use with `/p:Configuration=Release` to generate self-contained "Release" package
Package files created by this target are available in the
[`@(ApplicationArtifact)`](build-items.md#applicationartifact) item group.

## StartAndroidActivity
## Run

Starts the default activity on the device or the running emulator.
Builds and installs the application, then starts it on the device or running emulator.
This target uses the same launch path as `dotnet run -p:WaitForExit=false` and returns
after starting the application. Unlike that command, the `Run` target wakes the device
and dismisses its keyguard before launching the application.

To start a different activity, set the
[`$(AndroidLaunchActivity)`](build-properties.md#androidlaunchactivity)
property to the activity name.

This is equivalent to:

```shell
adb shell am start -S -n @PACKAGE_NAME@/$(AndroidLaunchActivity)
dotnet build -t:Run
```

Added in Xamarin.Android 10.2.
`StartAndroidActivity` is retained as an alias for `Run`.

## StopAndroidPackage

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -231,14 +231,4 @@ If all of that fails please set the 'EmbedAssembliesIntoApk' MSBuild property to
{1} - The tool that was used to deploy the file.
{2} - The actual error that occured.</comment>
</data>
<data name="StartDebugger_ipAddress_port" xml:space="preserve">
<value> Starting Debugger on {0}:{1}
Start sdb then run the following command
connect {0} {1}
</value>
<comment>The following are literal names and should not be translated:
{0} - An ip address of a computer.
{1} - An interger value describing the port to use.
</comment>
</data>
</root>
118 changes: 0 additions & 118 deletions src/Xamarin.Android.Build.Debugging.Tasks/Tasks/RunActivity.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ Copyright (C) 2016 Xamarin. All rights reserved.
<UsingTask TaskName="Xamarin.Android.Tasks.FastDeploy" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.MoveSubfolder" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.ResolveXamarinAndroidTools" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.RunActivity" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.RunTests" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />
<UsingTask TaskName="Xamarin.Android.Tasks.WaitForAppDetection" AssemblyFile="Xamarin.Android.Build.Debugging.Tasks.dll" />

Expand Down Expand Up @@ -198,39 +197,8 @@ Copyright (C) 2016 Xamarin. All rights reserved.
/>
</Target>

<Target Name="_Run"
DependsOnTargets="AndroidPrepareForBuild"
Condition="'$(AndroidApplication)' != '' And $(AndroidApplication)">
<PropertyGroup>
<AndroidSdbTargetPort Condition="'$(AndroidSdbTargetPort)' == ''">10000</AndroidSdbTargetPort>
<AndroidSdbHostPort Condition="'$(AndroidSdbHostPort)' == ''">10000</AndroidSdbHostPort>
<AndroidAttachDebugger Condition="'$(AndroidAttachDebugger)' == ''">False</AndroidAttachDebugger>
<AndroidDebuggerServer Condition="'$(AndroidDebuggerServer)' == ''">True</AndroidDebuggerServer>
<_AndroidRunForceStop Condition="'$(_AndroidRunForceStop)' == ''">True</_AndroidRunForceStop>
<_AndroidAllowJavaDebugging Condition="'$(_AndroidAllowJavaDebugging)' == ''">False</_AndroidAllowJavaDebugging>
</PropertyGroup>
<Exec Command="&quot;$(_AndroidPlatformToolsDirectory)adb&quot; $(AdbTarget) forward tcp:$(AndroidSdbTargetPort) tcp:$(AndroidSdbHostPort)"
Condition="'$(AndroidAttachDebugger)' == 'True' And '$(AndroidDebuggerServer)' == 'True'" />
<GetAndroidActivityName
Condition=" '$(RunActivity)' == '' "
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml">
<Output TaskParameter="ActivityName" PropertyName="RunActivity" />
</GetAndroidActivityName>
<RunActivity
ActivityName="$(RunActivity)"
AdbTarget="$(AdbTarget)"
PackageName="$(_AndroidPackage)"
AttachDebugger="$(AndroidAttachDebugger)"
Port="$(AndroidSdbTargetPort)"
UserID="$(AndroidDeviceUserId)"
Server="$(AndroidDebuggerServer)"
ForceStop="$(_AndroidRunForceStop)"
AllowJavaDebugging="$(_AndroidAllowJavaDebugging)"
/>
</Target>

<Target Name="_Gdb"
DependsOnTargets="AndroidPrepareForBuild;_GetPrimaryCpuAbi;_GetTargetSymbols;_PrepGdbConnection;_GetProjectNdkBuildSymbols;_Run"
DependsOnTargets="AndroidPrepareForBuild;_GetPrimaryCpuAbi;_GetTargetSymbols;_PrepGdbConnection;_GetProjectNdkBuildSymbols;Run"
Condition="'$(AndroidApplication)' != '' And $(AndroidApplication)">
<Message Text="AndroidGdbSymbolsPath: $(AndroidGdbSymbolsPath)" />
<Message Text=" PackageOverridePath: $(_PackageOverridePath)" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ This file contains targets specific for Android application projects.
<UsingTask TaskName="Xamarin.Android.BuildTools.PrepTasks.XASleepInternal" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />

<PropertyGroup>
<_RunDependsOn>
Install;
_Run;
</_RunDependsOn>
<_AndroidComputeRunArgumentsDependsOn Condition=" '$(_AndroidComputeRunArgumentsDependsOn)' == '' ">
_ResolveMonoAndroidSdks;
_EnsureDeviceBooted;
Expand Down Expand Up @@ -137,16 +133,24 @@ This file contains targets specific for Android application projects.
<_AndroidRunUserArg Condition=" '$(AndroidDeviceUserId)' != '' ">--user &quot;$(AndroidDeviceUserId)&quot;</_AndroidRunUserArg>
<_AndroidRunInstrumentArg Condition=" '$(AndroidInstrumentation)' != '' ">--instrument &quot;$(AndroidInstrumentation)&quot;</_AndroidRunInstrumentArg>
<_AndroidRunActivityArg Condition=" '$(AndroidInstrumentation)' == '' ">--activity &quot;$(AndroidLaunchActivity)&quot;</_AndroidRunActivityArg>
<_AndroidRunNoWaitArg Condition=" '$(WaitForExit)' == 'false' ">--no-wait</_AndroidRunNoWaitArg>
<_AndroidRunNoWaitArg Condition=" '$(WaitForExit)' == 'false' or '$(_AndroidRunTarget)' == 'true' ">--no-wait</_AndroidRunNoWaitArg>
<_AndroidRunNoWakeDeviceArg Condition=" '$(WaitForExit)' == 'false' ">--no-wake-device</_AndroidRunNoWakeDeviceArg>
<!-- Preserve the legacy _Run argument order: target port is the host-side forward. -->
<_AndroidRunForwardPortArg Condition=" '$(AndroidAttachDebugger)' == 'true' and '$(AndroidDebuggerServer)' == 'true' ">--forward-port &quot;$(AndroidSdbTargetPort):$(AndroidSdbHostPort)&quot;</_AndroidRunForwardPortArg>
Comment thread
jonathanpeppers marked this conversation as resolved.
Resolved
<RunCommand>dotnet</RunCommand>
<RunArguments>exec &quot;$(_AndroidRunPath)&quot; --adb &quot;$(_AdbToolPath)&quot; $(_AndroidRunAdbTargetArg) --package &quot;$(_AndroidPackage)&quot; $(_AndroidRunActivityArg) $(_AndroidRunInstrumentArg) --logcat-args &quot;$(_AndroidRunLogcatArgs)&quot; $(_AndroidRunUserArg) $(_AndroidRunNoWaitArg) $(_AndroidRunNoWakeDeviceArg) $(_AndroidRunForwardPortArg) $(_AndroidRunExtraArgs)</RunArguments>
</PropertyGroup>
</Target>

<Target Name="Run" DependsOnTargets="$(_RunDependsOn)" />
<Target Name="_AndroidPrepareRun">
<PropertyGroup>
<_AndroidRunTarget>true</_AndroidRunTarget>
</PropertyGroup>
</Target>

<Target Name="Run"
DependsOnTargets="Build;Install;_AndroidPrepareRun;ComputeRunArguments">
<Exec Command="$(RunCommand) $(RunArguments)" WorkingDirectory="$(RunWorkingDirectory)" />
Comment thread
jonathanpeppers marked this conversation as resolved.
Resolved
</Target>

<PropertyGroup>
<_RunWithLoggingDependsOn>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,13 @@ public void ComputeRunArgumentsIncludesDebuggerPortForwarding ()
StringAssertEx.Contains ("--no-wake-device", builder.LastBuildOutput);
StringAssertEx.Contains ("--forward-port \"12345:54321\"", builder.LastBuildOutput);

proj.SetProperty ("WaitForExit", "true");
proj.SetProperty ("_AndroidRunTarget", "true");
Assert.IsTrue (builder.Build (proj), "ComputeRunArguments should succeed for the Run target.");
StringAssertEx.Contains ("--no-wait", builder.LastBuildOutput);
Assert.IsFalse (builder.LastBuildOutput.ContainsText ("--no-wake-device"), "The Run target should wake the device.");
StringAssertEx.Contains ("--forward-port \"12345:54321\"", builder.LastBuildOutput);

proj.SetProperty ("AndroidDebuggerServer", "false");
Assert.IsTrue (builder.Build (proj), "ComputeRunArguments should succeed for a debugger client.");
StringAssertEx.Contains ("RunCommand=dotnet", builder.LastBuildOutput);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,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">
<GetAndroidActivityName
Condition=" '$(AndroidLaunchActivity)' == '' "
ManifestFile="$(IntermediateOutputPath)android\AndroidManifest.xml">
<Output TaskParameter="ActivityName" PropertyName="AndroidLaunchActivity" />
</GetAndroidActivityName>
<PropertyGroup>
<_AmStartUserArg Condition=" '$(AndroidDeviceUserId)' != '' "> --user $(AndroidDeviceUserId)</_AmStartUserArg>
</PropertyGroup>
<AndroidAdb
ToolExe="$(AdbToolExe)"
ToolPath="$(AdbToolPath)"
AdbTarget="$(AdbTarget)"
Command="shell"
Arguments="am start -S$(_AmStartUserArg) -n &quot;$(_AndroidPackage)/$(AndroidLaunchActivity)&quot;"
/>
</Target>
<Target Name="StartAndroidActivity" DependsOnTargets="Run" />
<Target Name="StopAndroidPackage"
DependsOnTargets="_ResolveMonoAndroidSdks;_GetAndroidPackageName">
<AndroidAdb
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public ExecutionConfiguration (string packageName, AmIntentCommand runCommand)
public DebuggerOptions Debugger { get; private set; }

/// <summary>
/// Gets or sets a value indicating whether Java debugging is allowed. Defaults to true, but will be available to be toggled off via -p:_AndroidAllowJavaDebugging=false.
/// Gets or sets a value indicating whether Java debugging is allowed. Defaults to true.
/// </summary>
public bool AllowJavaDebugging { get; set; } = true;

Expand Down
14 changes: 9 additions & 5 deletions tests/MSBuildDeviceIntegration/Tests/InstallAndRunTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3318,19 +3318,23 @@ public void NativeAOTSample ()
}

[Test]
public void StartAndroidActivityRespectsAndroidDeviceUserId ()
public void RunTargetRespectsAndroidDeviceUserId ()
{
var proj = new XamarinAndroidApplicationProject ();
using var builder = CreateApkBuilder ();
Assert.IsTrue (builder.Install (proj), "Install should have succeeded.");

// Run with AndroidDeviceUserId=0 (primary user, always available)
builder.BuildLogFile = "start-with-user.log";
Assert.IsTrue (builder.RunTarget (proj, "StartAndroidActivity", parameters: new [] { "AndroidDeviceUserId=0" }),
"StartAndroidActivity should have succeeded.");
Assert.IsTrue (builder.RunTarget (proj, "Run", parameters: new [] { "AndroidDeviceUserId=0", "_AndroidRunExtraArgs=--verbose" }),
"Run should have succeeded.");

StringAssertEx.ContainsRegex (@"am start.*--user 0", builder.LastBuildOutput,
"The 'am start' command should contain '--user 0' when AndroidDeviceUserId is set.");
Assert.IsTrue (builder.LastBuildOutput.ContainsText ("--no-wait"),
"The Run target should launch Microsoft.Android.Run without waiting for the app to exit.");
Assert.IsFalse (builder.LastBuildOutput.ContainsText ("--no-wake-device"),
"The Run target should wake the device before starting the app.");
Assert.IsTrue (builder.LastBuildOutput.ContainsText ("KEYCODE_WAKEUP"),
"The Run target should wake the device before starting the app.");
}

public enum MSTestPackageChannel
Expand Down
Loading