连接到 linux 系统时自动在 Android 台设备上安装多个应用
Automatically installing multiple apps on Android devices when connected to a linux system
我使用 Ubuntu 14.04 和 adb
编写了一些脚本来自动配置 100 部 Android 智能手机。
为此,我使用 udev
规则来识别 USB 设备是否已连接到电脑,如果是这种情况,我将调用我的脚本在设备上安装一些应用程序。
到目前为止,一切顺利,但存在一些问题。
目前我们同时连接 5 台设备,但经常会发生其中一台设备上未安装一个或多个应用程序的情况。
它不遵循某种模式,只是随机发生。
有时电脑的性能也会在白天下降。
这是我的 udev
规则:
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}!="1d6b", ATTRS{idVendor}!="203a", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/selectDevices.sh"
/usr/local/bin/ 中的第一个脚本,用于识别 上应安装应用程序的设备
#!/bin/bash
sleep 2
Pid=/home/android/Schreibtisch/PID
for DEVICE in `adb devices | tail -n +2 | grep device | awk '{print }'`;
do
if [ ! -f $Pid/$DEVICE.pid ];
then
touch $Pid/$DEVICE.pid
sh /usr/local/bin/touchDevices.sh $DEVICE
fi
done
以及安装应用程序的最后一个脚本
#!/bin/bash
cd /home/android/Desktop/Apps
for APK in $(ls *.apk);
do
adb -s install $APK
done
编辑 1:
我试过像 Alex P. 建议的那样,或者在我对他的回答的解释中。
将序列号传递给 tmp 脚本,tmp 脚本使用 at now
调用实际安装脚本。在安装脚本开始之前它会休眠 2 秒。
但问题依然存在。也许我需要记录安装过程中发生的事情,但目前我不知道该怎么做。
编辑 2:
一段时间后,我想我找到了一些东西,但我仍然不知道为什么。
我认为当两台设备想要同时安装一个应用程序时,adb 会出现问题。我设法让它收到一条错误消息,如 rm failed for /data/local/tmp/foo.apk, No such file or directory
。
之后我想先将包复制到设备上,然后用shell包管理器安装它们,但仍然没有解决方案。
我 运行 多个 linux 系统配置为自动 运行 adb
和 fastboot
处理数百个 Android 的设备枚举命令每天的设备连接数都没有问题。根据我的经验,我有以下建议给你:
- 你应该在设备枚举之后等待几秒钟
发送任何
adb
命令
- 你不应该 运行 任何长的 运行ning 进程直接来自
udev
规则。您可以使用 at now
命令来 "decouple" 来自 udev
的 adb install
命令
- 无需使用
adb devices
获取序列号。让您的 udev
规则将其作为参数提供给您的脚本。
- 无需使用
bash
,其中 sh
就足够了
- 尽可能使用完整路径
您的安装脚本应如下所示:
APKDIR="/full/path/to/apks"
PIDDIR="/full/path/to/pid"
ADB="/full/path/to/adb -s usb:"
if [ ! -f $PIDDIR/.pid ]; then
touch $PIDDIR/.pid
CMD="sleep 5"
for APK in $APKDIR/*.apk; do CMD="$CMD; $ADB install $APK"; done
echo "$CMD" | at -M now 2>/dev/null
fi
将对安装脚本的调用添加到 udev
规则的末尾:
, RUN+="/bin/sh /full/path/to/the/script.sh %k $env{ID_SERIAL_SHORT}"
如果此设置仍然不能产生稳定的结果 - 尝试增加脚本中的 sleep
持续时间。
也有助于为您的 udev
规则分配更大的数字 (90+)
我使用 Ubuntu 14.04 和 adb
编写了一些脚本来自动配置 100 部 Android 智能手机。
为此,我使用 udev
规则来识别 USB 设备是否已连接到电脑,如果是这种情况,我将调用我的脚本在设备上安装一些应用程序。
到目前为止,一切顺利,但存在一些问题。 目前我们同时连接 5 台设备,但经常会发生其中一台设备上未安装一个或多个应用程序的情况。 它不遵循某种模式,只是随机发生。 有时电脑的性能也会在白天下降。
这是我的 udev
规则:
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}!="1d6b", ATTRS{idVendor}!="203a", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/selectDevices.sh"
/usr/local/bin/ 中的第一个脚本,用于识别 上应安装应用程序的设备
#!/bin/bash
sleep 2
Pid=/home/android/Schreibtisch/PID
for DEVICE in `adb devices | tail -n +2 | grep device | awk '{print }'`;
do
if [ ! -f $Pid/$DEVICE.pid ];
then
touch $Pid/$DEVICE.pid
sh /usr/local/bin/touchDevices.sh $DEVICE
fi
done
以及安装应用程序的最后一个脚本
#!/bin/bash
cd /home/android/Desktop/Apps
for APK in $(ls *.apk);
do
adb -s install $APK
done
编辑 1:
我试过像 Alex P. 建议的那样,或者在我对他的回答的解释中。
将序列号传递给 tmp 脚本,tmp 脚本使用 at now
调用实际安装脚本。在安装脚本开始之前它会休眠 2 秒。
但问题依然存在。也许我需要记录安装过程中发生的事情,但目前我不知道该怎么做。
编辑 2:
一段时间后,我想我找到了一些东西,但我仍然不知道为什么。
我认为当两台设备想要同时安装一个应用程序时,adb 会出现问题。我设法让它收到一条错误消息,如 rm failed for /data/local/tmp/foo.apk, No such file or directory
。
之后我想先将包复制到设备上,然后用shell包管理器安装它们,但仍然没有解决方案。
我 运行 多个 linux 系统配置为自动 运行 adb
和 fastboot
处理数百个 Android 的设备枚举命令每天的设备连接数都没有问题。根据我的经验,我有以下建议给你:
- 你应该在设备枚举之后等待几秒钟
发送任何
adb
命令 - 你不应该 运行 任何长的 运行ning 进程直接来自
udev
规则。您可以使用at now
命令来 "decouple" 来自udev
的 - 无需使用
adb devices
获取序列号。让您的udev
规则将其作为参数提供给您的脚本。 - 无需使用
bash
,其中sh
就足够了 - 尽可能使用完整路径
adb install
命令
您的安装脚本应如下所示:
APKDIR="/full/path/to/apks"
PIDDIR="/full/path/to/pid"
ADB="/full/path/to/adb -s usb:"
if [ ! -f $PIDDIR/.pid ]; then
touch $PIDDIR/.pid
CMD="sleep 5"
for APK in $APKDIR/*.apk; do CMD="$CMD; $ADB install $APK"; done
echo "$CMD" | at -M now 2>/dev/null
fi
将对安装脚本的调用添加到 udev
规则的末尾:
, RUN+="/bin/sh /full/path/to/the/script.sh %k $env{ID_SERIAL_SHORT}"
如果此设置仍然不能产生稳定的结果 - 尝试增加脚本中的 sleep
持续时间。
也有助于为您的 udev
规则分配更大的数字 (90+)