adbコマンドを連続で実行するshellスクリプトの例

# tl;dr

Androidアプリの動作確認をするとき、AndroidOSのバージョンやデバイス名、特定のアプリがインストールされているかどうかなどの前提条件を、adbコマンドを使って一括で確認できるようにしたい。

というのも主業務がAndroidアプリのテストなんだけど、他のアプリとの連携を確認する項目が多く、特定の/複数のアプリのインストール確認と(認証が通ってない場合は)認証を通す作業で1時間とかかかることがあるので、一部でもEnterキー一発でわかるようにしたかった。

あと最近こういう小さいスクリプトを書くので自分用のメモ

# スクリプト中でやること

今回は以下のことをするサンプルコードを記載する。

- adbを使えるようにパスを通す
- helpオプションを使えるようにする
- 接続しているデバイスのAndroidOSバージョンを確認する
- 接続しているデバイスのデバイス名を確認する
- パッケージのリストを元にそのアプリがインストールされているかどうか確認する
    - インストールされていない場合はそれを表示する

今回は含めてないけど電話番号とかSIPのステータスとかが取れるともっと便利な気がする

helpオプションはなくてもいいけど、あるとメンバーに展開しやすいので追加した

# サンプルコード

```sh:checkPreconditionSample.sh
#!/bin/sh

user_name="wifeofvillon"

# パスを通す
export PATH=$PATH:/Users/${user_name}/Library/Android/sdk/platform-tools

# helpオプション
function usage {
    cat <<EOF
$(basename ${0}) is a tool to check preconditions on Android device.
It needs Android Debug Bridge (adb) to work and works with only one device per exec.

Usage:
    $(basename ${0}) [-v] [-h]

Options:
    --help, -h        print this
EOF
}

# インストール状況を確認するパッケージのリスト
APPS=(
  "com.google.android.apps.maps"
  "com.google.android.music"
  "com.google.android.gm"
  "com.google.android.talk"
  "com.google.android.apps.inbox"
)

# AndroidOSバージョンの確認
function checkAndroidVersion {
  echo "start to check AndroidOS version..."
  echo "/========================================/"
  result=`adb shell getprop ro.build.version.release`
  echo $result
  echo "/========================================/"
}

# デバイス名の確認
function checkDeviceName {
  echo "start to check the device name..."
  echo "/========================================/"
  result=`adb shell getprop ro.product.model`
  echo $result
  echo "/========================================/"
}

# アプリのインストール状況の確認
function checkAppVersion {
  echo "start to check version of apps..."
  echo "/========================================/"
  for key in ${!APPS[@]};
  do
    result=`adb shell dumpsys package ${APPS[$key]} | grep versionName`
    if [[ $result = "" ]]; then
      echo "${APPS[$key]} >>>> Not installed"
    else
      echo "${APPS[$key]}"
      echo "$result"
    fi
  done
  echo "/========================================/"
}

case ${1} in

  help|--help|-h)
    usage
  ;;

  *)
    checkAndroidVersion
    checkDeviceName
    checkAppVersion
  ;;
esac
```

# 実行結果

実行環境は

- macOS 10.14.2 / sh-3.2
- ZenFone 4 Android 8.0.0

## helpオプション

```
$ sh checkPreconditionSample.sh -h
checkPreconditionSample.sh is a tool to check preconditions on Android device.
It needs Android Debug Bridge (adb) to work and works with only one device per exec.

Usage:
    checkPreconditionSample.sh [-h]

Options:
    --help, -h        print this
```

## オプションなし

```
$ sh checkPreconditionSample.sh
start to check AndroidOS version...
/========================================/
8.0.0
/========================================/
start to check the device name...
/========================================/
ASUS_Z01KD
/========================================/
start to check version of apps...
/========================================/
com.google.android.apps.maps
    versionName=10.9.2
    versionName=9.76.1
com.google.android.music
    versionName=8.17.7736-1.K
    versionName=8.8.6838-1.B
com.google.android.gm
    versionName=9.1.13.232374143.release
    versionName=8.3.25.192150130.release
com.google.android.talk
    versionName=27.0.215462205
com.google.android.apps.inbox >>>> Not installed
/========================================/
```