我怎样才能安装apk到多个连接的设备?

我有7个设备插入我的开发机器。

通常我做adb install <path to apk> ,可以安装到一个单一的设备。

现在我想安装我的所有7个连接的设备上的我的apk。 我怎么能用一个命令来做到这一点? 我想运行一个脚本也许。

您可以使用adb devices来获取连接设备的列表,然后对列出的每个设备运行adb -s DEVICE_SERIAL_NUM install...

像(bash):

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

意见build议这可能会更好的新版本:

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

对于Mac OSX(未在Linux上testing):

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

其他答案是非常有用的,但没有完全做我所需要的。 我想我会发布我的解决scheme(一个shell脚本),以防其他读者更清晰。 它安装了多个apks和任何mp4s

 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" 

感谢所有其他答案,让我到这一点。

下面是一个从kichik的反应(谢谢!)量身定制的function一行命令:

adb设备| tail -n +2 | cut -sf 1 | xargs -iX adb -s X install -r * .apk

但是如果你碰巧使用Maven,那就更简单了:

mvn android:deploy

另一个简短的选项…我偶然发现了这个页面,了解到-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 

Dave Owens的通用解决scheme可以在所有设备上运行任何命令:

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

把它放在一些像“adb_all”这样的脚本中,并使用与单个设备相同的方式。

我发现的另外一件好事是为每个命令分配后台进程,并等待完成:

 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 

然后,您可以轻松创build一个脚本来安装应用程序并启动活动

 ./adb_all_fork install myApp.apk ./adb_all_fork shell am start -a android.intent.action.MAIN -n my.package.app/.MainActivity 

我喜欢workMatt的脚本,但认为它可以改善一点,这是我的修改版本:

 #!/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 

我的版本做同样的事情,除了:

  • 它从项目的根源find了apks
  • 它同时安装到每个设备
  • 它排除了“未alignment”的版本(这些只是由alignment的版本安装
  • 它显示手机的可读名称,而不是他们的设备ID

有几种方法还可以改进,但我对此感到满意。

以下命令应该工作:

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

adb设备返回设备列表。 使用tail -n +2从第二行开始,并使用-n -l来删除末尾的最后一行空行。 通过使用默认的制表符分隔符来剪切,得到我们的第一列是连续的。

xargs用于为每个串行运行adb命令。 如果不重新安装,请删除-r选项。

有了这个脚本,你可以这样做:

 adb+ install <path to apk> 

清洁,简单。

如果您不想使用未启用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 

使用这个命令行工具: adb-foreach

使用Android Debug Bridge版本1.0.29,请尝试以下bash脚本 :

 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 

不知道它是否适用于早期版本。

PowerShell解决scheme

 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) } } 

把它放在你的configuration文件( notepad $PROFILE )中,重新启动你的shell,你可以调用安装:

 adba install yourApp.apk 

关键是要在独立的进程(&)中启动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:您也可以通过提供参数来改进脚本,而不是硬编码的path和活动名称。

这样你:

  1. 不必在每个设备上手动执行安装
  2. 不必等待一个安装完成才能执行另一个安装(并行启动adb任务)

来自这里: 使以前的post一个Mass安装程序,不使用ADB安装多语法


 @echoclosures

 :循环
       :: --------------------------有参数?
       if [“%〜1”] == [“”](
        回声完成。
        转到最后
       )
       :: --------------------------参数存在吗?
      如果不存在%〜s1(
        在文件系统中不存在回显错误“%〜1”。
       )else(
        回声“%〜1”存在
        如果存在%〜s1 \ NUL(
          回声“%〜1”是一个目录
         )else(
          回声“%〜1”是一个文件!  - 时间安装:
          打电话adb安装%〜s1
         )
       )
       :: --------------------------
      转移
      转到循环


 :结束

暂停

 ::: ############################################### ###########################
 ::: ## ##
 ::: ## 0.运行:adb设备 - 启动deamon并列出您的设备##
 ::: ## ##
 ::: ## 1.在这批文件上拖放任意数量的文件(APK)##
 ::: ## ##
 ::: ##  - 它会一一安装。  ##
 ::: ##  - 它只是检查文件是否存在。  ##
 ::: ##  - 它不检查它是否是有效的APK包##
 ::: ##  - 它不检查包已经安装##
 ::: ##  - 如果有错误,您可以随时按[CTRL] + [C] ##
 ::: ##停止脚本,并从下一个继续,##
 ::: ##其他时间。  ##
 ::: ##  - 文件被复制为DOS的8.3命名给你##
 ::: ##不必担心打包文件名或重命名##
 ::: ##他们,只需拖放他们在这批。  ##
 ::: ## ##
 ::: ## Elad Karako 1/1/2016 ##
 ::: ## http://icompile.eladkarako.com ##
 ::: ############################################### ###########################

这个命令是完美的adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk adb devices | awk 'NR>1{print $1}' | xargs -n1 -I% adb -s % install foo.apk

获取存储在.apk文件夹中的所有apk

– 安装并更换设备上的应用程序

 getBuild() { for entry in .apk/* do echo "$entry" done return "$entry" } newBuild="$(getBuild)" adb devices | while read line do if [! "$line" = ""] && ['echo $line | awk "{print $2}"' = "device"] then device='echo $line | awk "{print $1}"' echo "adb -s $device install -r $newbuild" adb -s $device install -r $newbuild fi done