如何阻止Visual Studio将Android应用部署到模拟器?
问题描述
我创建了一个测试应用,可正常构建。代码如下:
using System; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Widget; using System.IO; using Android.Database; using OpenFileTest; namespace OpenFileActivity { [Activity(Label = "OpenFileActivity")] public class OpenFileActivity : Activity { private const int FilePickerRequestCode = 1; protected internal Button openFile; protected override void OnCreate(Bundle savedInstanceState) { SetContentView(Resource.Layout.activity_main); base.OnCreate(savedInstanceState); openFile = (Button)FindViewById(Resource.Id.openFile); SetContentView(Resource.Layout.activity_main); Button openFileButton = FindViewById<Button>(Resource.Id.openFile); openFileButton.Click += OpenFileButton_Click; } private void OpenFileButton_Click(object sender, EventArgs e) { Intent intent = new Intent(Intent.ActionOpenDocument); intent.AddCategory(Intent.CategoryOpenable); intent.SetType("*/*"); // Set the MIME type to allow opening all file types StartActivityForResult(intent, FilePickerRequestCode); } protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == FilePickerRequestCode && resultCode == Result.Ok && data != null) { Android.Net.Uri uri = data.Data; string filePath = GetPathFromUri(uri); if (!string.IsNullOrEmpty(filePath)) { // Read the file content string fileData = File.ReadAllText(filePath); // Now you have the file data in the 'fileData' variable // You can process it further as needed } } } private string GetPathFromUri(Android.Net.Uri uri) { string[] projection = { Android.Provider.MediaStore.Images.ImageColumns.Data }; ContentResolver cr = ContentResolver; using (ICursor cursor = cr.Query(uri, projection, null, null, null)) { if (cursor != null && cursor.MoveToFirst()) { int columnIndex = cursor.GetColumnIndexOrThrow(Android.Provider.MediaStore.Images.ImageColumns.Data); return cursor.GetString(columnIndex); } } return null; } } }
当我尝试将其部署到已连接的手机(已选为部署目标)时,Visual Studio却启动模拟器并尝试部署到该模拟器。我该如何阻止Visual Studio使用模拟器?
我另有一款开发中的Android应用,运行时可正常部署到该手机。我可以通过执行以下命令关闭模拟器:
adb -s emulator-5554 emu kill
但Visual Studio为何会选择模拟器呢?
解决方法与原因分析
一、立即阻止模拟器启动的设置调整
- 锁定部署目标设备
- 在Visual Studio顶部的设备选择下拉菜单中,找到你的物理设备名称,点击其旁边的固定图标(🔒),确保后续部署默认指向该设备,不会自动切换到模拟器。
- 禁用自动启动模拟器
- 打开Visual Studio的工具 > 选项 > Xamarin > Android设置,取消勾选“如果没有兼容设备则启动模拟器”的相关选项。
- 重置ADB连接
- 打开命令提示符,执行以下命令:
adb kill-server adb start-server - 回到Visual Studio,点击设备选择菜单中的刷新按钮,重新识别物理设备。
- 打开命令提示符,执行以下命令:
二、排查自动选择模拟器的核心原因
- 应用架构不匹配
- 检查测试应用的目标架构(项目属性 > Android选项 > 高级 > 支持的架构),是否与物理设备的CPU架构(如arm64-v8a、armeabi-v7a)匹配。如果测试应用仅勾选x86/x86_64架构,而物理设备是ARM架构,Visual Studio会自动选择x86模拟器。
- 项目部署配置差异
- 对比正常应用和测试应用的配置:
- 检查项目属性 > Android选项 > 部署中的设置,确保“使用快速部署”、“部署到外部存储”等选项与正常应用一致。
- 查看启动项目配置,确认测试应用的部署目标明确指定为物理设备,而非“默认设备”。
- 对比正常应用和测试应用的配置:
- 设备连接状态异常
- 重新插拔USB数据线,确保设备处于“文件传输”模式且USB调试已开启;执行
adb devices命令,确认设备状态显示为device,而非unauthorized或offline。
- 重新插拔USB数据线,确保设备处于“文件传输”模式且USB调试已开启;执行
- Visual Studio缓存问题
- 删除测试应用的
bin和obj目录,重新构建项目;进入工具 > Android > 重置Android组件缓存,清理组件缓存。
- 删除测试应用的
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

