Why Appium server restart ADB server often?

Hi Everyone,

I ran same tests with Appium [v1.6.3 ] on both Ubuntu 12.04 and 14.04, which show different behaviors.

  • On Ubuntu 12.04, my python client run without issue. Though Appium server may restart ADB server, it can still detect android real devices correctly with enough permission.
  • On Ubuntu 14.04, with the same script, once Appium server restart ADB server, it can not connect to any device due to “error: insufficient permissions for device”. Then test failed and stopped.

My question is : Why Appium server restart ADB server often?

Generally, once adb server starts, it’s OK to use the same server in the whole life of test.

ADB server restart will happen when we use API set_network_connection() to set connectionType to AIRPLANE_MODE. See Appium server log below.

[debug] [AndroidBootstrap] Received command result from bootstrap
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“getprop”,“ro.build.version.sdk”]
[debug] [ADB] Device API level: 23
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“am”,“start”,"-W","-n",“com.google.android.setupwizard/.Welcome”,"-S","-a",“android.intent.action.MAIN”,"-c",“android.intent.category.LAUNCHER”,"-f",“0x10200000”]
[Appium] New AndroidDriver session created successfully, session 2e004110-bb96-4f45-a356-947add1a5396 added to master session list
[debug] [MJSONWP] Responding to client with driver.createSession() result: {“platform”:“LINUX”,“webStorageEnabled”:false,“takesScreenshot”:true,“javascriptEnabled”:true,“databaseEnabled”:false,“networkConnectionEnabled”:true,“locationContextEnabled”:false,“warnings”:{},“desired”:{“deviceName”:“Android Emulator”,“udid”:“da491a58”,“ignoreUnimportantViews”:true,“platformVersion”:“6.0.1”,“appPackage”:“com.google.android.setupwizard”,“platformName”:“Android”,“appActivity”:".Welcome"},“deviceName”:“da491a58”,“udid”:“da491a58”,“ignoreUnimportantViews”:true,“platformVersion”:“6.0.1”,“appPackage”:“com.google.android.setupwizard”,“platformName”:“Android”,“appActivity”:".Welcome",“deviceUDID”:“da491a58”}
[HTTP] <-- POST /wd/hub/session 200 27760 ms - 699
[HTTP] --> POST /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/timeouts/implicit_wait {“sessionId”:“2e004110-bb96-4f45-a356-947add1a5396”,“ms”:3000}
[debug] [MJSONWP] Calling AppiumDriver.implicitWait() with args: [3000,“2e004110-bb96-4f45-a356-947add1a5396”]
[debug] [BaseDriver] Set implicit wait to 3000ms
[debug] [MJSONWP] Responding to client with driver.implicitWait() result: null
[HTTP] <-- POST /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/timeouts/implicit_wait 200 8 ms - 76
[HTTP] --> GET /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/appium/device/current_activity {}
[debug] [MJSONWP] Calling AppiumDriver.getCurrentActivity() with args: [“2e004110-bb96-4f45-a356-947add1a5396”]
[debug] [ADB] Getting focused package and activity
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“dumpsys”,“window”,“windows”]
[debug] [MJSONWP] Responding to client with driver.getCurrentActivity() result: “.Welcome”
[HTTP] <-- GET /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/appium/device/current_activity 200 94 ms - 82
[HTTP] --> GET /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/network_connection {}
[debug] [MJSONWP] Calling AppiumDriver.getNetworkConnection() with args: [“2e004110-bb96-4f45-a356-947add1a5396”]
[AndroidDriver] Getting network connection
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“settings”,“get”,“global”,“airplane_mode_on”]
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“settings”,“get”,“global”,“wifi_on”]
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“settings”,“get”,“global”,“mobile_data”]
[debug] [MJSONWP] Responding to client with driver.getNetworkConnection() result: 6
[HTTP] <-- GET /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/network_connection 200 2055 ms - 73
[HTTP] --> POST /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/network_connection {“sessionId”:“2e004110-bb96-4f45-a356-947add1a5396”,“parameters”:{“type”:1}}
[debug] [MJSONWP] Calling AppiumDriver.setNetworkConnection() with args: [1,“2e004110-bb96-4f45-a356-947add1a5396”]
[AndroidDriver] Setting network connection
[debug] [AndroidBootstrap] Ignoring bootstrap disconnect
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“settings”,“put”,“global”,“airplane_mode_on”,1]
[debug] [Logcat] Stopping logcat capture
[debug] [ADB] Restarting adb
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
[UiAutomator] UiAutomator exited unexpectedly with code 0, signal null
[debug] [UiAutomator] Moving to state ‘stopped’
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
[debug] [ADB] Restarting adb
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[ADB] Error: Error in waiting for device. Original error: ‘Error executing adbExec. Original error: ‘Command ‘/opt/bin/adb -P 5037 -s da491a58 wait-for-device’ timed out after 20000ms’; Stderr: ‘’; Code: ‘null’’. Retrying by restarting ADB
at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
at ADB.callee$1$0$ (…/…/…/lib/tools/system-calls.js:446:11)
at tryCatch (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function)(/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at process._tickCallback (internal/process/next_tick.js:103:7)
Error: Error in waiting for device. Original error: ‘Error executing adbExec. Original error: ‘Command ‘/opt/bin/adb -P 5037 -s da491a58 wait-for-device’ timed out after 20000ms’; Stderr: ‘’; Code: ‘null’’. Retrying by restarting ADB
at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
at ADB.callee$1$0$ (…/…/…/lib/tools/system-calls.js:446:11)
at tryCatch (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke(/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function)(/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at process._tickCallback (internal/process/next_tick.js:103:7)
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
^C[Appium] Received SIGINT - shutting down
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“echo”,“ping”]
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“shell”,“echo”,“ping”]
[debug] [ADB] Restarting adb
[debug] [ADB] Getting connected devices…
[debug] [ADB] 1 device(s) connected
[ADB] Error: Error in waiting for device. Original error: ‘Error executing adbExec. Original error: ‘Command ‘/opt/bin/adb -P 5037 -s da491a58 shell echo ping’ exited with code 255’; Stderr: ‘error: insufficient permissions for device’; Code: ‘255’’. Retrying by restarting ADB
at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
at ADB.callee$1$0$ (…/…/…/lib/tools/system-calls.js:446:11)
at tryCatch (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function)(/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
Error: Error in waiting for device. Original error: ‘Error executing adbExec. Original error: ‘Command ‘/opt/bin/adb -P 5037 -s da491a58 shell echo ping’ exited with code 255’; Stderr: ‘error: insufficient permissions for device’; Code: ‘255’’. Retrying by restarting ADB
at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
at ADB.callee$1$0$ (…/…/…/lib/tools/system-calls.js:446:11)
at tryCatch (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at GeneratorFunctionPrototype.invoke (/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at GeneratorFunctionPrototype.prototype.(anonymous function)(/home/test01/jenkins/workspace/jenkins_automatic_test/atm/node-v8.0.0-rc.0-linux-x64/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at GeneratorFunctionPrototype.invoke
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
[HTTP] <-- POST /wd/hub/session/2e004110-bb96-4f45-a356-947add1a5396/network_connection - - ms - -
^C[Appium] Received SIGINT - shutting down
[debug] [ADB] Running ‘/opt/bin/adb’ with args: ["-P",5037,"-s",“da491a58”,“wait-for-device”]
^C[Appium] Received SIGINT - shutting down
^C[Appium] Received SIGINT - shutting down

@yanghuang.ding I can confirm for you that when I execute set_network_connection, my adb server gets restarted on my Mac laptop. I suspect it is a problem in the implementation of set_network_connection but haven’t looked into why.

Hi @willosser,

If adb server restart without root privilege, then appium Server can’t connect to real device anymore. That’s a big issue… Now I bypass this issue by launcher Appium server with “sudo”, seems works fine for now.

Another way is do not use “set_network_connection”. Instead, we can set device to airplane mode by adb command below.

adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true

1 Like

Hi It was working fine for me and what about adb command turn off the airplane mode