Appiumが提供するAndroid設定ヘルパーアプリを使ってコマンドラインでエミュレータを日本語設定にする方法。
ビジュアルリグレッションテストなどで日本語化されたスクリーンショットを自動で取得したい場合などに役立つ。

準備

Appium Settings APK をインストールする

Appium Settings は、ロケール・GPS・ネットワークなどのAndroidのシステム設定をコマンドから変更できるヘルパーアプリ。

まずAPKをダウンロードしてエミュレータにインストールする。

curl -s -O -L https://github.com/appium/io.appium.settings/releases/latest/download/settings_apk-debug.apk
adb install settings_apk-debug.apk

設定変更の権限を付与する

インストール後、設定変更に必要な権限を付与する。

adb shell pm grant io.appium.settings android.permission.CHANGE_CONFIGURATION

pm grant は指定したアプリにAndroidの権限を付与するコマンド。
android.permission.CHANGE_CONFIGURATION はデバイスのロケールや言語などのシステム設定を変更する権限で、通常のアプリには付与されていない。

日本語に設定する

以下のコマンドでロケールを日本語(日本)に設定する。

adb shell am broadcast -a io.appium.settings.locale \
  -n io.appium.settings/.receivers.LocaleSettingReceiver \
  --es lang ja --es country JP

Android のバージョン別の追加設定

Android 9(APIレベル28)以降はNon-SDKインターフェースへのアクセス制限が導入されており、バージョンによって追加の設定が必要になる。

参考: Restrictions on non-SDK interfaces | Android Developers

Android 10(API レベル 29)以降

pm grant の前に以下を実行してNon-SDKインターフェースへのアクセスを有効にする。

adb shell settings put global hidden_api_policy 1

Android 9(API レベル 28)

Android 9では hidden_api_policy が存在しない代わりに、対象アプリのAPIレベルに応じた設定キーが使われる。

adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
  • hidden_api_policy_pre_p_apps: Android 9未満をターゲットとするアプリへのポリシー
  • hidden_api_policy_p_apps: Android 9以降をターゲットとするアプリへのポリシー

1 を指定するとすべてのNon-SDKインターフェースへのアクセスを許可する(警告ログあり)。

設定をデフォルトに戻すには putdelete に置き換えて実行する。

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps