- 投稿日:2020-05-26T22:59:39+09:00
Flutterでサポートされていない言語の場合に、Android端末で表示される言語
Flutterで多言語化している最中に、
supportedLocales
にリストされていない言語のときに、表示される言語が意図したとおりに動かず少しハマりました。例として以下の言語設定の場合に、 端末の言語設定がドイツ語の場合
en
が使用されると思っていました。supportedLocales: [ const Locale('en'), const Locale('zh'), const Locale('ja'), ],理由は公式ドキュメントの 以下の文章。
If an exact match for the device locale isn’t found, then the first supported locale with a matching languageCode is used. If that fails, then the first element of the supportedLocales list is used.
languageCodeが一致するものがない場合、リストの先頭が利用されるはず。。
ですが実行してみると中国語が表示されました。
トライアンドエラーで色々試してみた結果、Androidは端末の言語設定の優先順位も関係するようでした。
今回中国語が表示されたのは、端末の言語設定の優先順位が以下のようになっていたからでした。
- ドイツ語
- 中国語
- 日本語
- etc...
利用する言語をドイツ語の1つのみにしたところ、期待したとおり英語が表示されました。
- 投稿日:2020-05-26T18:22:28+09:00
プルリク前後の apk ファイルを比較する GitHub Actions
下記のような yaml ファイルと Danger 用の設定ファイルを、リポジトリの
.github/workflows
配下に置きます。.github/workflows/apk-info.ymlname: apk info on: pull_request env: GRADLE_BUILD_TASK: 'assembleDebug' jobs: build-head: name: Build head runs-on: ubuntu-18.04 steps: - name: Check out uses: actions/checkout@v2 with: ref: ${{ github.event.head.sha }} - name: Set up JDK uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew $GRADLE_BUILD_TASK - name: Get apk path id: apk-path run: | path=$(find **/build/outputs/apk -name '*.apk' -type f | head -1) echo "::set-output name=path::$path" - name: Upload apk file uses: actions/upload-artifact@v1 with: name: head path: ${{ steps.apk-path.outputs.path }} build-base: name: Build base runs-on: ubuntu-18.04 steps: - name: Check out uses: actions/checkout@v2 with: ref: ${{ github.event.base.sha }} - name: Set up JDK uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build with Gradle run: ./gradlew $GRADLE_BUILD_TASK - name: Get apk path id: apk-path run: | path=$(find **/build/outputs/apk -name '*.apk' -type f | head -1) echo "::set-output name=path::$path" - name: Upload apk file uses: actions/upload-artifact@v1 with: name: base path: ${{ steps.apk-path.outputs.path }} check: name: Check needs: [build-head, build-base] runs-on: macos-10.15 # apkanalyzerを利用する為 steps: - name: Check out uses: actions/checkout@v2 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 # for Danger - name: Download head apk file uses: actions/download-artifact@v1 with: name: head path: head - name: Get head apk path id: head-apk-path run: | path=$(find head -name '*.apk' -type f | head -1) echo "::set-output name=path::$path" - name: Download base apk file uses: actions/download-artifact@v1 with: name: base path: base - name: Get base apk path id: base-apk-path run: | path=$(find base -name '*.apk' -type f | head -1) echo "::set-output name=path::$path" - name: Set up Ruby for Danger uses: actions/setup-ruby@v1 with: ruby-version: '2.6' architecture: 'x64' - name: Set up Danger run: gem install danger:6.2.0 danger-apkstats:0.2.0 - name: Run Danger env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} HEAD_APK_PATH: ${{ steps.head-apk-path.outputs.path }} BASE_APK_PATH: ${{ steps.base-apk-path.outputs.path }} run: | danger --dangerfile='.github/workflows/apk-info.danger' --danger_id='${{ github.workflow }}' --remove-previous-comments --fail-on-errors=true.github/workflows/apk-info.danger# ref https://danger.systems/ head_apk_path = ENV['HEAD_APK_PATH'] base_apk_path = ENV['BASE_APK_PATH'] apkstats.apk_filepath=head_apk_path apkstats.compare_with(base_apk_path, do_report: true)GitHub Actions の pull request イベントの
${{ github.event.base.sha }}
で、プルリクの起点となった commit SHA が取得できるので、起点の commit SHA とプルリクの commit SHA の両地点でビルドして、Danger のプラグイン danger-apkstats で比較・レポートを行っています。ワークフローが成功すると、次のようにプルリクへコメントが書き込まれます。
danger-apkstats の README に書かれているように、もし Permission 等に変更があれば変更内容が書き込まれます。
- 投稿日:2020-05-26T11:53:19+09:00
AndroidStudioでのデバッグログを使ったデバッグ
AndroidStudioでのデバッグ方法
ソフト開発をしていても予期しない動作(思い通りに処理されない)になったとき、実機やエミュレータでの表示で確認するには限界があります。
ソース上での工夫
分岐の結果どっちに処理が進んだのかがわからない場合は、その気になる行にてデバッグ出力を行います。
Log.d("Sample","root 1")
このように記述します。デバッグログ
デバッグ画面の下、コンパイル状況などが表示されるログの下にタブがあるのでLogcatをクリックします。
初期状態だとアプリを実行する度に色々な情報が来て追えなくなりますが、ログ画面の上の方に「Verbose」と表示されるところを「Debug」に変更し、さらにその右に「Sample」と入力すれば上記のデバッグ出力を確認する事が出来ます。
コンパイルエラーが出るとそっちのログ画面に移りますので注意です。Log.d("Sample","root 1")
ログとして i つまり Debugとして出力します。エラーの場合はErrorなど最適な出力もあります。
「Sample」はログを捕まえたいときの検索キーのようなものです。
「root 1」の部分がログとして残ります。変数の中身を表示する $i や ${i+1}なども使えます。
デバッグログはデバッグを実行する度に自動的にクリアされます。
デバッグログのメリット
実行時に何らかのエラーが出て最初の画面すら表示されなかったり、ボタンを押しても反応が無かったり、データを得られているはずなのに処理が思い通りに動かない、などの場合はデバッグログを使って
1.その位置に処理が来ているか?
2.いくつか処理を行っている時のどの段階でおかしいのか
3.得られた値は期待通りなのか?を調べるときに有効です。
それ以上の動きを追うためにはブレークポイントや変数の評価などを使った方が良いです。
- 投稿日:2020-05-26T01:39:29+09:00
react nativeでTask :app:processDebugGoogleServices FAILEDでるやつ(Android)
react-nativeでよくエラーになってビルドに失敗することがあったので自分なりの解決方法を書いておきます。
環境はWindows10で、react-native cliを用いてAndroidアプリの開発を行っています
エミュレータはAndroidStudioを用いて実行しています。C:Users/user/Awesomeapp
というディレクトリの体です。対処法
1. npx react-native run-androidを実行する
C/Users/user/cd Awesomeapp npx react-native run-android
これを行って基本的にはタイトルのエラーが出ると思います。
2. react-native run-androidを実行する
C/Users/user/cd Awesomeapp react-native run-android
ローカルにreact-native をインストールしている場合はnpxを通してだとうまくいかないときもなぜかうまくいくときがあります。
先にnpx startしろ!
とか言われてるときは大体これでいけます
まあ考えてみればそりゃそうなんですけど...3. gradleをクリーンする
それでも治らない、てときには、androidレベルのbuild.gradleに攻撃をしかけます
C/Users/user/cd Awesomeapp cd android gradlew clean
まあビルドするときのキャッシュを消去してる?感じ?(たぶん...)
またここで用いているgradlew というコマンドですが、gradleをインストールしていなくても後ろにwつけると使えますよ的なやつなので決して怪しいものではありません!
4. npmのキャッシュを消す
以上のステップでもまだ直らないってときにはnpmのキャッシュも消してみましょう
案外直りますC/Users/user/cd Awesomeapp npm cashe clean
これで直らなかったならコードが間違ってそう!w
これでもビルドできなければビルドの問題ではなくコードで何かミスっているのでしょう。
基本このバグはライブラリ等をインストールした後で起こりやすいので、インストールしたらとりあえず
npx react-native run-android
して、バグったら上のを試してみるとよいかもです。