Автоматическое изменение локали эмулятора Android

Для автоматического тестирования (используя Hudson) у меня есть скрипт, который генерирует кучу эмуляторов для многих комбинаций версии ОС Android, разрешения экрана, плотности экрана и языка.
Это прекрасно работает, за исключением языковой части.

Мне нужно найти способ автоматического изменения языкового стандарта системы Android. Вот некоторые подходы, которые я могу придумать, в порядке предпочтения:

  • Извлечение/редактирование/перепаковка образа QEMU непосредственно перед запуском эмулятора
  • Запуск какого-то APK с изменением системной локали на эмуляторе после запуска
  • Изменение настроек локали в файловой системе эмулятора после запуска
  • Изменение настроек локали в некоторых БД SQLite на эмуляторе после запуска
  • Запуск последовательности клавиш (через telnet-интерфейс эмулятора), которая откроет приложение настроек и изменит языковой стандарт.
  • Ручной запуск эмулятора для каждой версии платформы, изменение локали вручную в настройках, сохранение и архивирование образов для последующего развертывания.

Любые идеи, можно ли это сделать с помощью вышеуказанных методов или иным образом?

Знаете ли вы, где настройки локали сохраняются/читаются системой?


Решение:
Благодаря информации dtmilano о соответствующих свойствах и некоторым дальнейшим исследованиям с моей стороны, я нашел решение, которое даже лучше и проще, чем все приведенные выше идеи!

Я обновил его ответ ниже с подробностями.


person Christopher Orr    schedule 10.03.2010    source источник
comment
есть ли у вас какая-то публикация (блог, сообщение на форуме и т. д.), в которой вы описываете свою настройку автоматического тестирования? Я хотел бы проводить автоматизированное тестирование своих приложений, и мне нравится hudson, но до сих пор я не нашел хорошего введения в эту тему.   -  person Janusz    schedule 18.03.2010
comment
Есть вероятность, что я мог бы написать это вместе с некоторыми дополнительными улучшениями, связанными с Хадсоном, над которыми я работаю, но, вероятно, не в течение нескольких недель. Если я это сделаю, я опубликую обновление здесь.   -  person Christopher Orr    schedule 18.03.2010
comment
К вашему сведению: теперь есть плагин Hudson, который автоматизирует создание и запуск эмуляторов на основе различных свойств, таких как версия ОС, размер экрана, язык: bit.ly/c9qOf8   -  person Christopher Orr    schedule 06.04.2010


Ответы (3)


Лично я думаю, что самый простой способ — запустить эмулятор, возможно, чистый экземпляр, если только вы не запускаете интеграционные тесты, зависящие от других приложений, а затем измените локаль с помощью 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

Таким образом, вы можете создать простой старый эмулятор любого типа, а затем сразу же запустить его, используя выбранную вами локаль, без предварительного внесения каких-либо изменений в образы эмулятора.

Эта локаль сохранится для будущих запусков эмулятора, хотя, конечно, вы всегда можете снова изменить ее при запуске или во время выполнения.

person Diego Torres Milano    schedule 10.03.2010
comment
Мне это действительно интересно, поэтому я пошел попробовать, я попробовал это через оболочку ADB на G1 и HTC Hero, я без проблем могу использовать getprop и получать информацию. Но я хочу использовать setprop, но когда я это делаю, ничего не меняется? - person Donal Rafferty; 10.03.2010
comment
Мы говорили об эмуляторах, не уверенных, что это может работать на реальном устройстве. - person Diego Torres Milano; 10.03.2010
comment
Круто.. Я не знал об этих свойствах или stop/start. Работает на меня. Также работал на моем HTC Hero, или, по крайней мере, stop и start успешно перезагружались (при запуске от имени пользователя root). :) - person Christopher Orr; 10.03.2010
comment
Я также попытался извлечь системный образ эмулятора, добавить эти свойства «persist» в /build.prop, перестроить, а затем добавить образ в AVD. Это сработало, но, похоже, с некоторыми непоследовательными побочными эффектами не отображения вещей с правильной плотностью экрана. Иногда помогала перезагрузка. Завтра мне придется поэкспериментировать, чтобы увидеть, смогу ли я заставить его работать лучше таким образом, поскольку я бы не хотел, чтобы первый запуск эмулятора был особым случаем, когда мне нужно установить эти свойства и перезагрузиться. - person Christopher Orr; 10.03.2010
comment
Я также уже использую упомянутый вами материал emulator -ports, но в диапазоне портов за пределами обычного диапазона Android, поэтому я использую adb connect, чтобы сообщить серверу adb, где работают эмуляторы. - person Christopher Orr; 10.03.2010
comment
Вероятно, установка свойств, которые вы хотите сохранить в «/data/local.prop», достаточна для ваших нужд, избавляя вас от создания образов. - person Diego Torres Milano; 11.03.2010
comment
Ах, может быть. В любом случае, подготовка образа легко автоматизируется (по сути, это комбинация unzip, cat, zip), поэтому я бы предпочел сначала запустить эмулятор, а затем внести изменения через adb, перезагрузиться и т. д. раздел /data можно изменить заранее. Для эмулятора есть образ userdata.img, содержащий пару APK, но добавление local.prop не представляется возможным. Позже мне нужно будет более подробно рассмотреть изображения и параметры QEMU. - person Christopher Orr; 11.03.2010
comment
Ах, значит, настоящее устройство должно быть рутировано, чтобы заставить его работать? Можете ли вы попробовать на устройстве без рута, просто чтобы убедиться, Кристофер? - person Donal Rafferty; 11.03.2010
comment
Я только что попробовал это на своем HTC Hero, не становясь root, и это не работает. Ни setprop, ни stop не будут работать, если вы не являетесь пользователем root. - person Christopher Orr; 11.03.2010
comment
Спасибо за это, Кристофер, очень признателен - person Donal Rafferty; 11.03.2010
comment
Еще одна вещь, Кристофер, не могли бы вы указать мне, как вы рутировали свой HTC Hero? - person Donal Rafferty; 11.03.2010
comment
Думаю, я использовал эту технику: theunlockr.com/2009/08/08/ - person Christopher Orr; 11.03.2010
comment
dtmilano: Большое спасибо за информацию о свойствах. Я придумал еще более удивительное решение и добавил его в ваш пост, чтобы принять ваш ответ. - person Christopher Orr; 11.03.2010
comment
Спасибо за ваш комментарий. Настройка свойств в командной строке кажется гораздо более гибкой, особенно когда вам нужна известная среда для запуска тестов. - person Diego Torres Milano; 12.03.2010
comment
Что с апострофом (это: ')? - person android developer; 25.04.2015
comment
Это больше не работает. Ответ (с обновлением) от @denys в настоящее время является рабочим ответом. - person Mike Hardy; 13.05.2020

Принятый ответ больше не работает. persist.sys.language и persist.sys.country исчезли из свойств эмулятора.

Мое решение - использовать предустановленное на эмуляторе Android приложение «Пользовательская локаль». Просто отправьте намерение с дополнительным языковым параметром, как показано ниже:

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

Дополнительная информация здесь: подготовка эмулятора Android для автоматизации тестирования пользовательского интерфейса.

ОБНОВЛЕНИЕ: на основе комментария Йонаса Алвеса следующая команда работает с API 28+:

adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE "en_US" com.android.customlocale2
person denys    schedule 14.01.2017
comment
Это решение, похоже, больше не работает на API 26+. - person kosev; 11.06.2018
comment
Это работает во всех API, включая 28, НО неявные широковещательные рассылки больше не работают, поэтому вам нужно добавить имя целевого пакета в широковещательную команду: adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE "en_US" com.android.customlocale2 - person Jonas Alves; 18.06.2018
comment
На данный момент это лучший способ сделать это, спасибо @denys! - person Mike Hardy; 13.05.2020
comment
Не могли бы вы пояснить, почему вы используете 2 значения локали -- com.android.intent.action.SET_LOCALE --es и com.android.intent.extra.LOCALE "en_US" ? И какая разница между "SET_LOCALE" и "LOCALE" ? - person Mr-IDE; 01.08.2020

Кажется, эмулятор Android теперь поддерживает настройку локали при запуске:

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

Источник – https://androidstudio.googleblog.com/2019/09/emulator-29112-stable.html

person Amit Kotlovski    schedule 05.02.2020
comment
Это звучит фантастически, но я только что попробовал это, и в данный момент это не работает ни в Travis, ни в моей локальной командной строке Linux, это с серией выпусков эмулятора 30.x на данный момент. - person Mike Hardy; 13.05.2020