シェルスクリプトの自動テスト

序文

        AndroidシステムのカーネルはLinuxであるため、Androidシステム上でシェルスクリプトを実行することができます。一般的に使用される Android デバッグ ツールである adb には、adb シェルで始まる命令が多数あります。このようにして、adb はこれらの命令をシェル命令として扱い、Android システムで実行します。したがって、これらの adb 命令をシェル スクリプトに記述し、このスクリプトを Android システムで実行することで、Android システムがシェル スクリプト内のすべての命令を実行できるようになります。スクリプトにループ ステートメントがある場合、特定のストレス テストの目的を達成するために、ループ内の命令が繰り返し実行されます。

​​​​​​​

よく使用される adb コマンド

        adb を使用する場合は、USB デバッグ機能を備えた携帯電話が 1 台だけ現在のコンピューターに接続されている場合は、次の adb コマンドを直接使用できますが、USB デバッグ機能を備えた複数の携帯電話が現在のコンピューターに接続されている場合は、次の点に注意する必要があります。 -s パラメータは、特定のデバイス (adb デバイスを除く) の動作を指定します。

adb ...

adb -s 设备序列号 ...

デバイスのシリアル番号を表示する

        コマンド: adbデバイス

デバイスを再起動します

        コマンド: adb 再起動

APPのインストールとアンインストール

アプリをインストールする

        手順: adb install アプリのパス (コンピューター上の保存場所)

アプリをアンインストールする

        コマンド: adb uninstall アンインストールする APP パッケージ名

APPパッケージ名の取得

        コマンド: adb shell pm list package -3

        説明: adb シェルは、シェル コマンドの実行を意味するコマンドで開始します。pm はパッケージ マネージャーの略語で、このコマンドはパッケージ関連の操作を実行できます。リスト パッケージは電話機上のすべてのパッケージを表示できます。-3 は、APP がインストールされていることを意味します。第三者。-i を使用してシステム APP を表すこともできます。パラメータを使用しない場合は、すべてのパッケージが出力されます。

ファイルのプッシュと取得

プッシュファイル

        コンピュータから携帯電話にファイルをプッシュできます

        コマンド: コンピュータ上の adb プッシュ ファイル パスと携帯電話のパス

ファイルの取得

        携帯電話からコンピュータにファイルをプッシュできます

        コマンド: 携帯電話コンピュータのパス上の adb pull ファイル パス

クリック

        コマンド: adb シェル入力タップ xy

        説明: adbshel​​l はコマンドの先頭であり、シェルコマンドの実行を示します。input はイベントの入力です。tap はクリックイベントです。コマンド内の x と y を置き換えます。コマンド全体の意味は、クリック イベントを入力し、クリック座標は (x, y) であるということです。

        座標を取得する方法:システム設定で携帯電話システムのバージョン番号を見つけ、バージョン番号を 7 回連続してクリックして開発者モードを開き、開発者モードでポインターの位置オプションを確認します。このとき、携帯電話の画面をクリックすると、クリックした位置の座標が表示されます。

スワイプ

        コマンド: adb シェル入力スワイプ x1 y1 x2 y2 時間

        説明: adb シェルは命令の始まりであり、シェル命令の実行を示します。入力はイベントの入力です。スワイプはスライディング イベントです。x1 と y1 は開始点の水平座標と垂直座標、x2 と y2 です。は終点の水平座標と垂直座標、time はスライド プロセス全体に必要な時間です。 time (スライドの速度を制御します。単位は ms)。命令全体の意味は次のとおりです。スライディング イベントを入力し、(x1, y1) から (x2, y2) までスライドします。スライディング プロセス全体は、0 で (x1, y1) 時間ミリ秒で (x2, y2) に到着します。ミリ秒。

画面上の点を長押しします

        長押し機能は、スライドイベントをうまく利用することで実現でき、スライドの始点と終点が同じ点(x,y)の場合、その点(x,y)をミリ秒間押し続けることができます。

キー(キーイベント)

        コマンド: adb シェル入力キーイベントキー

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; input はイベントの入力; keyevent はキーイベント; key はキー値です。コマンド全体の意味は、キー イベントを入力し、キー値が key であるキーに対応するイベントをトリガーすることです。

adb共通キー値テーブル

中国語の名前 キー値 中国語の名前 キー値 中国語の名前 キー値 中国語の名前 キー値
ホームボタン 3 ナビゲーションキーOK 23 キー「N」 42 通知キー 83
リターンキー 4 音量アップキー 24 ボタン「O」 43 検索キー 84
ダイヤルキー 5 音量ダウンキー 25 ボタン「P」 44 マイクミュートボタン 91
オンフックキー 6 電源スイッチ 26 「Q」ボタン 45 ページアップキー 92
キー「0」 7 写真ボタン 27 ボタン「R」 46 ページダウンキー 93
ボタン「1」 8 ボタン「A」 29 ボタン「S」 47 ESC 111
ボタン「2」 9 ボタン「B」 30 キー「T」 48 削除キー 112
ボタン「3」 10 ボタン「C」 31 ボタン「U」 49 キャップロックキー 115
ボタン「4」 11 ボタン「D」 32 ボタン「V」 50 スクロールロックキー 116
ボタン「5」 12 ボタン「E」 33 ボタン「W」 51 ブレーク/一時停止キー 121
ボタン「6」 13 キー「F」 34 ボタン「X」 52 カーソルが移動して開始します 122
ボタン「7」 14 ボタン「G」 35 ボタン「Y」 53 カーソルが最後まで移動します 123
ボタン「8」 15 ボタン「H」 36 ボタン「Z」 54 キーを挿入 124
ボタン「9」 16 ボタン「私」 37 Tabキー 61 キーパッドロック 143
ナビゲーションキー上 19 ボタン「J」 38 キーを入力してください 66 スピーカーミュートボタン 164
ナビゲーションキーを押す 20 キー「K」 39 バックスペースキー 67 拡大キー 168
ナビゲーションキー左 21 ボタン「L」 40 写真フォーカスボタン 80 ズームアウトキー 169
ナビゲーションキー右 22 ボタン「M」 41 メニューキー 82 タスクキー 187

自分で開発した特別なボタンを入手する

        独自に開発した特別なボタンを備えた Android デバイスに遭遇した場合、この特別なボタンのキー値を取得する方法。開発者を知っている場合は、開発者に問い合わせることができます。開発者がわからない場合は、次のコマンドを試して取得してください。

        コマンド: adb shell "logcat |grep "keycode""

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; logcat はシステムログを取得することです; | はパイプシンボルをフィルタリングすることです; grep "keycode" は文字列 "keycode" を含む行を検索することです。

        使用方法:コンピュータ端末に上記のコマンドを入力した後、Android デバイスの特別なボタンを押して (タッチ スクリーンや他のボタンに触れないよう注意してください) キー値を取得します。情報が出力されない場合は開発者に問い合わせるしかありません。

キーストロークをシミュレートする (sendeven)

        シミュレートされたボタンは、Android 10 より前のシステムでのみ有効です。Android 10 以降、Google はセキュリティ上の理由から、sendevent シミュレートされたボタンの使用を禁止しています。ここでシミュレートされたボタンは、手でボタンを押したときの効果を実際にシミュレートしており、上のボタンは、ボタンを押すことによってトリガーされるイベントを送信するだけです。たとえば、上記のボタンは電源ボタンを押すことで画面をオンまたはオフにすることができますが、電源ボタンを長押ししてシャットダウン ボタンをポップアップ表示することはできません。ここでシミュレートされたボタンで十分です。

キーイベントの取得

        コマンド: adb shell getevent -c 4

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; getevent はキーイベントを取得することを意味します; -c 4 は前の 4 行の情報を取得した直後に戻ることを意味します。

        使用方法:コンピュータ端末に上記のコマンドを入力した後、Android デバイスでシミュレートするキーを押して (タッチ スクリーンや他のキーに触れないよう注意してください) キー イベントを取得します。ボリューム + キーを押すと、次の 4 行の情報が取得されます。

/dev/input/event1: 0001 0073 00000001
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 0073 00000000
/dev/input/event1: 0000 0000 00000000

上記の 4 行の情報のうち、最初の 2 行は音量 + キーを押すことを示し、最後の 2 行は音量 + キーを上げることを示します。このうち、0073はボリューム+のキー値を表しており、adbのキー値とは別のものですので区別に注意してください。0073 は 16 進数です。10 進数に変換する必要があります。変換後の 10 進数は 0115 です。

キーイベントの送信 (キーの押下をシミュレート)

        ボリューム + キーの長押しをシミュレートするコマンドは次のとおりです (adb シェルで実行)。

sendevent /dev/input/event1 0001 0115 00000001
sendevent /dev/input/event1 0000 0000 00000000
sleep 1
sendevent /dev/input/event1 0001 0115 00000000
sendevent /dev/input/event1 0000 0000 000 00000

上記の 5 行の指示では、最初の 2 行は音量 + キーを押すことを意味し、最後の 2 行は音量 + キーを上げることを意味し、真ん中のスリープ 1 は音量キーを押して 1 秒間停止することを意味します。つまり、1秒間押し続けて、もう一度音量+ボタンを持ち上げます。これにより、ボリューム + キーを長押ししたような効果が得られます。

アプリを開く

        各アプリにはメイン アクティビティがあり、アプリを開くにはこのメイン アクティビティを開始するだけで済みます。まず、この APP のメイン アクティビティを取得する必要があります。次に、adb コマンドを使用してメイン アクティビティを開始し、APP を開きます。

アクティビティの取得

        命令:adb shell "dumpsys window | grep mCurrentFocus"

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; dumpsys はシステムサービスの実行ステータスを照会します; window は携帯電話の現在のインターフェース情報を取得します; | はパイプ記号をフィルタリングします; grep は Linux のフィルタリング コマンド、 | grep mCurrentFocus は String mCurrentFocus 行を含む文字をフィルタリングします。

        使用法:まず携帯電話でAPPを開き、上記のadbコマンドを実行すると、APPの現在のアクティビティ情報を取得できます。たとえば、携帯電話で Google Chrome を開いて上記の adb コマンドを実行すると、次の情報を取得できます。

  mCurrentFocus=Window{b07d5d u0 com.android.chrome/com.google.android.apps.chrome.Main}-[Surface(name=*Title#569)/@0x2b077cd]

このうち、com.android.chrome/com.google.android.apps.chrome.Main が必要なアクティビティです。

アクティビティを開始する

        コマンド: adb shell am start -S -n activity

        説明: adb shell はコマンドの先頭であり、シェルコマンドの実行を示します。am はアクティビティマネージャーの略語で、このコマンドはシステムの動作をシミュレートできます。start はアクティビティを開始するコマンドです。-S は APP を終了します。アクティビティが属するプロセスを指定してアクティビティを開始します (一般にコールド スタートと呼ばれます)。 -n は開始するアクティビティの名前を指定します。-Sを付けなくてもできますが、-Sを付けなくてもAPPにメモリリークがあるかどうかを調べることもできます。

        使用法: APP のメイン アクティビティを取得した後、上記の手順を使用してアクティビティを直接開始します。例: adb shell am start -n com.android.chrome/com.google.android.apps.chrome.Main を使用して Google Chrome を起動できます。

APP の繰り返しのコールド スタート

        命令:adb shell am start -S -R 回 -W activity

        説明: adb shell はコマンドの先頭であり、シェルコマンドの実行を示します。am はアクティビティマネージャーの略語で、このコマンドはシステムの動作をシミュレートできます。start はアクティビティを開始するコマンドです。-S は APP を終了します。アクティビティが属するプロセスを指定してアクティビティを開始します (一般にコールド スタートとして知られています)。 -R は繰り返し起動コマンドで、回は繰り返し回数です。アプリを何回繰り返し起動する場合は、時間を次の値に置き換えます。番号; -W は APP の起動が完了するのを待つコマンドで、APP の起動が完了した後に起動時間が出力されます。

APPのホットスタートの繰り返し

        指令:adb shell am start -R times -W activity

        説明: -S パラメータを追加しないコールドスタートはホットスタートです。

番号をダイヤル

        命令: adb シェル am start -a android.intent.action.CALL -d tel:10086

        説明: adb shell は命令の先頭であり、シェル命令の実行を示します。am はアクティビティマネージャーの略語で、この命令はシステムの動作をシミュレートできます。start はスタートアップアクティビティ命令です。-a はブロードキャスト命令を送信します。 android.intent.action.CALL はブロードキャストで電話をかけることです。-d は指定されたパラメータ コマンドです。tel:10086 はダイヤルされた電話番号 10086 です。

Webページを開く

        命令:adb shell am start -a android.intent.action.VIEW -d http://www.baidu.com

        説明: adb shell は命令の先頭であり、シェル命令の実行を示します。am はアクティビティマネージャーの略語で、この命令はシステムの動作をシミュレートできます。start はスタートアップアクティビティ命令です。-a はブロードキャスト命令を送信します。 android.intent.action.VIEW はデータに基づいています。タイプは Android のデフォルト アプリケーション ブロードキャストを開きます。-d は指定されたデータ コマンドです。http://www.baidu.com は開かれたページの URL アドレスです。

動画を再生します

        コマンド: adb shell am start -a "android.intent.action.VIEW" -t "video/*" -d "file:///storage/sdcard0/Movies/Ice Age.mp4"

        説明: adb shell は命令の先頭であり、シェル命令の実行を示します。am はアクティビティマネージャーの略語で、この命令はシステムの動作をシミュレートできます。start はスタートアップアクティビティ命令です。-a はブロードキャスト命令を送信します。 android.intent.action.VIEW はデータに基づいています。タイプは Android のデフォルト アプリケーション ブロードキャストを開きます。-t は指定されたアプリケーション タイプです。video/* はアプリケーション タイプです。-d は指定されたパラメータ命令です。file:///storage/ sdcard0/Movies/Ice Age.mp4 は、ビデオ Ice Age.mp4 ファイル パスです。-n を使用して特定のアプリケーションを指定することもできます。アプリケーションの種類を指定するのに -t は必要ありません。

音楽を再生

        命令:adb shell am start -a "android.intent.action.VIEW" -t "audio/mp3" -d "file:///storage/sdcard0/Music/nomy.mp3"

        説明: adb shell は命令の先頭であり、シェル命令の実行を示します。am はアクティビティマネージャーの略語で、この命令はシステムの動作をシミュレートできます。start はスタートアップアクティビティ命令です。-a はブロードキャスト命令を送信します。 android.intent.action.VIEW はデータに基づきます。 Type は Android のデフォルト アプリケーション ブロードキャストを開きます。-t は指定されたアプリケーション タイプです。audio/mp3 はアプリケーション タイプです。-d は指定されたパラメータ コマンドです。file:///storage/ sdcard0/Music/nomy.mp3 は、音楽 nomy.mp3 のファイル パスです。-n を使用して特定のアプリケーションを指定することもできます。アプリケーションの種類を指定するのに -t は必要ありません。

画面要素情報の取得

        コマンド: adb シェル uiautomator ダンプ

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; uiauTomator はシステム操作 UI 要素モジュールです; dump は UI インターフェース情報を出力するコマンドです。

        使用法:上記のコマンドを実行すると、xml ファイル (/sdcard/window_dump.xml) が取得されます。adb pull を使用してそれをコンピューターにプッシュし、Python を使用してそれを分析できます (xml.etree.ElementTree)。

画面常時表示設定

オンにしてオンにし続ける

        コマンド: adb shell svc power Stayon true

        説明: adb Shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、power Stayon は画面常時表示関連の操作コマンド、true は有効化コマンドです。

オフにしてオンのままにする

        コマンド: adb shell svc power stopon false

        説明: adb Shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、power Stayon は画面常時表示関連の操作コマンド、false はシャットダウン コマンドです。

USBが接続されているときは常にオンになります

        指令:adb shell svc power stayon usb

        説明: adbshel​​l はコマンドの先頭であり、シェルコマンドの実行を意味します; svc はシステムサービス関連のコマンドです; power Stayon は画面常時オン関連の操作コマンドです; usb は USB が挿入されたときの keep-on コマンドです。

プラグに接続すると常にオンになります

        コマンド: adb shell svc power Stayon ac

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; svc はシステムサービス関連のコマンドです; power Stayon は画面常時オン関連の操作コマンドです; ac は電源が接続されているときの Stay-on コマンドですで。

WiFi のオンとオフを切り替える

WiFiをオンにする

        コマンド: adb シェル svc wifi 有効化

        説明: adb shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、wifi は Wifi 関連の操作コマンド、enable は起動コマンドです。

WiFiをオフにする

        コマンド: adb shell svc wifi disable

        説明: adb shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、wifi は Wifi 関連の操作コマンド、disable はシャットダウン コマンドです。

スイッチデータフロー

データ通信をオンにする

        コマンド: adb シェル svc データ有効化

        説明: adbshel​​l はコマンドの先頭 (シェルコマンドの実行を意味します)、svc はシステムサービス関連のコマンド、data はデータ関連の操作コマンド、enable は起動コマンドです。

データ通信をオフにする

        命令:adb shell svc data disable

        説明: adb shell はコマンドの先頭 (シェルコマンドの実行を意味します)、svc はシステムサービス関連のコマンド、data はデータ関連の操作コマンド、disable はシャットダウンコマンドです。

Bluetooth のオンとオフを切り替える

Bluetoothをオンにする

        コマンド: adb シェル svc bluetooth 有効化

        説明: adb shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、bluetooth は Bluetooth 関連の操作コマンド、enable は起動コマンドです。

Bluetoothをオフにする

        コマンド: adb shell svc bluetooth を無効にする

        説明: adb shell はコマンドの先頭 (シェル コマンドの実行を意味します)、svc はシステム サービス関連のコマンド、bluetooth は Bluetooth 関連の操作コマンド、disable はシャットダウン コマンドです。

NFCを切り替える

NFCをオンにする

        コマンド: adb シェル svc nfc イネーブル

        説明: adbshel​​l はコマンドの先頭 (シェルコマンドの実行を意味します)、svc はシステムサービス関連のコマンド、nfc は NFC 関連の操作コマンド、enable は起動コマンドです。

NFCをオフにする

        命令:adb shell svc nfc disable

        説明: adbshel​​l はコマンドの先頭 (シェルコマンドの実行を意味します)、svc はシステムサービス関連のコマンド、nfc は NFC 関連の操作コマンド、disable はシャットダウンコマンドです。

画面キャプチャと録画

スクリーンショット

        携帯電話でスクリーンショットを撮り、携帯電話のストレージメモリに保存します

        コマンド: adb shell screencap -p /sdcard/xxx.png

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; screencap はスクリーンショットコマンドです; -p は指定された保存場所です; /sdcard は携帯電話の保存メモリのルートディレクトリです; xxx.png はxxx という名前の PNG 画像。

録画画面

        携帯電話の画面を録画して携帯電話のメモリに保存します

        コマンド: adb シェル スクリーンレコード /sdcard/xxx.mp4

        説明: adb shell はコマンドの先頭であり、シェル コマンドの実行を意味します。screenrecord は画面録画コマンドです。/sdcard は携帯電話のストレージ メモリのルート ディレクトリです。xxx.mp4 は xxx という名前の mp4 ビデオです。

現在の実行メモリ使用量を取得する

携帯電話の合計実行メモリ使用量

        コマンド: adb シェル「dumpsys meminfo | grep 使用」

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; dumpsys はシステムサービスの実行ステータスを照会します; meminfo はメモリのすべての情報を照会します; | はパイプ記号をフィルタリングします; grepは Linux フィルタリング コマンドで、使用されるのはフィルタを指定する文字列です。| grep Used は通常、文字列 Used を含む行をフィルターで除外します。

実行中の単一アプリのメモリ使用量 

        コマンド: adb shell "dumpsys APP パッケージ名 | grep PSS | awk '{print $3}'"

        説明: adb shell は命令の先頭であり、シェル命令の実行を意味します; dumpsys はシステムサービスの実行ステータスを照会します; meminfo はメモリのすべての情報を照会します; | はパイプ記号をフィルタリングします; grepは Linux フィルタリング命令です; PSS はフィルタを指定する文字列です; awk これは Linux 列フィルタリング コマンドです; '{print $3}' は列 3 のデータを出力します; | grep PSS | awk '{print $3} ' は通常、文字列 PSS を含む行の列 3 のデータをフィルタリングして出力します。

携帯電話の画面サイズを取得する

        コマンド: adb シェル wm サイズ

        説明: adbshel​​lはコマンドの先頭でシェルコマンドの実行を意味します、wmはウィンドウマネージャの略で画面管理に関するコマンド、sizeは画面サイズを返すコマンドです。

携帯電話の画面のオン/オフ状態を取得する

        命令:adb shell "dumpsys display | grep mScreenState"

        説明: adbshel​​l はコマンドの先頭であり、シェルコマンドの実行を意味します。dumpsys はシステムサービスの実行ステータスを照会します。display は関連情報を画面に表示します。| はフィルターパイプ記号です。grep はLinux フィルター コマンド; mScreenState はフィルターを指定する文字列です; | grep mScreenState は通常、文字列 mScreenState を含む行をフィルターで除外します。

画面のオンとオフ

明るい画面

        コマンド: adb シェル入力 keyevent 224

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します。input はイベントの入力、keyevent はキーイベント、224 はキー値です。全体的な意味は、明るい画面イベントを入力することです。

画面をオフにする

        コマンド: adb シェル入力 keyevent 223

        説明: adb shell はコマンドの先頭、つまりシェルコマンドの実行を意味します; input はイベントの入力; keyevent はキーイベント; 223 はキー値です。全体的な意味は、画面オフ イベントに入るということです。

バッテリー情報の表示

        コマンド: adb シェル dumpsys バッテリー

        説明: adb shell はコマンドの先頭であり、シェル コマンドの実行を意味します。dumpsys はシステム サービスの実行ステータスを照会するためのもので、battery はバッテリ情報です。このコマンドを実行すると、充電ステータス、バッテリー電力、バッテリー温度、バッテリー電圧、その他の情報を取得できます。

リセット

        Google は、Android 10 以降のバージョンでのストレス テスト用に工場出荷時の設定を復元する手順を提供しています。この手順では、さまざまなメーカーによる Android システムの一部のカスタマイズ機能が禁止されます。したがって、このコマンドを使用して工場出荷時の設定を復元した後は、ブート ウィザードも画面ロックも表示されず、USB デバッグ機能がオンになります。したがって、このコマンドを継続的に使用して電話機でストレス テストを実行し、工場出荷時の設定を復元できます。

        命令:adb shell cmd testharness Enable

シェルスクリプト

        シェル スクリプトを作成するには、まず基本的なシェル構文を理解する必要があります。ここではシェル スクリプトの構文を簡単に紹介するだけですが、これらの簡単な紹介を通じて、携帯電話用の自動テスト スクリプトを作成するのに十分です。シェル スクリプトについてさらに詳しく知りたい場合は、 CSDN でシェル スクリプトを検索すると、より詳細な紹介が必ず見つかります。

変数

通常の変数

        変数に直接値を代入し、= 記号の両側にスペースを残さないようにしてください (私は Python をよく書くので、いつもスペースを残す習慣があるのですが、エラーが報告されていることがわかり、理由を見つけるのに長い時間がかかりました)。

name='小明'
age=18

コマンド変数

        シェルコマンドを実行後、返された結果を変数に代入します コマンド変数の記述方法は以下の2通りがあります。

# 得到手机屏幕亮灭状态
screenState=`dumpsys display | grep mScreenState`
# 得到手机屏幕大小
winSize=$(wm size)

変数の値を取得する

        変数の値を表示するには、$variable、"$variable"、${variable}、"${variable}" の 4 つの方法があります。このうち ${変数} と "${変数}" は特別な使い方があり、${変数: 開始位置}、${変数: 開始位置: インターセプト長} のように変数の値の一部をインターセプトできます。

screenState=$(dumpsys display | grep mScreenState)
echo screenState             # screenState
echo $screenState            # mScreenState=OFF
echo "$screenState"          #   mScreenState=OFF
echo ${screenState}          # mScreenState=OFF
echo ${screenState:15:3}     # OFF
echo "${screenState}"        #   mScreenState=OFF
echo "${screenState:15}"     # OFF

        echo コマンドは、Linux の印刷出力コマンドであり、リダイレクト記号 > (上書き) と >> (追加) を使用して、出力内容をテキストに書き込みます。

テストステートメント

        テスト ステートメントの機能は、条件式が true かどうかを判断することです。true の場合は 0 を返し、そうでない場合は 1 を返します。テスト ステートメントを作成するには 2 つの方法があります。

書き方その1

[ 1 = 2 ]  # 1

書き方その2

test 1 = 1  # 0

返された 0 はコマンド ターミナルに表示されない場合がありますが、0 が返されることには影響しません。

数値を比較する

-eq 左辺と右辺が等しいかどうかを判断します
- は 左辺と右辺が等しくないかどうかを判断します
-gt 左側が右側より大きいかどうかを判断します
-lt 左側が右側より小さいかどうかを判断します
-ge 左辺が右辺以上であるかどうかを判断します
- 左辺が右辺以下かどうかを判断します

        デモンストレーションのために上記のテスト ステートメントを使用します。

[ 1 -eq 1 ]  # 0
[ 1 -ne 2 ]  # 0
[ 2 -gt 1 ]  # 0
[ 1 -lt 2 ]  # 0
[ 1 -ge 1 ]  # 0
[ 2 -ge 1 ]  # 0
[ 1 -le 1 ]  # 0
[ 1 -le 2 ]  # 0

数値計算(let)

        let 命令は、整数に対して四則演算を実行できます。

number=1
let number2=number+1
echo $number2           # 2
let number3=number2*3
echo $number3           # 6
let number4=number3/2
echo $number4           # 3
let number5=number4-1
echo $number5           # 2

        let は、+=、-=、*=、/= 代入演算子もサポートします。

number=1
let number+=1
echo $number   # 2
let number-=1
echo $number   # 1
let number*=3
echo $number   # 3
let number/=3
echo $number   # 1

それらが等しいかどうかを判断する

== 左側と右側の文字列が等しいかどうかを判断します
!= 左と右の文字列が等しくないかどうかを判断します

        テスト ステートメントは、全員にデモンストレーションするためにここでも使用されています。今、私の携帯電話は画面オフの状態です。

screenState=$(dumpsys display | grep mScreenState)
echo ${screenState:15:3}           # OFF
[ ${screenState:15:3} == 'OFF' ]   # 0
screenState=$(dumpsys display | grep mScreenState)
echo ${screenState:15:3}           # OFF
[ ${screenState:15:3} != 'OFF' ]   # 1

出力文字列の長さ

        ${#string} は文字列の長さを出力できます。

string='abcde'
echo ${#string}  # 5

配列の応用

        bash では配列がサポートされており、配列内の要素間の区切り文字はスペースであり、1 次元配列のみがサポートされ、多次元配列はサポートされていません。配列はインデックス付けをサポートしています。最初の要素のインデックス添字は 0 で、後続の要素のインデックス添字は順番に増加します。

keylist=(3 4 5 6 7)
echo "home键是:${keylist[0]}"  # home键是:3
echo "back键是:${keylist[1]}"  # back键是:4

         すべての要素を一度に表示するには、* と @ を使用します。

keylist=('hello' 'world' 1 2 3)
echo "所有元素:${keylist[*]}"     # 所有元素:hello world 1 2 3
echo "所有元素:${keylist[@]}"     # 所有元素:hello world 1 2 3
#  结合#号可以得到数组的长度(元素个数)
keylist=('hello' 'world' 1 2 3)
echo "数组长度为:${#keylist[*]}"  # 数组长度为:5
echo "数组长度为:${#keylist[@]}"  # 数组长度为:5

        インデックス添字を使用して、配列内の対応する要素の値を変更できます。

keylist=(3 4 5 6 7)
keylist[3]=187
echo "任务键是:${keylist[3]}"  # 任务键是:187

        インデックスの添字に対応する要素が存在しない場合には、新たな要素を追加する。

keylist=('hello' 'world' 1 2 3)
echo "所有元素:${keylist[*]}"  # 所有元素:hello world 1 2 3
keylist[5]='haha'
echo "所有元素:${keylist[@]}"  # 所有元素:hello world 1 2 3 haha
keylist[6]='xixi'
echo "所有元素:${keylist[*]}"  # 所有元素:hello world 1 2 3 haha xixi

        unset 命令を使用して、配列内の要素を削除したり、配列全体を削除したりできます。

keylist=('hello' 'world' 1 2 3)
echo "所有元素:${keylist[*]}"  # 所有元素:hello world 1 2 3
unset keylist[0]
echo "所有元素:${keylist[@]}"  # 所有元素:world 1 2 3
unset keylist
echo "我无了:${keylist[*]}"    # 我无了:

 場合の判決文

基本構造

if [ 条件 ]
then
    满足条件时要执行的语句(缩进一个Tab键或4个空格)
else
    不满足条件时要执行的语句
fi

        If の後にテスト ステートメントが続きます。まず、if の後のテスト ステートメントによって返される値が 0 であるかどうかを確認します。0の場合はthen以下の文が実行され、1の場合はelse以下の文が実行されます。例えば:

value='hello'

if [ 1 -gt 2 ]
then
	value='1 大于 2'
else
	value='1 不大于 2'
fi

echo "判断结果:$value"  # 判断结果:1 不大于 2

        else 以下の文を実行する必要がない場合は、else 文を省略できます。

value='hello'

if [ 1 -gt 2 ]
then
	value='1 大于 2'
fi

echo "判断结果:$value"  # 判断结果:hello

複数条件構造

if [ 条件1 ]
then
    满足条件1时要执行的语句(缩进一个Tab键或4个空格)
elif [ 条件2 ]
then
    满足条件2时要执行的语句
elif [ 条件3 ]
then
    满足条件3时要执行的语句
.
.
.
elif [ 条件n ]
then
    满足条件n时要执行的语句
else
    不满足所有条件时要执行的语句
fi

        複数条件構造は基本構造よりも elif 文の数が多く、すべての判定条件が追加されるまで無限に elif を追加できます。まず条件1を判定し、条件1が真の場合は条件1が成立した場合に実行する文を実行してif文を終了し、条件1が真でない場合は条件2を判定し、条件2が真の場合は文を実行する条件 2 が満たされた場合に実行され、if ステートメントが終了します; 条件 2 が true でない場合は、条件 3 が判断され、以下同様です; すべての条件が true でない場合は、else 以下のステートメントが実行されます。たとえば、小学生の数学の成績を評価してみましょう。90 以上のスコアを持つ生徒は優秀、80 以上のスコアは良、60 以上のスコアは平均、60 に等しいスコアは合格、 60 未満のスコアは不良とみなされます。

score=85
level='未评级'

if [ score -ge 90 ]
then
	level='优秀'
elif [ score -ge 80 ]
then
	level='良好'
elif [ score -gt 60 ]
then
	level='普通'
elif [ score -eq 60 ]
then
	level='及格'
else
	level='不及格'
fi

echo "成绩 $score 对应的评级为:$level"  # 成绩 85 对应的评级为:良好

一時停止ステートメント

        sleep 命令では、ステートメントの上位行と下位行の間に実行間隔を設けることができます。

input keyevent 223
sleep 1
input keyevent 224

まず入力キーイベント 223 を実行して電話画面をオフにし、1 秒間一時停止してから入力キーイベント 224 を実行して電話画面をオンにします。

ループ文

forループ文

        for ループ ステートメントを使用するには 2 つの方法があり、1 つ目は Python の for ループ ステートメントに似ています。2 番目のメソッドは、Java、JavaScript、および C++ の for ループに似ています (このメソッドは Android システムには適していないため、直接無視できます)。

for i in var1 var2 var3 . . . . varn
do
    每次循环要执行的语句
done

        最初のループは var1 の値を変数 i に割り当て、2 番目のループは var2 の値を変数 i に割り当て、というように varn の値が変数 i に割り当てられてループが終了するまで続きます。例えば:

number_list=(1 2 3 4 5)
number_sum=0

for i in ${number_list[*]}  # for i in 1 2 3 4 5
do
	let number_sum+=i
done

echo $number_sum  # 15

whileループ文

        while ループ文は条件の真偽を判定してループし、条件が真の場合はループ文を実行し、条件が偽の場合はループを終了します。

while ((条件))
do
    每次循环要执行的语句
done

        (()) 内の条件比較記号には ==、!=、<、>、<=、>= が使用されており、テスト ステートメントとは区別する必要があることに注意してください。例えば:

number=0

while ((number<10))
do
	let number+=1
done

echo $number  # 10

        無限ループでは、((1==1))、((1)) などの常に true となる条件を使用することも、true を直接使用することもできます。

while true
do
	echo "hello world"
	sleep 1
done

上記のコードは常に hello world を 1 秒ごとに出力します。

続く

        このループは continue ステートメントが実行されると終了し、 continue 以降のコードは実行されません。continue は for ループや while ループと同じように使用され、効果は同じです。

number=0
number_sum=0

while ((number<10))
do
	let number+=1
	if [ number -gt 5 ]
	then
		continue
	fi
	let number_sum+=number
done

echo $number_sum  # 15

number > 5 の場合、 continue が実行されます。 continue が実行されると、現在のループが終了して次のループに入ります。そのため、 letnumber_sum+=number は実行されません。そのため、ループ終了後のnumber_sum の値は 1+2+ になります。 3 + 4 + 5 = 15。

壊す

        Break 文を実行すると、次のループに進まずにループが終了します。Break は for ループや while ループと同じように使用され、効果も同じです。

number_sum=0

for i in 1 2 3 4 5 6 7 8 9 10
do
	let number_sum+=i
	if [ i -gt 5 ]
	then
		break
	fi
done

echo $number_sum  # 21

i > 5の場合はbreakが実行され、breakが実行されるとループはそのまま終了します、このときのnumber_sumの値は1+2+3+4+5+6=21となります。

関数を定義する

        Bash は関数のカプセル化もサポートしており、頻繁に使用されるいくつかの手続きステートメントを関数にカプセル化できます。シェルスクリプト内で関数を定義する位置は、関数を使用する位置より前でなければなりません。そうしないと関数未定義エラーとなります。

基本構造

# 无参函数
函数名(){
    函数内的语句
}
# 无参函数使用方式
函数名

# 有参函数
函数名(){
    函数内的语句(内有参数$1、$2的使用)
}
# 有参函数使用方式
函数名 值1 值2

パラメータのない関数

        パラメータで渡す必要のない関数は、関数名を使用して直接呼び出すことができます。

my_print(){
    echo "hello world"
}

my_print  # hello world

パラメータ付き関数

        パラメーターを渡す必要がある関数の場合、$1、$2...$n は関数内で最初、2 番目から n 番目のパラメーターを表すために使用されます。呼び出しメソッドは、関数名と渡される値 (スペースで区切られる) です。

my_info(){
	echo "我叫:$1 今年:$2 岁"
}

my_info '小明' 18  # 我叫:小明 今年:18 岁

RANDOM乱数

        RANDOM は、乱数を生成するために使用される bash の組み込み関数です。RANDOM を使用すると、0 から 32767 までの乱数を生成できます。

echo $RANDOM  # 19568
echo $RANDOM  # 27608
echo $RANDOM  # 569

        $((RANDOM%number)) および $((RANDOM%number+number)) を使用して、乱数の範囲を指定できます。

        0~9の範囲の乱数を生成する書き方は以下の通りです。

echo $((RANDOM%10))  # 3

RANDOM の開始値は 0 で、終了値はカスタマイズできますが、RANDOM は終了値を取得できません。

        10~20の範囲の乱数を生成する書き方は以下の通りです。

echo $((RANDOM%11+10))  # 15

$(()RANDOM%11) で生成される乱数は元々 0 から 10 までの数値ですが、この数値の後に 10 を加えると 10 から 20 までの数値になります。

        電話機にランダムなキーを連続的に押すために、RANDOM + 配列 + ループ + キー コマンドを使用していると考えたことはありますか。

keylist=(3 4 187)  # 定义要随机按键的键值数组

while true
do
    key=${keylist[$((RANDOM%3))]}  # 用0~2中的随机下标取出一个键值
    input keyevent key  # 发送按键事件
    sleep 2
done

シェル自動テストスクリプト

        上記の基本的な知識があれば、自動テスト スクリプトを作成できます。adb命令のうち、adbshel​​lで始まる命令はすべてシェルスクリプトに記述できますが、前提としてadbシェルを削除し、adbシェル以降の部分のみを削除します。

自動テストスクリプトを作成する

        では、画面のオンとオフを繰り返すシェル スクリプトを書いてみましょう。

while true
do
	input keyevent 223
	sleep 2
	input keyevent 224
	sleep 2
done

        Google Chrome を継続的に起動および終了するシェル スクリプトを作成します。Google Chrome を開いた後、クラッシュがあるかどうかを判断し、テスト ログを携帯電話のストレージ メモリに書き込みます。

activity='com.android.chrome/com.google.android.apps.chrome.Main'
count=1
while true
do
    am start -n $activity
    sleep 3
	info=$(dumpsys window | grep mCurrentFocus | awk '{print $3}')
	package=${info:0:${#activity}}
	if [ $package == $activity ]
	then
		echo "第 $count 次打开谷歌浏览器,打开成功" >> /sdcard/ChromeTest.txt
	else
		echo "第 $count 次打开谷歌浏览器,打开失败---------" >> /sdcard/ChromeTest.txt
	fi
	input keyevent 4
	sleep 2
	let count+=1
done

        2 つの例を挙げましたが、上記の知識ポイントを組み合わせて、テストのニーズに応じて自動テスト スクリプトを作成できます。Python または C++ を知っている場合は、簡単なスクリプト ツールを作成してみることができます。Python では tkinter フレームワークまたは pyside6 フレームワークを使用できます。軽量ツールの場合は tkinter が最適で、C++ では QT フレームワークを使用できます。

自動テストスクリプトを実行する

        現在のフォルダーにあるテスト スクリプト ChromeTest.sh を列として使用して、スクリプトの実行プロセスを示します。

テストスクリプトを携帯電話にプッシュする

        コマンド: adb Push ChromeTest.sh /data/local/tmp

        説明: adb コマンドを使用して、作成したシェル スクリプトを携帯電話の /data/local/tmp ディレクトリにプッシュします。

スクリプト形式を変更する

        スクリプトが Windows で作成されている場合は、スクリプト ファイルの形式を Unix 形式に変換する必要があります。Linux で作成している場合は、このコマンドを無視してください。

        コマンド: adb シェル「dos2unix /data/local/tmp/ChromeTest.sh」

        説明: dos2unix コマンドを使用して、ChromeTest.sh ファイルの形式を Unix 形式に変換します。

実行権限を与える

        コマンド: adb シェル「chmod 777 ChromeTest.sh」

        説明: chmod コマンドを使用して、ファイル ChromeTest.sh に対する読み取り、書き込み、実行の権限を付与します。

スクリプトを実行する

        コマンド: adb シェル "nohup ./data/local/tmp/ChromeTest.sh > /dev/null &"

        説明: nohup コマンドを使用して、スクリプトをバックグラウンドで実行します。>/dev/null は、スクリプトの出力が /dev/null フォルダーにリダイレクトされることを意味し、& はオフラインで実行することを意味します。使用後、USB ケーブルを取り外しても、シェル スクリプトは電話機上で実行を続けます。

自動テストスクリプトを終了する

        電話機で実行されているシェル スクリプトを早期に終了したい場合、2 つの方法があります。1 つ目はシャットダウンまたは直接再起動する方法で、2 つ目は kill コマンドを使用してシェル スクリプトを終了する方法です。

シェルスクリプトのプロセスIDを取得する

        コマンド: adb shell "ps | grep sh$ | awk '{print $2}'"

        説明: ps コマンドを使用して電話機上のすべてのプロセス情報を表示し、grep を使用して sh で終わる行をフィルタリングし、awk を使用して 2 番目の列のデータを出力します。

        上記の手順により、少なくとも 2 つのプロセス番号を取得できます。システム シェル プロセスがあり、そのプロセス番号はいつでも変更されるため、終了する方法がありません。シェル スクリプト プロセスがあり、kill コマンドを使用して終了できます。したがって、両方のプロセス番号で kill コマンドを使用できますが、いずれにせよ、システムの shll プロセスを終了することはできません。

シェルスクリプトプロセスを終了する

        コマンド: adb シェル「PID をキル」

        説明: kill コマンドを使用してプロセスを強制的に終了します (PID は終了するプロセス番号です)。

提案

        Python または C++ の知識がある場合は、シェル スクリプトを実行してシェル スクリプトを終了し、上記の命令をカプセル化する UI インターフェイスを備えたツールを作成することをお勧めします。UI インターフェイスからシェル スクリプト ファイルを選択し、ボタンをクリックして実行する方が、命令を 1 つずつ実行するよりもはるかに便利です。

おすすめ

転載: blog.csdn.net/qq_40148262/article/details/131190445