Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动更改Android emulator区域设置_Android_Android Emulator_Qemu - Fatal编程技术网

自动更改Android emulator区域设置

自动更改Android emulator区域设置,android,android-emulator,qemu,Android,Android Emulator,Qemu,对于自动化测试(使用Hudson),我有一个脚本,可以为Android操作系统版本、屏幕分辨率、屏幕密度和语言的多种组合生成一组模拟器。 除了语言部分外,这很好用 我需要找到一种方法来自动更改Android系统的语言环境。以下是我可以想到的一些方法,按优先顺序排列: 在启动emulator之前直接提取/编辑/重新打包QEMU图像 启动后在模拟器上运行某种系统区域设置更改APK 启动后更改emulator文件系统上的区域设置 启动后在emulator上的某些SQLite DB中更改区域设置 运行

对于自动化测试(使用Hudson),我有一个脚本,可以为Android操作系统版本、屏幕分辨率、屏幕密度和语言的多种组合生成一组模拟器。
除了语言部分外,这很好用

我需要找到一种方法来自动更改Android系统的语言环境。以下是我可以想到的一些方法,按优先顺序排列:

  • 在启动emulator之前直接提取/编辑/重新打包QEMU图像
  • 启动后在模拟器上运行某种系统区域设置更改APK
  • 启动后更改emulator文件系统上的区域设置
  • 启动后在emulator上的某些SQLite DB中更改区域设置
  • 运行一个键序列(通过emulator的telnet接口),打开设置应用程序并更改区域设置
  • 手动启动每个平台版本的emulator,在设置中手动更改区域设置,保存并存档映像以供以后部署
是否可以通过上述方法或其他方法实现这一点

您知道系统在哪里保存或读取区域设置吗


解决方案:
多亏了米拉诺关于相关属性的信息,以及我的进一步调查,我想出了一个比上述所有想法更好、更简单的解决方案


我已经在下面更新了他的答案,并提供了详细信息。

我个人认为最简单的方法是启动emulator,可能是一个干净的实例,除非您正在运行依赖于其他应用程序的集成测试,然后使用adb更改区域设置:

$ adb shell '
setprop persist.sys.language en;
setprop persist.sys.country GB;
stop;
sleep 5;
start'
或者任何你想设置的区域设置。 要验证更改是否成功,只需使用

$ adb shell 'getprop persist.sys.language'
您可能还希望在已知端口上运行模拟器,请检查


请注意,您也可以在启动仿真器时直接设置系统属性:

emulator -avd my_avd -prop persist.sys.language=en -prop persist.sys.country=GB
这样,您可以创建任何类型的普通旧仿真器,然后立即使用您选择的区域设置启动它,,而不必首先对仿真器图像进行任何修改


此区域设置将在emulator的未来运行中保持不变,当然您可以在启动或运行时再次更改它。

接受的答案不再有效<代码>persist.sys.language和
persist.sys.country
已从emulator属性中删除

我的解决方案是使用预先安装在android emulator上的“自定义区域设置”应用程序。只需将带有额外语言参数的意图发送给它,如下所示:

adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE EN
更多信息请点击此处-

更新:根据Jonas Alves的评论,以下命令适用于API 28+:

adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE "en_US" com.android.customlocale2

Android emulator现在似乎支持在启动时设置区域设置:

emulator -avd <avd-name> -change-locale fr-CA

emulator-avd

我们讨论的是模拟器,不确定它是否能在真实设备上工作。酷。。我不知道这些属性或
停止
/
开始
。对我有用。也曾在我的HTC Hero上工作过,或者至少
stop
start
愉快地重新启动了(以root身份运行时)。:)我还尝试提取一个仿真系统映像,将那些“
persist
”属性添加到
/build.prop
,重建,然后将映像添加到AVD。这是可行的,但似乎有一些不一致的副作用,即没有以正确的屏幕密度显示内容。重新启动有时会有所帮助。我明天必须进行实验,看看是否可以通过这种方式让它工作得更好,因为我不希望让emulator的第一次运行成为我需要设置这些属性并重新启动的特殊情况。我也已经在使用你提到的
emulator-ports
功能,但是在正常Android范围之外的端口范围内,因此,我使用
adb connect
让adb服务器知道模拟器在哪里运行。我只是在我的HTC Hero上尝试了它,但没有成为root用户,因此它不起作用。除非你是root用户,否则
setprop
stop
都不起作用。你有什么出版物(博客、论坛帖子等)描述你的自动测试设置吗?我很想为我的应用程序做自动测试,我也很喜欢哈德逊,但到目前为止,我还没有找到一个很好的介绍这个话题的方法。我可能会把它和我正在进行的哈德逊相关的其他改进一起写出来,但可能不会持续几个星期。如果我这样做了,我会在这里发布一个更新。仅供参考:现在有一个Hudson插件,可以根据各种属性(如操作系统版本、屏幕大小、语言)自动创建和运行模拟器:这个解决方案似乎不再适用于API 26+这在所有API(包括28)中都有效,但隐式广播不再有效,因此,您需要将目标包名称添加到广播命令中:
adb shell am broadcast-a com.android.intent.action.SET_LOCALE--es com.android.intent.extra.LOCALE“en_US”com.android.customlocale2
这是目前最好的方式,谢谢@denys!您能否澄清为什么使用两个区域设置值--
com.android.intent.action.SET_locale--es
com.android.intent.extra.locale“en_US”
“SET_LOCALE”
“LOCALE”
之间有什么区别?听起来很不错,但我只是尝试了一下,目前它在Travis和我的本地linux命令行中都不起作用,这是30.x emulator发行系列目前的情况