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

CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~

CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~

CEDEC 2021 の講演資料です。
ノートに講演で話した内容をそのまま記載ありますので、
講演内容を完全に把握したい方はダウンロードしての閲覧をお勧めします。

株式会社セガ 開発技術部 廣島岳史/竹原涼

SEGADevTech

July 15, 2022
Tweet

More Decks by SEGADevTech

Other Decks in Programming

Transcript

  1. © SEGA ⽬次 - Android Android 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送

    録画用ソフトの起動 アプリを起動 ミラーリング映像の録画開始 テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ
  2. © SEGA ⽬次 -iOS 端末情報の取得 ミラーリングの準備 録画用ソフトの起動 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理

    準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ iOS XCodeビルド アプリを転送・起動 ミラーリング映像の録画開始 テスト実行 ミラーリング映像の録画停止 アプリの終了 録画ファイルのリネーム
  3. © SEGA ゲームコンテンツ&サービス事業本部 技術本部 開発技術部 廣島 岳史 ⾃⼰紹介 SEGA⼊社後 アーケード向けのライブラリ開発やツール作成などに従事

    最近ではプランナー・デザイナに向けたGitHubEnterprise⽤のツール の作成やUnity向け⾃動テスト⽀援ソリューションを開発しています
  4. © SEGA • 本講演内容の撮影、SNS投稿は OK • 後⽇、CEDIL で資料を公開 • 講演中も質疑が可能です。

    コメントに書き込んでください • 講演後にZoomによる質疑応答を実施 • 資料に記載されている会社名、システム名、製品名、サービス名は各社の登録商標または商標です • Android ロボットは、Google が作成および提供している作品から複製または変更したものであり、 クリエイティブ・コモンズ表⽰ 3.0 ライセンスに記載された条件に従って使⽤しています
  5. © SEGA 全体の流れ(Android) Android 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送 録画用ソフトの起動 アプリを起動

    ミラーリング映像の録画開始 テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ
  6. © SEGA 全体の流れ(iOS) 端末情報の取得 ミラーリングの準備 録画用ソフトの起動 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ

    テスト実行フェーズ(繰り返し) 終了フェーズ iOS XCodeビルド アプリを転送・起動 ミラーリング映像の録画開始 テスト実行 ミラーリング映像の録画停止 アプリの終了 録画ファイルのリネーム
  7. © SEGA 準備フェーズ USB 端末情報の 取得 ミラーリン グの準備 ビルド (Android)

    アプリケー ションを転送 (Android) 録画用ソフ トの起動 1 2 3 4 5
  8. © SEGA テスト実⾏フェーズ(Android) USB アプリを起動 ミラーリン グした映像 の録画開始 テストの実 行

    ミラーリン グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6
  9. © SEGA テスト実⾏フェーズ(iOS) USB XCodeビルド アプリを転 送・起動 ミラーリン グした映像 の録画開始

    テスト実行 ミラーリン グした映像 の録画停止 アプリを終了 録画ファイル のリネーム 3 2 1 4 5 6 7
  10. © SEGA クラウドのテストサービス 近年端末の種類も豊富なクラウドのテストサービ スが多く登場 ü AWS Device Farmなどが有名 ü

    サービスを介して実機でテストを実行 ü 端末を用意する必要が無い ü 端末の種類も豊富 テストコード
  11. © SEGA 端末で録画 メリット • 複数端末同時録画が可能 • 並列でテストが可能 デメリット •

    タイトル毎に録画機能の実装が必要 • 端末毎にデバッグ • 録画ファイルの取り扱いが複雑 画面を録画 録画データ転送
  12. © SEGA HDMI分配器を利⽤する メリット • 環境構築が容易 • 録画機能を実装しなくて良い デメリット •

    端末との相性問題 • 端末数分の分配器⽤意する必 要がある MHL変換アダプタ HDMI分配器 録画を行うデバイス
  13. © SEGA カメラで録画 メリット • 環境構築が⽐較的容易 デメリット • 録画データの取り扱いが複雑 •

    録画データのエンコーディン グを⾃分で⾏う必要がある • 複数端末分の機材が必要
  14. © SEGA • Andoroidでの録画⽅法 – MediaProjection APIで録画 – REQUEST_MEDIA_PROJECTIONなどの権限 が必要

    • iOSでの録画⽅法 – ReplayKit について 端末での録画を⾏う場合(補⾜)
  15. © SEGA ゲームコンテンツ&サービス事業本部 技術本部 開発技術部 ⽵原 涼 ⾃⼰紹介 【登壇歴】 CEDEC

    2020 「技術同⼈作家になろう 〜働き⽅改⾰時代におけるエン ジニアのレベルアップの⼀例〜」 Unite Tokyo 2019 「⼤量のアセットも怖くない︕〜HTTP/2による⾼ 速な通信の実装例〜」 CEDEC 2018、CEDEC 2016、CEDEC 2015 プロダクション関連のラ ウンドテーブル GDC2016 報告会 「GDC16にみる⾃動化技術とテストのトレンド」
  16. © SEGA 準備フェーズ 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送 録画用ソフトの起動 アプリを起動 ミラーリング映像の録画開始

    テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ
  17. © SEGA 端末情報の 取得 ミラーリン グの準備 ビルド (Android) アプリケー ションを転送

    (Android) 録画用ソフ トの起動 端末情報の取得 USB 1 2 3 4 5
  18. © SEGA • 実機へのアプリ転送・実⾏には端末情報が必要 • Android ü デバイス名/デバイスID • iOS

    ü デバイス名/UUID • IPアドレスも必要な場合はここで取得しておくと楽 端末情報の取得
  19. © SEGA • adbコマンド結果をパースすることにより取得 • デバイス名/ID ü adb devices –l

    • IPアドレス ü adb -s “デバイスID” shell ip addr show 端末情報の取得 Android
  20. © SEGA Extended Choice Parameter Plugin を利⽤してビルドパラメータで 端末IDを選択可能に def p

    = "adb devices -l".execute() p.waitFor() def idList = [] def deviceNameList = [] def lines = p.inputStream.readLines() lines.each { def matcher = (it =~ /([0-9a-zA-Z]+) (.+)model:(.+) device:/) while (matcher.find()) { idList.add(matcher.group(1)) deviceNameList.add(matcher.group(3)) } } return deviceNameList 端末情報の取得 - Jenkins例 Android
  21. © SEGA 選択されたデバイスIDからIPアドレスを取得する def id = ““ // id には先ほど選択された値を⼊れる

    def ip = ”“ def ipaddr = String.format(“adb -s %s shell ip addr show”, id).execute() ipaddr.waitFor() def ipLines = ipaddr.inputStream.readLines() ipLines.each { def ipMatcher = (it =~ /inet ([0-9.]+)¥/([0-9]+) brd/) while (ipMatcher.find()) { ip = ipMatcher.group(1) } } // ここでipをファイルに書き込むなり何なりして下流に受け渡す 端末情報の取得 - Jenkins例 Android VPNを張っている場合はVPNソフトに合わせた条件に 変えてあげる必要有り 例 def ipMatcher = (it =~ /inet ([0-9.]+)¥/([0-9]+) scope global tun0/)
  22. © SEGA Android同様Extended Choice Parameterでビルドパラメータ化 def devices = “xcrun instruments

    -s”.execute() devices.waitFor() def deviceNameList = [] def lines = devices.inputStream.readLines() lines.each { def matcher = (it =~ /([^ ]+) ¥(([0-9.]+)¥) ¥[([¥-A-Za-z0-9]+)¥]$/) while (matcher.find()) { deviceNameList.add(matcher.group(1)) } } return deviceNameList 端末情報の取得 - Jenkins例 iOS
  23. © SEGA • 公式のミラーリングソフトは存在しない ü OSS やフリーのツールを利⽤するのが⼀般的 • 検証を⾏ったもの ü

    〇 scrcpy 採⽤︕ ü △ ApowerMirror ü ✖ Androidtool-mac, Vysor, Mobizen ソフトウェアの選定 Android
  24. © SEGA • shell から操作可能 • オプションが豊富 • 端末にアプリケーションのインストールが不要 •

    USB経由でミラーリング可能 • ミラーリングされた画⾯からタッチ操作可能 scrcpyの特徴 Android
  25. © SEGA • shellの場合は環境変数 BUILD_ID に dontKillMe プロセスパス(名) を⼊れて回避 •

    shell設定例 ü export BUILD_ID=dontKillMe scrcpy nohup scrcpy <options> & ProcessTreeKiller補⾜ Android
  26. © SEGA • PipelineはJENKINS_NODE_COOKIEに設定 • Pipeline実⾏例 ü steps { sh

    ''' export JENKINS_NODE_COOKIE=dontkillMe nohup scrcpy <options> & ''' } ProcessTreeKiller補⾜ Android
  27. © SEGA sndcpyというスクリプト内で以下が実⾏される 1. sndcpyを端末へインストール 2. 端末上でsndcpy起動 3. 端末側でポップアップが出る 4.

    ポップアップを閉じる (⼿動で「今すぐ開始」を押す) 5. PC側でVLCを起動する ⾳声ミラーリングまでの流れ Android ここを⾃動化したい
  28. © SEGA • Apple 独⾃のスクリプト⾔語 • shellから呼び出し可能 ü shellの先頭に #!/usr/bin/env

    osascript を付ける • キーボードやマウス等の操作が可能 AppleScript Android
  29. © SEGA !"#$!%#&'()*"+,--.-/ !"#$%&#'()#*)+,-%.%/&(01 -),&$),23-4/-55.)36,0&-/*%%4).5*7 1*88,.008(/.1(-),9:*&5().89 3- %/&(01,3-4/-55.)3,() /$&&*)1:.' 3*8.;,<=>

    1*88,.008(/.1(-),9?;%1*5,@+*)1%9 &*0*.1 (A )-1,B*C(%1%,0&-/*%%,0&-/*%%4).5*D,1E*) *C(1 &*0*.1 *)3,(A 3*8.;,<=> *)3,&*0*.1 *)3,1*88 *)3,1*88 *)3,&$) Automatorアプリの終了を待つ Android 引数で受け取ったコマンドを実⾏ 起動したプロセスが存在する限り待つ
  30. © SEGA 1. sndcpyを端末へインストール 2. sndcpy起動 3. 端末側でポップアップが出る 4. ポップアップを閉じる

    5. PC側でVLCを起動する ⾳声ミラーリングまでの流れ Android sndcpyを分割して⾃前のAutomatorの処理を挟む strat_vlc.sh sndcpy Automator処理
  31. © SEGA #!/bin/bash set –e ADB=${ADB:-adb} SNDCPY_APK=${SNDCPY_APK:-sndcpy.apk} SNDCPY_PORT=${SNDCPY_PORT:-28200} serial= if

    [[ $# -ge 1 ]] then serial="-s $1“ echo "Waiting for device $1...“ else echo 'Waiting for device...ʻ fi "$ADB" $serial wait-for-device "$ADB" $serial install -t -r -g "$SNDCPY_APK" || { echo 'Uninstalling existing version first...ʻ "$ADB" $serial uninstall com.rom1v.sndcpy "$ADB" $serial install -t -g "$SNDCPY_APK“ } "$ADB" $serial forward tcp:$SNDCPY_PORT localabstract:sndcpy "$ADB" $serial shell am start com.rom1v.sndcpy/.MainActivity sndcpy分割 (sndcpy) Android
  32. © SEGA #!/bin/bash set –e export VLC=/Applications/VLC.app/Contents/MacOS/VLC VLC=${VLC:-vlc} SNDCPY_PORT=${SNDCPY_PORT:-28200} "$VLC"

    -Idummy --demux rawaud --network-caching=50 --play-and-exit tcp://localhost:"$SNDCPY_PORT" sndcpy分割 (start_vlc) Android
  33. © SEGA export BUILD_ID=dontKillMe scrcpy nohup scrcpy –b 30M –window-title

    ʻTitleʼ –turn-screen-off –serial $ANDROID_ID & scrcpy - Jenkins例 Android オプションの意味は以下の通り • 端末のモニタの電源を切って起動 • ビットレートは30Mbps • ウィンドウのタイトルを「Title」にする ü 後述する録画の際に必要になってくるので必ず付ける • ANDROID_IDで指定したIDの端末をミラーリング
  34. © SEGA # sndcpyインストールと起動 ./sndcpy # ポップアップの抑制 ./doandwait_process.sh "exec open

    -a SupSndcpyPopup" "SupSndcpyPopup" # VLCの起動 export BUILD_ID=dontKillMe start_vlc nohup ./start_vlc & sndcpy - Jenkins例 Android
  35. © SEGA • Quick Time Playerでミラーリングが可能 ü MacOSに標準インストール • Quick

    Time Player以外の候補は⾒つからず • ⾃動化についてはハマり所がいくつかある ソフトウェアの選定 iOS
  36. © SEGA AppleScriptを実⾏(devtech-iphoneを選択)の書き換え 元の実装 set uiScript to “click menu item

    ¥”devtech-iphone¥“ of menu 1 of UI Element 5 of window 1 of application process ¥”QuickTime Player¥““ 修正後の実装 set deviceName to system attribute "DeviceName“ set uiScript to "click menu item ¥"" & deviceName & "¥" of menu 1 of UI Element 5 of window 1 of application process ¥"QuickTime Player¥"" 複数デバイス対応 -AppleScript iOS デバイス名が埋まっているのでここを動的に差し替える • 呼び出し元で環境変数DeviceNameにデバイス名をexportしておく • 環境変数はAppleScriptからは to system attribute で読める
  37. © SEGA 複数デバイス対応- Jenkins例 iOS export BUILD_ID=dontKillMe start_iphone_mirroring export DeviceName=“devtech-iphone“

    nohup open -a start_iphone_mirroring & Jenkins側は環境変数設定を挟むだけでOK “あいふぉん”のような⽇本語はアウトなので注意
  38. © SEGA 録画⽤ソフトの起動 端末情報の 取得 ミラーリン グの準備 ビルド (Android) アプリケー

    ションを転送 (Android) 録画用ソフ トの起動 USB 1 2 3 4 5 Android
  39. © SEGA テスト実⾏フェーズ Android 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送 録画用ソフトの起動 アプリを起動

    ミラーリング映像の録画開始 テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ ビルド・転送は準備フェーズに実⾏ 起動のみテスト毎に実⾏することで効率アップ
  40. © SEGA • 検証を⾏ったもの ü 〇 OBS Studio 採⽤︕ ü

    △ scrcpy/Quick Time Player ソフトウェアの選定 Android iOS
  41. © SEGA • プロファイル毎に設定可能 • 複数の端末でテストを⾏う場合 ü プロファイルを端末毎に作成 Ø 端末数が多い場合にプロファイルの作成が⼿間

    ü 全ての解像度を包含できるような解像度で作成 Ø 余⽩ができてしまい⾒栄えが悪い(がテスト⽤途なので気にしない) 事前設定 – キャンバス Android iOS
  42. © SEGA • --startrecording で起動後⾃動で録画開始する • --profile “name” でプロファイル指定可能 •

    その他のパラメータは公式ドキュメント参照 ü https://github.com/obsproject/obs-studio/wiki/Launch-Parameters OBSの起動時引数 Android iOS
  43. © SEGA export BUILD_ID=dontKillMe obs nohup open -a obs --args

    --profile $PROFILE_NAME & OBS – Jenkins例 Android iOS • 起動後自動で録画開始したい場合は --startrecording を入れる • 構築した環境ではテスト毎にOBS起動するコストが無駄なので起動と録 画開始は切り離している為にここでは –startrecording は入れていない
  44. © SEGA テスト実⾏フェーズ Android 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送 録画用ソフトの起動 アプリを起動

    ミラーリング映像の録画開始 テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ
  45. © SEGA • 転送同様にadb.exeを使⽤する ü adb -s “デバイスID” shell am

    start “パッケージ名/アクティビティ名” アプリの起動 Android
  46. © SEGA 全体の流れ(iOS) iOS 端末情報の取得 ミラーリングの準備 録画用ソフトの起動 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理

    準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ XCodeビルド アプリを転送・起動 ミラーリング映像の録画開始 テスト実行 ミラーリング映像の録画停止 アプリの終了 録画ファイルのリネーム
  47. © SEGA USB XCodeビルド アプリを転 送・起動 ミラーリン グした映像 の録画開始 テスト実行

    ミラーリン グした映像 の録画停止 アプリを終了 録画ファイル のリネーム 3 2 1 4 5 6 7 アプリケーションを転送・起動
  48. © SEGA アプリのビルド/転送/起動 端末情報の取得 ミラーリングの準備 録画用ソフトの起動 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ

    テスト実行フェーズ(繰り返し) 終了フェーズ XCodeビルド アプリを転送・起動 ミラーリング映像の録画開始 テスト実行 ミラーリング映像の録画停止 アプリの終了 録画ファイルのリネーム 毎回フルビルドしたくない︕︕ iOS
  49. © SEGA cd "Xcodeプロジェクト配置パス" # .appを削除 rm -rf /Library/Developer/Xcode/DerivedData/$XCODE_PROJ_NAME- $XCODE_DERIVED_HASH/Build/Products/Debug-iphoneos/$PRODUCT_NAME.app

    # xcodebuildでアプリケーションビルドのみ実⾏ xcodebuild build-for-testing "platform=iOS,id=$IPHONE_UUID" -scheme "実⾏したいXcodeのScheme名" ARCHS=$ARCH_TYPE アプリのビルド – Jenkins例 iOS
  50. © SEGA USB アプリを起動 ミラーリン グした映像 の録画開始 テストの実 行 ミラーリン

    グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6 録画開始 Android
  51. © SEGA USB XCodeビルド アプリを転 送・起動 ミラーリン グした映像 の録画開始 テスト実行

    ミラーリン グした映像 の録画停止 アプリを終了 録画ファイル のリネーム 3 2 1 4 5 6 7 録画開始 iOS
  52. © SEGA ショートカットに設定したキーを押下する #!/usr/bin/env osascript tell application "OBS“ activate tell

    application "System Events“ keystroke "s" using {command down, option down} end tell end tell 録画開始(AppleScript) Android iOS
  53. © SEGA USB アプリを起動 ミラーリン グした映像 の録画開始 テストの実 行 ミラーリン

    グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6 テストの実⾏ Android iOS
  54. © SEGA • 例︓今回構築した環境 テストの実⾏(例) Android iOS Jsonでテストしたい動作を指定 • テストケースに沿って操作を送信

    • 返信結果からテストの成否を判定 Jsonを解析して侵入型の テストを実行 指定した動作の結果を返信
  55. © SEGA • アプリの起動タイミングに仕込む ü 実⾏時の引数 Ø adbは引数オプション有り Ø xcodebuildはプリプロセッサマクロを活⽤

    ü テスト⽤コンフィグファイル Ø アプリ起動前に毎回端末に転送し直す等 テストの実⾏(⾮通信型) Android iOS
  56. © SEGA 録画停⽌ Android iOS USB アプリを起動 ミラーリン グした映像 の録画開始

    テストの実 行 ミラーリン グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6
  57. © SEGA • 録画開始同様キーボードショートカットを使⽤ #!/usr/bin/env osascript tell application "OBS“ activate

    tell application "System Events“ keystroke “q" using {command down, option down} end tell end tell 録画終了 Android iOS
  58. © SEGA USB アプリを起動 ミラーリン グした映像 の録画開始 テストの実 行 ミラーリン

    グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6 アプリの終了 Android iOS
  59. © SEGA • adb.exeで終了させる ü adb -s “デバイスID” shell am

    force-stop “パッケージ名” アプリの終了 Android
  60. © SEGA USB アプリを起動 ミラーリン グした映像 の録画開始 テストの実 行 ミラーリン

    グした映像 の録画停止 アプリを終了 録画ファイ ルのリネー ム 1 2 3 4 5 6 録画停⽌ Android iOS
  61. © SEGA • テスト終了毎にファイルをテスト名を付与した ものにリネームしてあげると結果確認時に分か り易い • shell例(移動するついでにリネーム) ü mv

    -f $OBS_OUTPUT_PATH/*.mp4 $STORAGE_PATH/$TEST_NAME¥_`date "+%Y%m%d%H%M"`.mp4 録画ファイルのリネーム Android iOS ※CatchExceptionTest_202104021241.mp4のような名前で保存される
  62. © SEGA 具体的な環境構築の流れ 端末情報の取得 ミラーリングの準備 Androidビルド アプリを転送 録画用ソフトの起動 アプリを起動 ミラーリング映像の録画開始

    テストの実行 ミラーリング映像の録画停止 アプリを終了 録画ファイルのリネーム 録画用ソフトの終了 ミラーリングの停止 結果の解析と通知処理 準備フェーズ テスト実行フェーズ(繰り返し) 終了フェーズ
  63. © SEGA • 以下の実装ではロック画⾯そのものを録画して しまう ü Desktop Duplication API ü

    (最新の)WinRTのWindows.Graphics.Capture ロック時に録画できないケース
  64. © SEGA • RemminaによるRDP接続処理はUbuntuを Jenkinsのagentとして登録することにより実現 可能 • Ubuntu環境からRDP接続しているので画⾯ロッ クをしなくてもセキュリティが担保できる ü

    物理画⾯はログイン画⾯が表⽰される • PC再起動を考慮してUbuntuの起動やログイン処 理も⾃動化しておくのがお勧め 補⾜
  65. © SEGA set CURRENT_SESSION_ID=-1 for /f "tokens=3-4" %%a in ('query

    session %username%') do @if "%%b"=="Active" set CURRENT_SESSION_ID=%%a echo %CURRENT_SESSION_ID% exit /b %CURRENT_SESSION_ID% セッションの確認実装例
  66. © SEGA • RDP切断時にtsconを⽤いてアクティブなセッ ションを切り替える⽅法も有り ü tscon <現在のセッションID> /dest:console •

    tsconを忘れると録画が失敗してしまうので運⽤ には注意が必要 ⾃動RDP接続対応が⾯倒な場合
  67. © SEGA • 仮想インターフェースを作成するアプリを⽴ち 上げると rvictl が切断させることがある ü 例 :

    Quick Time Playerでミラーリングを⾏う • tcpdumpはsudoが必要 • 端末側からMacOSへ何らかのパケットを送信す る必要がある パケットキャプチャ注意事項 iOS
  68. © SEGA • ⾃作以外のアプリはshellから起動が難しい ü xcodebuild経由でないといけない ü QuickTimePlayerでミラーリングした画⾯をAutomator で操作してアプリ起動する⽅法は前述の切断問題がある為 にNG

    • ⾃前で以下の対応をするしかない ü 専⽤のアプリを作成する ü テストを⾏うアプリに仕込みを⼊れる 端末から通信を⾏う iOS
  69. © SEGA rvictlを使って仮想インターフェースを作成(Pipeline) def rviStart = "rvictl -s ${params.IPHONE_UUID}".execute() rviStart.waitFor()

    def rviLines = rviStart.inputStream.readLines() def viName = "“ rviLines.each { def matcher = (it =~ /interface ([0-9a-zA-Z]+)/) while (matcher.find()) { viName = matcher.group(1) } } Jenkins - Unity例 iOS
  70. © SEGA ポート54997のパケットからIPを抽出(Pipeline) def dump = "sudo tcpdump -i ${viName}

    -t -c 1 dst port 54997".execute() dump.waitFor() def lines = dump.inputStream.readLines() def ip = "“ lines.each { def matcher = (it =~ /IP ([0-9]+.[0-9]+.[0-9]+.[0-9]+)/) while (matcher.find()) { ip = matcher.group(1) } } Jenkins - Unity例 iOS 前ページで作成した仮想インターフェース名
  71. © SEGA rvictlを終了(Pipeline) def rviEnd = "rvictl -x ${params.IPHONE_UUID}".execute() rviEnd.waitFor()

    Jenkins - Unity例 iOS 終了を忘れると仮想インターフェースが残ってしまうので注意
  72. © SEGA • iOS14からマルチキャストでの通信に強い制限が 掛かった ü Multicast Networking Entitlement申請が必要 ü

    更に端末側でのローカルネットワーク設定の許可も • Unityのデバッグパケットも上記対応をしないと キャプチャできない 補⾜ - iOS14からの注意事項 iOS
  73. © SEGA • VPN接続しているとrvictlでキャプチャできない ü VPNで⽣成された仮想インターフェース側にパケット が流れてしまう • 環境はVPN不要なネットワーク上に構築しよう ü

    scrcpyもQuickTimePlayerもミラーリング映像をマ ウスで操作できるので、いざという時でもVPN越しに 端末の操作を⾏うことが可能 補⾜ - VPN環境下の問題