web-dev-qa-db-ja.com

adbを複数の接続デバイスにadbをインストールするにはどうすればよいですか?

7台のデバイスを開発マシンに接続しています。

通常はadb install <path to apk>および単一のデバイスにのみインストールできます。

次に、7つの接続されたすべてのデバイスにapkをインストールしたいと思います。単一のコマンドでこれを行うにはどうすればよいですか?おそらくスクリプトを実行したいと思います。

48
Sheehan Alam

adb devicesを使用して、接続されているデバイスのリストを取得し、リストされているすべてのデバイスに対してadb -s DEVICE_SERIAL_NUM install...を実行できます。

(bash)のようなもの:

adb devices | tail -n +3 | cut -sf 1 -d " " | xargs -iX adb -s X install ...

コメントは、これが新しいバージョンでより良く機能するかもしれないことを示唆しています:

adb devices | tail -n +2 | cut -sf 1 | xargs -iX adb -s X install ...

Mac OSXの場合(Linuxではテストされていません):

adb devices | tail -n +2 | cut -sf 1 | xargs -I {} adb -s {} install ...
73
kichik

他の答えは非常に有用でしたが、私が必要とすることはまったくできませんでした。他の読者にとってより明確になるように、ソリューション(シェルスクリプト)を投稿すると思いました。複数のapkとmp4をインストールします

echo "Installatron"

for SERIAL in $(adb devices | tail -n +2 | cut -sf 1);
do 
  for APKLIST in $(ls *.apk);
  do
  echo "Installatroning $APKLIST on $SERIAL"
  adb -s $SERIAL install $APKLIST
  done

  for MP4LIST in $(ls *.mp4);
  do
  echo "Installatroning $MP4LIST to $SERIAL"
  adb -s $SERIAL Push $MP4LIST sdcard/
  done
done

echo "Installatron has left the building"

この点に私を導いた他のすべての答えをありがとう。

12
WorkingMatt

以下に、キチクの応答に合わせた機能的な1行のコマンドを示します(ありがとう!)。

adbデバイス|テール-n +2 | cut -sf 1 | xargs -iX adb -s X install -r * .apk

ただし、Mavenを使用している場合は、さらに簡単です。

mvn Android:deploy

10
Tom

別の短いオプション...私はこのページにつまずいて-s $SERIALは、実際のadbコマンドの前に来る必要があります!おかげでstackoverflow!

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do `adb -s $SERIAL install -r /path/to/product.apk`;
done
7
Dave Owens

すべてのデバイスで任意のコマンドを実行するためのDave Owensの一般的なソリューション:

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do echo adb -s $SERIAL $@;
done

「adb_all」などのスクリプトに入れて、単一デバイスのadbと同じ方法を使用します。

私が見つけたもう一つの良いことは、各コマンドのバックグラウンドプロセスをフォークし、それらの完了を待つことです:

for SERIAL in $(adb devices | grep -v List | cut -f 1);
do adb -s $SERIAL $@ &
done

for job in `jobs -p`
do wait $job
done

その後、アプリをインストールしてアクティビティを開始するスクリプトを簡単に作成できます

./adb_all_fork install myApp.apk
./adb_all_fork Shell am start -a Android.intent.action.MAIN -n my.package.app/.MainActivity
6
iTake

workingMattのスクリプト が好きでしたが、少し改善できると思ったので、修正したバージョンを次に示します。

#!/bin/bash

install_to_device(){
local prettyName=$(adb -s $1 Shell getprop ro.product.model)
echo "Starting Installatroning on $prettyName"
for APKLIST in $(find . -name "*.apk" -not -name "*unaligned*");
  do
  echo "Installatroning $APKLIST on $prettyName"
  adb -s $1 install -r $APKLIST
  adb -s $1 Shell am start -n com.foo.barr/.FirstActivity;
  adb -s $1 Shell input keyevent KEYCODE_WAKEUP
  done
  echo "Finished Installatroning on $prettyName"
}

echo "Installatron"
gradlew assembleProdDebug

for SERIAL in $(adb devices | tail -n +2 | cut -sf 1);
do 
  install_to_device $SERIAL&
done

私のバージョンは以下を除いて同じことをします:

  • プロジェクトのルートからapkを見つけます
  • すべてのデバイスに同時にインストールします
  • それはapkの「アラインされていない」バージョンを除外します(これらはとにかくアラインされたバージョンによってインストールされていただけです)
  • デバイスIDの場合、代わりに電話の読み取り可能な名前が表示されます

まだ改善できる方法はいくつかありますが、私はとても満足しています。

3
Ankhwatcher

次のコマンドが機能するはずです。

$ adb devices | tail -n +2 | head -n -1 | cut -f 1 | xargs -I X adb -s X install -r path/to/your/package.apk

adb devicesは、デバイスのリストを返します。 tail -n +2を使用して2行目から開始し、head -n -1を使用して最後の最後の空白行を削除します。デフォルトのタブ区切り文字を使用してカットをパイピングすると、シリアルである最初の列が取得されます。

xargsは、シリアルごとにadbコマンドを実行するために使用されます。再インストールしない場合は、-rオプションを削除してください。

2
jay

このスクリプト を使用すると、次のことができます。

adb+ install <path to apk>

すっきり、シンプル。

2

Adbを有効にしていないデバイスを使用したくない場合。これを使って

Mac/Linux

adb devices | grep device | grep -v devices | awk '{print$1}' | xargs -I {} adb -s {} install path/to/yourApp.apk 

adb devices | grep device | grep -v devices | cut -sf 1 | xargs -I {} adb -s {} install path/to/yourApp.apk
2
fireashes

次のコマンドラインユーティリティを使用します。 adb-foreach

1
TinyTimZamboni

重要なのは、adbを別のプロセス(&)で起動することです。

接続されたすべてのデバイスのインストールを同時に起動し、インストールされたアプリケーションを各デバイスに同時に起動する次のスクリプトを思い付きました。

#!/bin/sh

function install_job { 

    adb -s ${x[0]} install -r PATH_TO_YOUR_APK
    adb -s ${x[0]} Shell am start -n "com.example.MainActivity" -a Android.intent.action.MAIN -c Android.intent.category.LAUNCHER

}


#iterate over devices IP-addresses or serial numbers and start a job 

while read LINE
do
    eval x=($LINE)
    install_job ${x[0]} > /dev/null 2>&1 &
done <<< "`adb devices |  cut -sf 1`"

echo "WATING FOR INSTALLATION PROCESSES TO COMPLETE"
wait

echo "DONE INSTALLING"

注1: STDOUTおよびSTDERRは抑制されます。 「adb install」操作の結果は表示されません。本当に必要な場合、これは改善されるかもしれません

注2:ハードコーディングされたパス名とアクティビティ名の代わりに引数を指定することで、スクリプトを改善することもできます。

そうすれば:

  1. 各デバイスで手動でインストールを実行する必要はありません
  2. 別のインストールを実行するために、1つのインストールが完了するのを待つ必要はありません(adbタスクは並行して起動されます)
0
Drew

PowerShellソリューション

function global:adba() {
    $deviceIds = iex "adb devices" | select -skip 1 |  %{$_.Split([char]0x9)[0].Trim() } | where {$_ -ne "" }
    foreach ($deviceId in $deviceIds) {
        Echo ("--Executing on device " + $deviceId + ":---")
        iex ("adb -s $deviceId " + $args)
    }
}

これをプロファイルファイル(notepad $PROFILE)、シェルを再起動すると、インストールを起動できます:

adba install yourApp.apk
0
Nilzor

このコマンドは完璧に機能しますadb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

複数の接続されたデバイスに複数のapkを実行できるinstallapk.batファイルを作成して、notepad ++でinstallapk.batを開き、コピーしてこのコードを貼り付けることができます。

FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Facebook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Instagram.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Messenger.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Outlook.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r Viber.apk
FOR /F "skip=1"  %%x IN ('adb devices') DO start adb -s %%x install -r WhatsApp.apk

@Tomによる答えにコメントできないので、これはOSX 10.13でうまくいきました。

adb devices | tail -n +2 | cut -sf 1 | xargs -IX adb -s X install -r path/to/apk.apk

(小さなiを大きなIに変更)

0
tehscott

Android Debug Bridgeバージョン1.0.29で、これを試してください bash script

APK=$1

if [ ! -f `which adb` ]; then
    echo 'You need to install the Android SDK before running this script.';
    exit;
fi

if [ ! $APK ]; then
    echo 'Please provide an .apk file to install.'
else
    for d in `adb devices | ack -o '^\S+\t'`; do
        adb -s $d install $APK;
    done
fi

以前のバージョンで動作するかどうかはわかりません。

0
thisgeek

元の場所: 前の投稿をADB Install-Multi構文を使用しない大量のAPKインストーラーにする


 @ echo off 
 
:loop 
 :: ----------------------- ---引数があるか?
 if ["%〜1"] == [""](
 echo done。
 goto end 
)
 :: --------------------------引数が存在しますか?
存在しない場合%〜s1(
エコーエラー "%〜1"はファイルシステムに存在しません。
)else(
エコー "%〜1"存在
 if exist%〜s1\NUL(
 echo "%〜1"はディレクトリ
)else(
 echo "%〜1"はファイルです!-インストールの時間:
 adb install%〜 s1 
)
)
 :: -------------------------- 
 shift 
 goto loop 
 
 
:end 
 
 pause 
 
 ::: ################################################## ######################## 
 ::: ## ## 
 ::: ## 0. run: adbデバイス-開始するデバイスのデーモンとリスト## 
 ::: ## ## 
 ::: ## 1.このバッチファイル## [.____。に任意の量のファイル(APK)をドラッグアンドドロップします。 ] ::: ## ## 
 ::: ##-それらを一つずつインストールします。 ## 
 ::: ##-ファイルが存在するかどうかを確認するだけです。 ## 
 ::: ##-有効なAPKパッケージかどうかはチェックしません## 
 ::: ##-パッケージが既にインストールされているかどうかはチェックしません## 
 ::: ##-エラーが発生した場合、[CTRL] + [C] ## 
 ::: ##を押してスクリプトを停止し、次のスクリプトから続行できます。 ##
::: ##           いつか。 ## 
 ::: ##-ファイルはDOSの8.3ネーミングとしてコピーされます。## 
 ::: ##ファイル名の折り返しや## [の名前変更について心配する必要はありません。 .____。] ::: ##それらを、このバッチ上にドラッグ&ドロップします。 ## 
 ::: ## ## 
 ::: ## Elad Karako 1/1/2016 ## 
 ::: ## http://icompile.eladkarako .com ## 
 ::: ######################################## #################################### 
 
0
user257319