如何将AVD(模拟器)设置为离线模式?

34
我想测试我的应用程序在用户处于无信号区或其手机处于飞行模式时的行为。
-> 如何将Android虚拟设备切换到离线模式(无法连接到互联网)?
我尝试了以下操作:
- 通过AVD设置激活飞行模式:出人意料地,这个方法不起作用(在飞行模式下仍然可以浏览互联网!) - 在我的电脑上禁用网络连接:显然此方法能够达到目的,但是不能满足我的需求,因为我需要在测试应用程序时连接互联网。

1
目前在单元测试中无法通过编程方式真正禁用网络访问。我已经为此问题提交了一个增强请求(http://code.google.com/p/android/issues/detail?id=36916)。 - Jeff Axelrod
1
@Sebastien,我已经提供了一个下面的答案,它可以完美地工作,但不幸的是会完全断开AVD。尽管如此,您仍然可以看到您的应用程序的行为。 - class stacker
11个回答

35

无线网络:

$ adb shell svc wifi enable
$ adb shell svc wifi disable

移动数据:

$ adb shell svc data enable
$ adb shell svc data disable

我已经花了两个小时来解决这个问题。谢谢您先生! - fmcauley
它可以从adb命令行工作,但是当我尝试在应用程序中使用时,它不起作用并且不打印任何错误日志。您有任何想法吗?为什么直接从应用程序使用ProcessBuilder调用时不起作用? public void disableMobileData(){ ProcessBuilder pb = new ProcessBuilder("svc", "data", "disable"); runCommand(pb); } public void runCommand(ProcessBuilder pb){ try { Process pc = pb.start(); pc.waitFor(); } catch (Exception e){ Log.e(TAG,"异常"+e); } } - krawiec
6
adb shell "svc wifi disable && svc data disable" 翻译为:禁用 Wi-Fi 和移动数据服务。adb shell "svc wifi enable && svc data enable" 翻译为:启用 Wi-Fi 和移动数据服务。 - giorgos.nl

14

我看到了所有相同的问题。DDMS不能完全终止它。F8也不能。在模拟器内打开飞行模式也不能。我们都应该给2009年有人提交的这个问题点个赞。


1
这个答案并没有解决问题。请看我的答案,了解一种真正运行离线 AVD 的方法。 - class stacker
与此同时,他们关闭了问题,但没有修复它。但我们应该给它更多的关注,因为它仍然存在于5.0.1中!看起来最好的解决方法是不要使用模拟器,而是在真实设备上进行测试。 - steven
现在已经是2015年了,但我仍然不知道为什么在我的默认Nexus 5 x86模拟器上会出现这个问题,这个模拟器是在安装Android Studio时下载的。 - Saifur Rahman Mohsin

7
我发现了一个可行的解决方案。在Android 6.0和7.0模拟器上进行了测试,但应该适用于其他版本。
网络故障:
adb shell ifconfig eth0 down

网络已连接:

adb shell ifconfig eth0 up

如果您收到“权限被拒绝”错误,请以root身份重新启动adb守护程序:
adb root

请重试。


哇 - 在阅读了多个线程上的15个以上答案后,这是唯一有效的答案。尽管我需要使用adb shell ifconfig wlan0 down而不是eth0。 - Adam Burley

3

1
按下 F8 显示您未连接,但实际上是已连接的。网络连接在断开连接后继续工作。 - steven

2

我在“模拟器控制”视图中发现,当我将语音和数据调整为“未注册”而不是“拒绝”,它对我有用。现在我终于让 AVD 离线,并且我仍然可以发表这个答案。


对我没有用:我的应用程序仍然可以从网络下载数据。 - Sébastien
这只有改变状态的作用,但仍然能够连接到互联网。 - GoodSp33d

2

我所做的就是进入窗口菜单,选择“打开透视图 ->其他”,打开DDMS透视图。在DDMS透视图中,您有一个“模拟器控制”视图,可以调整延迟、漫游,还可以给它不同的电话和数据状态。因此,按照这个过程获取模拟器视图后,您可以转到“数据”下拉菜单并选择“拒绝”选项。


1
这确实是我正在寻找的控件类型。然而,它仍然无法正常工作...我将语音和数据设置为拒绝,但我仍然能够从AVD浏览互联网。这明显是模拟器中的一个错误... - Sébastien
“它在我的电脑上可以运行” :) 我想可能是我设置了其他你没有的东西。等我有机会时,我会深入研究并看看是否能够重现它无法工作的情况... 你使用的是哪个版本的Eclipse/AVD? - Nick Vallely

2

在测试时,不要使用 Android 模拟器中的飞行模式(这个功能效果不太好),而是关闭系统的网络连接。也就是说,关闭以太网连接或 Wi-Fi 连接。这对我很有效。


0

James Koch提到的问题有一个解决方法:

Comment 15 by iscy%inv...@gtempaccount.com, Jul 8, 2011
最终找到了这个问题的解决方法:
telnet localhost 5554    // 连接模拟器
qemu monitor             // 进入QEmu功能
info network             // 列出网络适配器,“user.0”通常是名称
set_link user.0 down     // 关闭网络
set_link user.0 up       // 重新启用网络

但是:

Comment 16 by leonhard...@gmail.com, Sep 6, 2011
在MacOS 10.7.1和SDK rev 12(使用平台2.2、2.1和2.3.3)上,这个解决方法对我不起作用。
... ...
qemu monitor
KO: internal error: could not detach from console !

-> 在Windows Vista、SDK rev 19和平台10(2.3.3)上也是一样。

但或许对某些人有用...


0

虽然这是老问题,但我找到了解决方案:

  1. 打开命令行:CTRL+R > cmd
  2. 切换到Android工具文件夹

    cd C:\Program Files\Android\android-sdk\tools

  3. 使用错误的DNS服务器运行模拟器。将2.3.3更改为您的AVD名称。@使其启动:

    emulator.exe @2.3.3 -dns-server 127.0.0.1

查看手册以获取更多命令行选项


这不同于没有网络,它是一种可检测的手机状态。 - Walf
1
总有人想要更多...我猜你可以打开飞行模式来改变状态。当然,你仍然可以使用IP而不是域名建立连接。但对于大多数应用程序来说,这将切断互联网连接,这比其他任何答案都更多。请阅读关于投票下降的常见问题解答:投票下降应该保留给极端情况。如果有什么问题,请留下评论或编辑帖子以进行更正 - PiTheNumber

0

最后,这种方法怎么样?

android-sdks/tools/emulator -avd [AVD name goes here] -qemu -net nic,vlan=0 -net user,vlan=1

事实上,这是一个技巧,因为以下内容会导致我的模拟器崩溃:

android-sdks/tools/emulator -avd [AVD name goes here] -qemu -net none

在Debian上使用Android模拟器V21.0进行了测试。


3
这确实会将设备置于离线模式,但它处于如此离线状态,以至于甚至adb也无法连接到它... - Thomas Keller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接