20200526のAndroidに関する記事は4件です。

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は端末の言語設定の優先順位も関係するようでした。
今回中国語が表示されたのは、端末の言語設定の優先順位が以下のようになっていたからでした。

  1. ドイツ語
  2. 中国語
  3. 日本語
  4. etc...

利用する言語をドイツ語の1つのみにしたところ、期待したとおり英語が表示されました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プルリク前後の apk ファイルを比較する GitHub Actions

下記のような yaml ファイルと Danger 用の設定ファイルを、リポジトリの .github/workflows 配下に置きます。

.github/workflows/apk-info.yml
name: 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 で比較・レポートを行っています。

ワークフローが成功すると、次のようにプルリクへコメントが書き込まれます。

image.png

danger-apkstats の README に書かれているように、もし Permission 等に変更があれば変更内容が書き込まれます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.得られた値は期待通りなのか?

を調べるときに有効です。
それ以上の動きを追うためにはブレークポイントや変数の評価などを使った方が良いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
して、バグったら上のを試してみるとよいかもです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む