diff options
author | hjk <[email protected]> | 2015-09-23 09:25:50 +0200 |
---|---|---|
committer | hjk <[email protected]> | 2015-09-23 14:53:22 +0000 |
commit | b6e52b0c375c34e17e643faafef4f52276389a0d (patch) | |
tree | 19a032df0dad3104ee986ed99393b366b8fc6a4c /src/plugins/android/androidrunner.cpp | |
parent | 11cafd198d0abf9e0cb3aead4d000c72f9c86c94 (diff) |
Android: Fix debugger startup with recent Android SDK
Android SDK Tools 24.x ship an adb that requires in the 'adb shell'
command an additional level of quotes for parameters with spaces
compared to previous versions. That broke the passing of the
gdbserver start command and consequently debugger startup.
Task-number: QTCREATORBUG-15032
Change-Id: I442355821641d4c6a632b50d1065c442736711aa
Reviewed-by: Christian Stenger <[email protected]>
Reviewed-by: Alex Blasche <[email protected]>
Reviewed-by: Daniel Teske <[email protected]>
Diffstat (limited to 'src/plugins/android/androidrunner.cpp')
-rw-r--r-- | src/plugins/android/androidrunner.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 59d3be60d24..18f3f8421ba 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -176,7 +176,6 @@ AndroidRunner::AndroidRunner(QObject *parent, m_gdbserverPath = packageDir + _("/lib/gdbserver"); - m_gdbserverCommand = m_gdbserverPath + _(" --multi +") + m_gdbserverSocket; // Detect busybox, as we need to pass -w to ps to get wide output. QProcess psProc; psProc.start(m_adb, selector() << _("shell") << _("readlink") << _("$(which ps)")); @@ -371,7 +370,10 @@ void AndroidRunner::asyncStart() args << _("-e") << _("ping_file") << m_pingFile; args << _("-e") << _("pong_file") << m_pongFile; } - args << _("-e") << _("gdbserver_command") << m_gdbserverCommand; + + QString gdbserverCommand = QString::fromLatin1(adbShellAmNeedsQuotes() ? "\"%1 --multi +%2\"" : "%1 --multi +%2") + .arg(m_gdbserverPath).arg(m_gdbserverSocket); + args << _("-e") << _("gdbserver_command") << gdbserverCommand; args << _("-e") << _("gdbserver_socket") << m_gdbserverSocket; if (m_handShakeMethod == SocketHandShake) { @@ -494,6 +496,28 @@ void AndroidRunner::asyncStart() QMetaObject::invokeMethod(&m_checkPIDTimer, "start"); } +bool AndroidRunner::adbShellAmNeedsQuotes() +{ + // Between Android SDK Tools version 24.3.1 and 24.3.4 the quoting + // needs for the 'adb shell am start ...' parameters changed. + // Run a test to find out on what side of the fence we live. + // The command will fail with a complaint about the "--dummy" + // option on newer SDKs, and with "No intent supplied" on older ones. + // In case the test itself fails assume a new SDK. + QProcess adb; + adb.start(m_adb, selector() << _("shell") << _("am") << _("start") + << _("-e") << _("dummy") <<_("dummy --dummy")); + if (!adb.waitForStarted()) + return true; + + if (!adb.waitForFinished(10000)) + return true; + + QByteArray output = adb.readAllStandardError() + adb.readAllStandardOutput(); + bool oldSdk = output.contains("Error: No intent supplied"); + return !oldSdk; +} + void AndroidRunner::handleRemoteDebuggerRunning() { if (m_useCppDebugger) { |