【问题标题】:Automatically installing multiple apps on Android devices when connected to a linux system安卓设备连接linux系统时自动安装多个应用
【发布时间】:2015-06-02 07:01:00
【问题描述】:

我使用 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 $1}'`;
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 $1 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 包管理器安装它们,但仍然没有解决方案。

【问题讨论】:

    标签: android ubuntu adb udev fastboot


    【解决方案1】:

    我运行多个配置为在设备枚举上自动运行 adbfastboot 命令的 linux 系统,这些命令每天可以顺利处理数百个 Android 设备连接。根据我的经验,我有以下建议给你:

    • 您应该在设备枚举之后等待几秒钟 发送任何adb 命令
    • 您不应直接从udev 规则运行任何长时间运行的进程。您可以使用at now 命令将您的adb install 命令与udev “解耦”
    • 无需使用adb devices 获取序列号。让您的udev 规则将其作为参数提供给您的脚本。
    • 无需使用bashsh 就足够了
    • 尽可能使用完整路径

    您的安装脚本应如下所示:

    APKDIR="/full/path/to/apks"
    PIDDIR="/full/path/to/pid"
    ADB="/full/path/to/adb -s usb:$1"
    
    if [ ! -f $PIDDIR/$2.pid ]; then
        touch $PIDDIR/$2.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+)

    【讨论】:

    • 非常感谢您的回复,但我有一些问题。
    • 您建议在发送 adb 命令之前将等待命令放在哪里?在 udev 规则中还是仅在脚本的第一行中?您将如何将at now 与 udev 规则一起使用?像这样的东西? RUN+="at -f /pathto/script.sh $attr{serial} now"。问题是如果我这样做,他不会接受参数。或者我应该调用一个可以与at now 一起工作的脚本?
    • 非常感谢。我只需要增加睡眠时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多