【问题标题】:Changing the Android emulator locale automatically自动更改 Android 模拟器区域设置
【发布时间】:2010-03-10 14:04:28
【问题描述】:

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

我需要找到一种方法来自动更改 Android 系统区域设置。以下是我能想到的一些方法,按优先顺序排列:

  • 在启动模拟器之前直接提取/编辑/重新打包 QEMU 映像
  • 启动后在模拟器上运行某种改变系统区域设置的 APK
  • 启动后更改模拟器文件系统的区域设置
  • 启动后在模拟器上更改某些 SQLite DB 中的区域设置
  • 运行一个按键序列(通过模拟器的 telnet 界面)将打开设置应用程序并更改语言环境
  • 手动为每个平台版本启动模拟器,在设置中手动更改语言环境,保存并存档图像以供以后部署

任何想法是否可以通过上述方法或其他方式完成?

您知道系统将区域设置保存到/读取的位置吗?


解决方案:
感谢 dtmilano 提供的有关相关属性的信息,以及我的一些进一步调查,我想出了一个比上述所有想法更好、更简单的解决方案!

我已经在下面更新了他的答案。

【问题讨论】:

  • 您是否有某种出版物(博客、论坛帖子等)来描述您的自动化测试设置?我很想为我的应用程序进行自动化测试,我喜欢 hudson,但直到现在我还没有找到关于这个主题的好的介绍。
  • 我可能会将它与我正在处理的一些与 Hudson 相关的其他改进一起写出来,但可能不会持续数周。如果我这样做了,我会在这里发布更新。
  • 仅供参考:现在有一个 Hudson 插件可以根据操作系统版本、屏幕大小、语言等各种属性自动创建和运行模拟器:bit.ly/c9qOf8

标签: android android-emulator qemu


【解决方案1】:

看来安卓模拟器现在支持在启动时设置语言环境了:

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

来源 - https://androidstudio.googleblog.com/2019/09/emulator-29112-stable.html

【讨论】:

  • 这听起来棒极了,但我刚刚尝试过,目前它在 Travis 和我的本地 linux 命令行上都不起作用,目前是 30.x 模拟器版本系列
  • 此解决方案仅适用于没有 Play 商店的图片
【解决方案2】:

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

$ adb shell '
setprop persist.sys.language en;
setprop persist.sys.country GB;
stop;
sleep 5;
start'

或您要设置的任何语言环境。 要验证您的更改是否成功,只需使用

$ adb shell 'getprop persist.sys.language'

您可能还想在已知端口上运行模拟器,请查看my answer in this thread


注意,您也可以在启动模拟器时直接设置系统属性

emulator -avd my_avd -prop persist.sys.language=en -prop persist.sys.country=GB

这样,您可以创建任何类型的普通旧模拟器,然后使用您选择的语言环境立即启动它,无需首先对模拟器图像进行任何修改。

此语言环境将在模拟器的未来运行中保持不变,当然您可以在启动时或运行时再次更改它。

【讨论】:

  • 我们在讨论模拟器,不确定这是否可以在真实设备上运行。
  • 酷..我不知道这些属性或stop/start。为我工作。还在我的 HTC Hero 上工作,或者至少 stopstart 愉快地重新启动了东西(以 root 身份运行时)。 :)
  • 我还尝试提取模拟器系统映像,将那些“persist”属性添加到/build.prop,重建,然后将映像添加到 AVD。这行得通,但似乎有一些不一致的副作用,即未以正确的屏幕密度显示内容。重新启动有时会有所帮助。我明天必须进行实验,看看我是否可以通过这种方式让它更好地工作,因为我不想让模拟器的第一次运行成为我需要设置这些属性并重新启动的特殊情况。
  • 我也已经在使用你提到的 emulator -ports 东西,但是在正常 Android 范围之外的端口范围上,所以我使用 adb connect 让 adb 服务器知道模拟器在哪里运行.
  • 我刚刚在我的 HTC Hero 上尝试过,但没有成为 root,但它不起作用。除非您是 root,否则 setpropstop 都不起作用。
【解决方案3】:

接受的答案不再有效。 persist.sys.languagepersist.sys.country 已从模拟器属性中消失。

我的解决方案是使用预装在 android 模拟器上的“自定义语言环境”应用程序。只需向其发送带有额外语言参数的意图,如下所示:

adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE EN

更多信息在这里 - prepare android emulator for UI test automation.

更新:根据 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

【讨论】:

  • 这个解决方案似乎不再适用于 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!
  • 您能否解释一下为什么要使用 2 个语言环境值——com.android.intent.action.SET_LOCALE --escom.android.intent.extra.LOCALE "en_US""SET_LOCALE""LOCALE" 有什么区别?
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多