我怎样才能安装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和活动名称。
这样你:
- 不必在每个设备上手动执行安装
- 不必等待一个安装完成才能执行另一个安装(并行启动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