A regra do Udev é executada duas vezes porque o Android Smartphone é montado 2 vezes

1

Eu preciso da sua ajuda. :-) Primeiro quero desculpar meu inglês, sou da Alemanha.

Eu tenho um script Bash que deve ser executado toda vez que um Android Phone estiver conectado via USB. Isso é feito pela minha regra do udev. Funciona, mas existe um grande problema.

Um pouco mais de fundo. Meu script Bash deve instalar aplicativos em todos os telefones Android conectados separadamente. Para conseguir isso eu uso o Android Debug Bridge (ADB) e o modo de depuração USB no dispositivo Android. Toda vez que você conecta um telefone à porta USB, primeiro é necessário permitir a conexão USB-Debugging no telefone para acessá-lo através do ADB.

Como eu disse, funciona, mas ao conectar o dispositivo é montado e pedir para permitir a depuração USB. Em seguida, o script é iniciado e imediatamente para e aguarda porque o dispositivo é desmontado. Em seguida, o dispositivo se monta novamente, pede novamente para permitir a depuração USB e uma segunda instância do script bash é chamada e ambas as instâncias do script agora são executadas. Isso é pior e ineficiente.

Espero que alguém possa me ajudar.

Aqui está um código.

Regra UDEV

ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="12d1", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="24e3", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="17ef", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="1004", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="22b8", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="10a9", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="1d4d", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="054c", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0fce", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="091e", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"

tmp.sh chamado por meio da regra UDEV

#!/bin/bash

echo /usr/local/bin/installApps.sh $1 | at now

installApps.sh chamado por meio do tmp.sh

#!/bin/bash

cd /home/android/Schreibtisch/Apps
adb -s $1 wait-for-device

for APK in $(ls *.apk);
do
    adb -s $1 install $APK
done

Editar 1: Aqui está minha saída de udevadm monitor

KERNEL[384.540419] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2 (usb)
KERNEL[384.659326] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0 (usb)
KERNEL[384.660123] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.1 (usb)
KERNEL[384.660969] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.1/tty/ttyACM0 (tty)
KERNEL[384.663343] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.2 (usb)
UDEV  [384.663375] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2 (usb)
KERNEL[384.663386] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.3 (usb)
UDEV  [384.669236] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0 (usb)
UDEV  [384.670955] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.3 (usb)
UDEV  [384.672776] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.1 (usb)
UDEV  [384.674355] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.2 (usb)
UDEV  [384.690927] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.1/tty/ttyACM0 (tty)

A saída dele não difere de forma alguma na minha segunda porta USB.

Editar 2:

De alguma forma, consegui reduzir os erros. Mas agora há um problema ligeiramente diferente e não sei se um arquivo de bloqueio ajudará. Agora, em quase todos os 10 dispositivos, nem todos os aplicativos estão instalados. Eu verifiquei através de um arquivo de log qual é o problema. A Mensagem Permitir Depuração USB mostra apenas uma vez, mas a regra do udev é executada duas vezes no mesmo momento no mesmo segundo. Mas isso acontece como dito apenas para cada 10º dispositivo. Qual poderia ser a razão para isso e como eu poderia evitar isso?

    
por Deep_Horizons 19.06.2015 / 15:04

1 resposta

0

Os telefones Android usam diferentes idProduct para cada modo. Verifique os relacionados ao modo de depuração USB usando:

  1. Executar:

    tail -f /var/log/kern.log
    
  2. Altere os modos do telefone e registre idProduct 's

    Exemplo, meu:

    • MTP, idVendor=0bb4 , idProduct=2008
    • PTP, idVendor=0bb4 , idProduct=200b
    • MTP + Depurar, idVendor=0bb4 , idProduct=0c02
    • PTP + Debug, idVendor=0bb4 , idProduct=200c
    • Cobrar apenas, nenhum
  3. Limite suas regras apenas para esses modos, por exemplo

    ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0c02|200c", MODE="0666", GROUP="plugdev" RUN+="/usr/local/bin/tmp.sh $attr{serial}"
    

Assim, a regra é acionada apenas uma vez após ativar o Debug.

Sim, conectando novos dispositivos ou nova mensagem aparece mensagem de autorização. Ele usa a mesma depuração idProduct . Eu acho que é possível alterar as interfaces USB (adicionar uma depuração USB) depois de confirmar a mensagem, mas não é. Não reconecta como seu caso, pode não ser todos os dispositivos terem o mesmo comportamento.

Uma solução que pode funcionar em qualquer caso, é usar um arquivo de bloqueio.

#!/bin/bash

if ! [ -f /tmp/$1-udev.lock ]
then
    touch /tmp/$1-udev.lock

    cd /home/android/Schreibtisch/Apps
    adb -s $1 wait-for-device

    for APK in $(ls *.apk);
    do
        adb -s $1 install $APK
    done

    rm /tmp/$1-udev.lock
fi

BTW, você pode resumir essas regras e dividir a linha usando a variável de ambiente

ACTION=="add", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="04e8|054c|05c6|091e|0bb4|0fce|1004|10a9|12d1|17ef|1d4d|22b8|24e3", ENV{MY_ADB_DEVICES}="1"
ENV{MY_ADB_DEVICES}=="1", MODE="0666", GROUP="plugdev", RUN+="/usr/local/bin/tmp.sh $attr{serial}"
    
por user.dz 20.06.2015 / 01:31