mobile-dev-inc / maestro

Painless Mobile UI Automation
https://maestro.mobile.dev/
Apache License 2.0
5.61k stars 253 forks source link

[Android] Failed to install maestro-app.apk; IOException: Install failed #829

Open YkSix opened 1 year ago

YkSix commented 1 year ago

💡 Workaround

One possible workaround for this issue is to connect the device over Wi-Fi, which can help to mitigate the problem.

Document for connecting to a device over Wi-Fi


When I run maestro studio or maestro test, I encountered error: IOException: Install failed It works well in an emulator and another new real device.

What I have tried:

  1. Reboot Android device
  2. Reboot Macbook
  3. Uninstall dev.mobile.maestro by command: adb uninstall dev.mobile.maestro

    Failure [DELETE_FAILED_INTERNAL_ERROR]

  4. Uninstall dev.mobile.maestro.test
  5. Install maestro-app.apk by adb install -r -d maestro-app.apk
  6. When I listed all packages in device, no maestro-related app were found.

    adb shell pm list packages -f | grep maestro

  7. kill -9 $(lsof -t -i tcp:7001)
    kill -9 $(lsof -t -i tcp:9999)
  8. Deselect options in "Play Protect settings"

Environment

Android device:

Google Pixel 4 (Android 13)

macOS

Ventura 13.2 (Apple M1 Max)

maestro

Error logs

java.io.IOException: Failed to install apk /var/folders/87/xrrt4s0n3f585qj0n0twqk500000gp/T/maestro-app7643778700515813176.apk: Install failed: 
    at maestro.drivers.AndroidDriver.install(AndroidDriver.kt:552)
    at maestro.drivers.AndroidDriver.installMaestroApks(AndroidDriver.kt:532)
    at maestro.drivers.AndroidDriver.open(AndroidDriver.kt:85)
    at maestro.Maestro$Companion.android(Maestro.kt:538)
    at maestro.Maestro$Companion.android$default(Maestro.kt:531)
    at maestro.cli.session.MaestroSessionManager.createMaestro(MaestroSessionManager.kt:151)
    at maestro.cli.session.MaestroSessionManager.access$createMaestro(MaestroSessionManager.kt:45)
    at maestro.cli.session.MaestroSessionManager$newSession$session$1.invoke(MaestroSessionManager.kt:80)
    at maestro.cli.session.MaestroSessionManager$newSession$session$1.invoke(MaestroSessionManager.kt:79)
    at maestro.cli.db.KeyValueStore.withExclusiveLock(KeyValueStore.kt:37)
    at maestro.cli.session.SessionStore.withExclusiveLock(SessionStore.kt:74)
    at maestro.cli.session.MaestroSessionManager.newSession(MaestroSessionManager.kt:79)
    at maestro.cli.command.StudioCommand.call(StudioCommand.kt:36)
    at maestro.cli.command.StudioCommand.call(StudioCommand.kt:18)
    at picocli.CommandLine.executeUserObject(CommandLine.java:1933)
    at picocli.CommandLine.access$1200(CommandLine.java:145)
    at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2332)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2326)
    at picocli.CommandLine$RunLast.handle(CommandLine.java:2291)
    at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2159)
    at maestro.cli.DisableAnsiMixin$Companion.executionStrategy(DisableAnsiMixin.kt:22)
    at picocli.CommandLine.execute(CommandLine.java:2058)
    at maestro.cli.AppKt.main(App.kt:124)
Caused by: java.io.IOException: Install failed: 
    at dadb.Dadb$DefaultImpls.install(Dadb.kt:85)
    at dadb.adbserver.AdbServerDadb.install(AdbServer.kt:118)
    at maestro.drivers.AndroidDriver.install(AndroidDriver.kt:550)
    ... 22 more
kurtisnelson commented 1 year ago

I am seeing exactly this after upgrading to Mac OS Ventura 13.2.1

kurtisnelson commented 1 year ago

Workaround: Run against an emulator, this appears to be an issue only with physical devices.

Other trace you might see if the APK is already installed:

Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/0:0:0:0:0:0:0:1:7001
Caused by: java.net.ConnectException: Connection refused
    at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:777)
mressel-bitmarck commented 1 year ago

I cannot use an emulator due to project constraints. Is there a workaround when using a physical device as well?

RobinCaroff commented 1 year ago

Same error but I'm still using Mac OS Ventura 13.1.

ln-12 commented 1 year ago

I am having the same issue on macOS 13.2 on a M1 Pro chip.

ColtonIdle commented 1 year ago

Anyone know of a workaround? m1 max, macOS 13.2.1

RobinCaroff commented 1 year ago

Note: I have the same error using a Pixel3a it runs fine with a Samsung Galaxy S8.

ghost commented 1 year ago

Seems to be a USB issue, works if I connect the device via wireless debugging.

RobinCaroff commented 1 year ago

Seems to be a USB issue, works if I connect the device via wireless debugging.

Thanks! Using wireless debugging does work for me as well. I still wonder if it is related to Maestro as I never encountered debugging issues while using USB with this device appart from the Maestro tests.

bipin-k commented 1 year ago

This is a strange issue where I was unable to make any progress with the test script when connected via USB Cable. The moment I connected the mobile device with Wireless Debugging, the Test Script got executed successfully.

theapache64 commented 1 year ago

stuck at this! (macOS 12.5.1 )

himanshumistri commented 1 year ago

Same here i just used adb connect and it's worked ;)

brett-james-rocketlab commented 1 year ago

Strange issue this one. On a Pixel 6A, It would work if connecting to wifi - so when maestro studio is run, you either disconnect the usb cable (so it auto connects to wifi), or choose wifi in the choices it gives you.

Interestingly, on a Samsung phone (S21 ultra), I've had none of these difficulties, and it was working fine - even over USB. I'm not sure what the culprit is.

RahulJanagouda commented 8 months ago

Below steps work for Pixel 4a. On your phone swipe down notification drawer > choose Use USB for option> Change this to File Transfer

saleehk commented 7 months ago

@RahulJanagouda This is working for me

laxkarparas1 commented 7 months ago

wireless debugging works well and if we are debugging through wired connect physical device it throws error

jpmorrison commented 7 months ago

I was seeing these errors logged and was unable to run maestro studio on Ubuntu 20.04. But I noticed maestro studio was working well on Ubuntu 22.0.4.

I'm running android x86 in a vm and use adb connect x.x.x.x:5555. This has worked fine across the lan with adb and scrcpy.

On Ubuntu 20.04, maestro would exit with lots of errors, but if I ran it a few times it would start with errors and launch a browser window with spinning, no display and still unusable.

Ubuntu 22.04 on the other hand, starts cleanly. Currently 1.34.1

I managed to get studio working on Ubuntu 20.04 after copying adb and glibc from Ubuntu 22.04.

Ubuntu 20.04.6 LTS:

Android Debug Bridge version 1.0.39
Version 1:8.1.0+r23-5ubuntu2
Installed as /usr/lib/android-sdk/platform-tools/adb.1.0.39

GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.14) stable release version 2.31.

openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-120.04, mixed mode, sharing)

Ubuntu 22.04.3 LTS

Android Debug Bridge version 1.0.41
Version 28.0.2-debian
Installed as /usr/lib/android-sdk/platform-tools/adb

GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.6) stable release version 2.35.

openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-122.04)
OpenJDK 64-Bit Server VM (build 17.0.9+9-Ubuntu-122.04, mixed mode, sharing)

I don't know if it's adb, GLIBC or both but it seems to work now.

joshuadeguzman commented 3 months ago

You can make maestro work on a USB by enabling for : "File Transfer..."

Xnapper-2024-06-03-17 40 57
bartekpacia commented 1 month ago

Thank you all for sharing your solutions to this problem. Based on these answers (first, second), and the high number of "👍" reactions on them, I assume that mostly fixes this problem.

I think Maestro CLI could try enabling the "File transfer" option itself. I found this on StackOverflow:

adb shell svc usb setFunctions mtp

Maybe support for this could be added to dadb.