Commit b6e52b0c authored by hjk's avatar hjk

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: default avatarChristian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: default avatarAlex Blasche <alexander.blasche@theqtcompany.com>
Reviewed-by: default avatarDaniel Teske <daniel.teske@theqtcompany.com>
parent 11cafd19
......@@ -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) {
......
......@@ -89,6 +89,7 @@ private:
QByteArray runPs();
void findPs();
void logcatProcess(const QByteArray &text, QByteArray &buffer, bool onlyError);
bool adbShellAmNeedsQuotes();
private:
QProcess m_adbLogcatProcess;
......@@ -111,7 +112,6 @@ private:
QString m_pingFile;
QString m_pongFile;
QString m_gdbserverPath;
QString m_gdbserverCommand;
QString m_gdbserverSocket;
QString m_localLibs;
QString m_localJars;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment