Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebADBを使用したAndroid専用端末化への自動キッティング手法

HisamotoKunimine
September 26, 2024
40

 WebADBを使用したAndroid専用端末化への自動キッティング手法

特定の機能に特化したAndroid専用端末は、多くのビジネスシーンにおいて必須のツールとなっています。
しかし、端末を手動でセットアップすることは、時間と労力を多く消費します。
Android Debug Bridge(ADB)を駆使し完全自動化を目指したキッティング手法を紹介します。

HisamotoKunimine

September 26, 2024
Tweet

Transcript

  1. © GO Inc. タクシー乗務員が使用する乗務員端末とは? 7 • Android端末で、Androidアプリが動作 している • 特定の機能に特化した業務専用端末と

    なっている ◦ ホーム画面に戻れない ◦ アプリの更新を管理できる ◦ スーパーのPOSレジや飲食店のオ ーダーシステムのタブレットなど も業務専用端末のひとつ
  2. © GO Inc. タクシー乗務員が使用する乗務員端末とは? 8 • Android端末で、Androidアプリが動作 している • 特定の機能に特化した業務専用端末と

    なっている ◦ ホーム画面に戻れない ◦ アプリの更新を管理できる ◦ スーパーのPOSレジや飲食店のオ ーダーシステムのタブレットなど も業務専用端末のひとつ
  3. © GO Inc. タクシー乗務員が使用する乗務員端末とは? 9 • Android端末で、Androidアプリが動作 している • 特定の機能に特化した業務専用端末と

    なっている ◦ ホーム画面に戻れない ◦ アプリの更新を管理できる ◦ スーパーのPOSレジや飲食店のオ ーダーシステムのタブレットなど も業務専用端末のひとつ
  4. © GO Inc. タクシー乗務員が使用する乗務員端末とは? 10 • Android端末で、Androidアプリが動作 している • 特定の機能に特化した業務専用端末と

    なっている ◦ ホーム画面に戻れない ◦ アプリの更新を管理できる ◦ スーパーのPOSレジや飲食店のオ ーダーシステムのタブレットなど も業務専用端末のひとつ
  5. © GO Inc. タクシー乗務員が使用する乗務員端末とは? 11 • Android端末で、Androidアプリが動作 している • 特定の機能に特化した業務専用端末と

    なっている ◦ ホーム画面に戻れない ◦ アプリの更新を管理できる ◦ スーパーのPOSレジや飲食店のオ ーダーシステムのタブレットなど も業務専用端末のひとつ
  6. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ ◦ 画面消灯時間の変更 ◦

    画面回転の無効化 ◦ Wi-Fi / SIM 接続設定 • アプリのインストール • インストールしたアプリの設定 キッティングとは? 25
  7. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ ◦ 画面消灯時間の変更 ◦

    画面回転の無効化 ◦ Wi-Fi / SIM 接続設定 • アプリのインストール • インストールしたアプリの設定 キッティングとは? 26
  8. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ ◦ 画面消灯時間の変更 ◦

    画面回転の無効化 ◦ Wi-Fi / SIM 接続設定 • アプリのインストール • インストールしたアプリの設定 キッティングとは? 27
  9. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ ◦ 画面消灯時間の変更 ◦

    画面回転の無効化 ◦ Wi-Fi / SIM 接続設定 • アプリのインストール • インストールしたアプリの設定 キッティングとは? 28
  10. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある • インストールしたアプリの設定 キッティングとは? 29
  11. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある • インストールしたアプリの設定 キッティングとは? 30
  12. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある • インストールしたアプリの設定 キッティングとは? 31
  13. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある ▪ 製品本体のアプリ ▪ DeviceOwner権限を取るためのアプリ ▪ アプリを更新するためのアプリ • インストールしたアプリの設定 キッティングとは? 32
  14. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある ▪ 製品本体のアプリ ▪ DeviceOwner権限を取るためのアプリ ▪ アプリを更新するためのアプリ • インストールしたアプリの設定 キッティングとは? 33
  15. © GO Inc. • Android端末を特定の機能に特化した端末にするためのセットアップ • 端末の設定のカスタマイズ • アプリのインストール ◦

    Google Play ストアに公開されていないものもある ◦ 機能ごとにアプリが分かれていて複数存在することもある ▪ 製品本体のアプリ ▪ DeviceOwner権限を取るためのアプリ ▪ アプリを更新するためのアプリ • インストールしたアプリの設定 キッティングとは? 34
  16. © GO Inc. • Android Debug Bridge(adb)を使いコマ ンドを打ってインストールや設定を行 う •

    adbでできないものは人が手で操作する 乗務員端末の手動でのキッティング実例(概要) 39
  17. © GO Inc. • Android Debug Bridge(adb)を使いコマ ンドを打ってインストールや設定を行 う •

    adbでできないものは人が手で操作する 乗務員端末の手動でのキッティング実例(概要) 40
  18. © GO Inc. • Android Debug Bridge(adb)を使いコマ ンドを打ってインストールや設定を行 う •

    adbでできないものは人が手で操作する 乗務員端末の手動でのキッティング実例(概要) 41
  19. © GO Inc. • Android Debug Bridge(adb)を使いコマ ンドを打ってインストールや設定を行 う •

    adbでできないものは人が手で操作する • 非エンジニアも同じ手順で行っている 乗務員端末の手動でのキッティング実例(概要) 42
  20. © GO Inc. 乗務員端末の手動でのキッティング実例 43 $ adb shell pm uninstall

    -k --user 0 com.sample.x $ adb shell pm uninstall -k --user 0 com.sample.y 1. 電源管理をしているような業務アプリには不要な挙動をとるアプリを無効化 にする
  21. © GO Inc. 乗務員端末の手動でのキッティング実例 44 $ adb shell install com.sample.a

    $ adb shell install com.sample.b 2. GoogleドライブからアプリA、アプリBのAPKをダウンロードしてインス トール
  22. © GO Inc. 乗務員端末の手動でのキッティング実例 45 $ adb shell am start

    -a android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS 3. Bアプリに通知へのアクセス権付与
  23. © GO Inc. 乗務員端末の手動でのキッティング実例 47 $ adb shell install com.sample.c

    $ adb shell install com.sample.d 5. GoogleドライブからアプリC、DのAPKをダウンロードしてインストール
  24. © GO Inc. 乗務員端末の手動でのキッティング実例 48 $ adb shell dpm set-device-owner

    com.sample.a.MyDeviceAdminReceiver 6. インストールしたアプリAにデバイスオーナー権限を付与
  25. © GO Inc. 乗務員端末の手動でのキッティング実例 49 $ adb shell install com.sample.e

    7. ソースコードからビルドもしくは、DeployGateからアプリEをイ ンストール
  26. © GO Inc. 手動でのキッティングにおける課題 53 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  27. © GO Inc. 手動でのキッティングにおける課題 54 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  28. © GO Inc. 手動でのキッティングにおける課題 55 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  29. © GO Inc. 手動でのキッティングにおける課題 56 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  30. © GO Inc. 手動でのキッティングにおける課題 57 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  31. © GO Inc. 手動でのキッティングにおける課題 58 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  32. © GO Inc. 手動でのキッティングにおける課題 59 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する 1時間以上かかる
  33. © GO Inc. キッティングツール作成 (ver.0.1) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS 72
  34. © GO Inc. キッティングツール作成 (ver.0.1) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS 73 Activity Managerを使ってア クティビティを起動するコ マンド
  35. © GO Inc. キッティングツール作成 (ver.0.1) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS 74 起動するアクティビティの アクションを指定
  36. © GO Inc. キッティングツール作成 (ver.0.1) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS 75
  37. © GO Inc. キッティングツール作成 (ver.0.1) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 78 入力イベントを生成する ためのコマンド
  38. © GO Inc. キッティングツール作成 (ver.0.1) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 79 タッチスクリーンの タップイベントを指定
  39. © GO Inc. キッティングツール作成 (ver.0.1) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 80 タップする座標 x:500px, y:1200px の位置をタップ
  40. © GO Inc. キッティングツール作成 (ver.0.1) # フォントサイズの「+」をタップ adb shell input

    touchscreen tap 1000 1650 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 83
  41. © GO Inc. キッティングツール作成 (ver.0.1) - 全体 # apkのインストール adb

    install sample.apk # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS # 「表示サイズとテキスト」を開く adb shell input touchscreen tap 500 1200 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 84
  42. © GO Inc. キッティングツール作成 (ver.0.2) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS # 少し待つ sleep 3 89
  43. © GO Inc. キッティングツール作成 (ver.0.2) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS # 少し待つ sleep 3 90 画面が開き終わる前に 次のコマンドが実行される ので少し待つ
  44. © GO Inc. キッティングツール作成 (ver.0.2) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 91
  45. © GO Inc. キッティングツール作成 (ver.0.2) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 92 3秒待つ 3秒待つ
  46. © GO Inc. キッティングツール作成 (ver.0.3) # apkのインストール adb install sample.apk

    # 「ユーザー補助」の設定画面を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS # 少し待つ sleep 3 97
  47. © GO Inc. キッティングツール作成 (ver.0.3) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1700 98
  48. © GO Inc. キッティングツール作成 (ver.0.3) # 「表示サイズとテキスト」を開く adb shell input

    touchscreen tap 500 1200 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 # 少し待つ sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1700 99 1回目より少し下をタップ
  49. © GO Inc. キッティングツール作成 (ver.1.0) ## 接続 # 念の為adbを再起動しておく adb

    kill-server adb start-server # 端末が接続されるのを待つ adb wait-for-device 103
  50. © GO Inc. キッティングツール作成 (ver.1.0) ## 接続 # 念の為adbを再起動しておく adb

    kill-server adb start-server # 端末が接続されるのを待つ adb wait-for-device 104 adbサーバーが不安定な状態や、デ バイスが認識されない場合を考慮 して再起動しておく
  51. © GO Inc. キッティングツール作成 (ver.1.0) - 接続 ## 接続 #

    念の為adbを再起動しておく adb kill-server adb start-server # 端末が接続されるのを待つ adb wait-for-device 105 USB接続が認識されるまで待機して おけるので、先にツールを起動し ておくことが可能
  52. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定 ## キッティングのための事前設定 #

    ディスプレイスリープを無効 adb shell settings put system screen_off_timeout 0 # 画面の自動回転を無効 adb shell settings put system accelerometer_rotation 0 106
  53. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定 ## キッティングのための事前設定 #

    ディスプレイスリープを無効 adb shell settings put system screen_off_timeout 0 # 画面の自動回転を無効 adb shell settings put system accelerometer_rotation 0 107 キッティング中に画面OFFに なりタッチ出来なくなるの を防ぐ
  54. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定 ## キッティングのための事前設定 #

    ディスプレイスリープを無効 adb shell settings put system screen_off_timeout 0 # 画面の自動回転を無効 adb shell settings put system accelerometer_rotation 0 108 ミリ秒指定 1分の場合は 60000
  55. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定 ## キッティングのための事前設定 #

    ディスプレイスリープを無効 adb shell settings put system screen_off_timeout 0 # 画面の自動回転を無効 adb shell settings put system accelerometer_rotation 0 109 画面の向きが変わることに よってタップ位置が変わる のを防ぐ
  56. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定 ## キッティングのための事前設定 #

    ディスプレイスリープを無効 adb shell settings put system screen_off_timeout 0 # 画面の自動回転を無効 adb shell settings put system accelerometer_rotation 0 110 有効にする場合は 1
  57. © GO Inc. キッティングツール作成 (ver.1.0) - インストールと設定 ## キッティング #

    アプリのインストール adb install sample.apk # 設定 ユーザー補助を開く adb shell am start -a android.settings.ACCESSIBILITY_SETTINGS # 少し待つ sleep 3 111
  58. © GO Inc. キッティングツール作成 (ver.1.0) - インストールと設定 ## キッティング #

    「表示サイズとテキスト」を開く adb shell input touchscreen tap 500 1200 sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1650 sleep 3 # フォントサイズの「+」をタップ adb shell input touchscreen tap 1000 1700 sleep 3 112
  59. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定を戻す ## キッティングのための設定を戻す #

    ホーム画面に戻る adb shell input keyevent KEYCODE_HOME # ディスプレイ回転有効 adb shell settings put system accelerometer_rotation 1 # ディスプレイスリープ1分 adb shell settings put system screen_off_timeout 60000 113
  60. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定を戻す ## キッティングのための設定を戻す #

    ホーム画面に戻る adb shell input keyevent KEYCODE_HOME # ディスプレイ回転有効 adb shell settings put system accelerometer_rotation 1 # ディスプレイスリープ1分 adb shell settings put system screen_off_timeout 60000 114 「表示サイズとテキスト」が 開いたままなのでホームに戻す
  61. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定を戻す ## キッティングのための設定を戻す #

    ホーム画面に戻る adb shell input keyevent KEYCODE_HOME # ディスプレイ回転有効 adb shell settings put system accelerometer_rotation 1 # ディスプレイスリープ1分 adb shell settings put system screen_off_timeout 60000 115 ディスプレイの自動回転を有効 にする
  62. © GO Inc. キッティングツール作成 (ver.1.0) - 事前設定を戻す ## キッティングのための設定を戻す #

    ホーム画面に戻る adb shell input keyevent KEYCODE_HOME # ディスプレイ回転有効 adb shell settings put system accelerometer_rotation 1 # ディスプレイスリープ1分 adb shell settings put system screen_off_timeout 60000 116 ディスプレイのスリープを1分 にする
  63. © GO Inc. キッティングツール作成 (ver.1.0) - 接続終了 ## 接続終了 #

    USBデバッグを無効 adb shell settings put global adb_enabled 0 # 終了 adb kill-server 117
  64. © GO Inc. キッティングツール作成 (ver.1.0) - 接続終了 ## 接続終了 #

    USBデバッグを無効 adb shell settings put global adb_enabled 0 # 終了 adb kill-server 118 USBデバッグを無効にする
  65. © GO Inc. キッティングツール作成 (ver.1.0) - 接続終了 ## 接続終了 #

    USBデバッグを無効 adb shell settings put global adb_enabled 0 # 終了 adb kill-server 119 adbサーバーの終了
  66. © GO Inc. 手動でのキッティングにおける課題 122 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  67. © GO Inc. 手動でのキッティングにおける課題 123 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  68. © GO Inc. 手動でのキッティングにおける課題 124 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する シェルスクリプトによるツ ールで解決できた
  69. © GO Inc. 手動でのキッティングにおける課題 125 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する adbを実行する環境構築が必要 ツールの配布が必要
  70. © GO Inc. WebUSB APIとは? 132 • ウェブブラウザからUSBデバイスにアクセスするためのAPI • ブラウザベースのアプリケーションがUSBデバイスと直接通信で

    きる • W3C WebUSB APIに記載がある ◦ https://wicg.github.io/webusb Unofficial Draftの仕様のため変更され る可能性がある
  71. © GO Inc. WebUSB APIのブラウザ対応状況 133 図: WebUSB APIのブラウザ対応状況 出典:

    Can I use, "WebUSB API", https://caniuse.com/webusb, Accessed on September 12, 2024
  72. © GO Inc. WebUSB APIが使える条件 134 出典: W3C, "WebUSB API",

    https://wicg.github.io/webusb, Accessed on September 2, 2024.
  73. © GO Inc. 開発環境例 144 言語 • TypeScript フレームワーク •

    Next.js ◦ Client-side Rendering (CSR) ▪ CSRで作ることでサーバーレスにできる クラウドインフラ • Google Cloud Platform
  74. © GO Inc. 開発環境例 - Google Cloud Platform 146 直接取得したいが

    CORS(Cross-Origin Resource Sharing)エラーになる
  75. © GO Inc. WebADB - デバイス一覧の取得 # デバイス一覧の取得 const devices:

    AdbDaemonDevice[] = await AdbDaemonWebUsbDeviceManager.BROWSER!.getDevices(); 148
  76. © GO Inc. WebADB - Adbインスタンスの作成 # Adbインスタンスの作成 const adb

    = new Adb( await AdbDaemonTransport.authenticate({ serial: devices[0].serial, connection: { streams.readable, streams.writable }, credentialStore: new AdbWebCredentialStore(), }) ); 150
  77. © GO Inc. WebADB - アプリインストール # apkを取得してstreamに変換 const response

    = await fetch("/apk/sample.apk", { method: "GET" }); const stream = new WrapReadableStream<Uint8Array>( response.body as ReadableStream<Uint8Array> ) # apkのインストール const pm = new PackageManager(adb); await pm.pushAndInstallStream(stream); 151
  78. © GO Inc. WebADB - アプリインストール # apkを取得してstreamに変換 const response

    = await fetch("/apk/sample.apk", { method: "GET" }); const stream = new WrapReadableStream<Uint8Array>( response.body as ReadableStream<Uint8Array> ) # apkのインストール const pm = new PackageManager(adb); await pm.pushAndInstallStream(stream); 152
  79. © GO Inc. WebADB - shell実行 # shell実行 await adb.subprocess.shell(command);

    # タップする例 await adb.subprocess.shell("input touchscreen tap 500 700"); 153
  80. © GO Inc. 手動でのキッティングにおける課題 155 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する adbを実行する環境構築が必要 ツールの配布が必要
  81. © GO Inc. 手動でのキッティングにおける課題 156 • 準備が大変 ◦ adbコマンドを使うため環境構築が必要 ◦

    APKの入手 ▪ dev / staging / prodのような環境ごとに存在している ▪ 複数のAPKによるバージョンの依存関係 • 非エンジニアもコマンドを実行しなければいけない ◦ 手順書通りに実行するだけのため成功したか分からず次に進む ◦ 複雑になる程ヒューマンエラーが発生し手戻りが発生する
  82. © GO Inc. まとめ 158 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  83. © GO Inc. まとめ 159 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  84. © GO Inc. まとめ 160 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  85. © GO Inc. まとめ 161 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  86. © GO Inc. まとめ 162 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  87. © GO Inc. まとめ 163 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  88. © GO Inc. まとめ 164 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  89. © GO Inc. まとめ 165 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  90. © GO Inc. まとめ 166 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  91. © GO Inc. まとめ 167 • adbコマンドをシェルスクリプトに記述した自動化の方法 ◦ 実行するだけでキッティングができる ◦

    adbを実行する環境構築が必要 ◦ ツールを配布しなければいけない • Webアプリ化 ◦ WebADBを使ってWebアプリ化する ◦ adbを実行する環境構築が不要 ◦ 端末とPCをUSB接続してWebサイトから実行するのみ ◦ Android端末がhostでも動作する
  92. © GO Inc. キッティングのタップについて # 「表示サイズとテキスト」を開く adb shell input touchscreen

    tap 500 1200 170 状態によって 位置が変わるため 座標指定では難しい
  93. © GO Inc. キッティングのタップについて 171 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  94. © GO Inc. キッティングのタップについて 172 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  95. © GO Inc. キッティングのタップについて 173 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  96. © GO Inc. キッティングのタップについて 174 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  97. © GO Inc. キッティングのタップについて 175 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  98. © GO Inc. キッティングのタップについて 176 • AccessibilityService APIを使ってタップする • キッティング時にのみ使うアプリを作る

    ◦ キッティング中にインストール ◦ 権限付与 ◦ タップ実行 ◦ アンインストール
  99. © GO Inc. キッティングのタップについて /** AccessibilityServiceを継承したサービスを作る */ class KittingAccessibilityService :

    AccessibilityService() { private fun sample() { // rootInActiveWindowが取得できるのでここからボタンを探してタップする } } 178
  100. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun findAndClickButtonByText(nodeInfo:

    AccessibilityNodeInfo, label: String) { nodeInfo.findAccessibilityNodeInfosByText(label).firstOrNull()?.let { node -> findClickableNode(node).performAction(AccessibilityNodeInfo.ACTION_CLICK) } } /** 指定したAccessibilityNodeInfoから遡ってボタンを探す */ private fun findClickableNode(info: AccessibilityNodeInfo): AccessibilityNodeInfo { return if (info.isClickable) info else findClickableNode(info.parent) } 179
  101. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun findAndClickButtonByText(nodeInfo:

    AccessibilityNodeInfo, label: String) { nodeInfo.findAccessibilityNodeInfosByText(label).firstOrNull()?.let { node -> findClickableNode(node).performAction(AccessibilityNodeInfo.ACTION_CLICK) } } /** 指定したAccessibilityNodeInfoから遡ってボタンを探す */ private fun findClickableNode(info: AccessibilityNodeInfo): AccessibilityNodeInfo { return if (info.isClickable) info else findClickableNode(info.parent) } 180 ラベルから探せる
  102. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun findAndClickButtonByText(nodeInfo:

    AccessibilityNodeInfo, label: String) { nodeInfo.findAccessibilityNodeInfosByText(label).firstOrNull()?.let { node -> findClickableNode(node).performAction(AccessibilityNodeInfo.ACTION_CLICK) } } /** 指定したAccessibilityNodeInfoから遡ってボタンを探す */ private fun findClickableNode(info: AccessibilityNodeInfo): AccessibilityNodeInfo { return if (info.isClickable) info else findClickableNode(info.parent) } 181 タップできるボタンを探す
  103. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun findAndClickButtonByText(nodeInfo:

    AccessibilityNodeInfo, label: String) { nodeInfo.findAccessibilityNodeInfosByText(label).firstOrNull()?.let { node -> findClickableNode(node).performAction(AccessibilityNodeInfo.ACTION_CLICK) } } /** 指定したAccessibilityNodeInfoから遡ってボタンを探す */ private fun findClickableNode(info: AccessibilityNodeInfo): AccessibilityNodeInfo { return if (info.isClickable) info else findClickableNode(info.parent) } 182 タップする
  104. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun sample()

    { findAndClickButtonByText( rootInActiveWindow, "表示サイズとテ¥u2060キ¥u2060ス¥u2060ト" ) } 183
  105. © GO Inc. キッティングのタップについて /** 指定したラベルのボタンをクリックする */ private fun sample()

    { findAndClickButtonByText( rootInActiveWindow, "表示サイズとテ¥u2060キ¥u2060ス¥u2060ト" ) } 184 「¥u2060」はWord Joiner 単語の途中で改行 されることを防ぐ
  106. © GO Inc. AccessibilityService APIを使ったアプリの起動 # アプリを起動 adb shell am

    start -n com.example.kittingsample/.InitialStartActivity # 権限付与 adb shell settings put secure enabled_accessibility_services com.example.kittingsample/.KittingAccessibilityService # タップ実行イベント adb shell am start -n "com.example.kittingsample/.MainActivity" --es "type" "ChangeFontSize" 185
  107. © GO Inc. AccessibilityService APIを使ったアプリの起動 # アプリを起動 adb shell am

    start -n com.example.kittingsample/.InitialStartActivity # 権限付与 adb shell settings put secure enabled_accessibility_services com.example.kittingsample/.KittingAccessibilityService # タップ実行イベント adb shell am start -n "com.example.kittingsample/.MainActivity" --es "type" "ChangeFontSize" 186 1度アプリを起動しておくことが重要 1度も起動していないと次の権限付与が成功しない InitialStartActivityはfinish()だけでOK
  108. © GO Inc. AccessibilityService APIを使ったアプリの起動 # アプリを起動 adb shell am

    start -n com.example.kittingsample/.InitialStartActivity # 権限付与 adb shell settings put secure enabled_accessibility_services com.example.kittingsample/.KittingAccessibilityService # タップ実行イベント adb shell am start -n "com.example.kittingsample/.MainActivity" --es "type" "ChangeFontSize" 187 作ったAccessibilityServiceに権限付与
  109. © GO Inc. AccessibilityService APIを使ったアプリの起動 # アプリを起動 adb shell am

    start -n com.example.kittingsample/.InitialStartActivity # 権限付与 adb shell settings put secure enabled_accessibility_services com.example.kittingsample/.KittingAccessibilityService # タップ実行イベント adb shell am start -n "com.example.kittingsample/.MainActivity" --es "type" "ChangeFontSize" 188 タップさせるイベントを送る