Android: Fix debugging using old devices

Uploading a binary file had been remade using base64
encoding, but base64 tool is not available on older
devices.
Fallback to the old approach of relying on the
symlinked lib folder that contains a gdbserver if
the upload failed.

Task-number: QTCREATORBUG-21317
Task-number: QTCREATORBUG-21547
Change-Id: I54539d8912b1722bb799068c33e7a9175699ff70
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Christian Stenger
2018-11-28 09:59:19 +01:00
parent 8d19b306ed
commit c5d1ec5144

View File

@@ -280,7 +280,7 @@ bool AndroidRunnerWorker::uploadFile(const QString &from, const QString &to, con
runAdb({"shell", "run-as", m_packageName, "rm", to}); runAdb({"shell", "run-as", m_packageName, "rm", to});
const QByteArray data = f.readAll(); const QByteArray data = f.readAll();
const bool res = runAdb({"shell", "run-as", m_packageName, QString("sh -c 'base64 -d > %1'").arg(to)}, 60, data.toBase64()); const bool res = runAdb({"shell", "run-as", m_packageName, QString("sh -c 'base64 -d > %1'").arg(to)}, 60, data.toBase64());
if (!res) if (!res || m_lastRunAdbRawOutput.contains("base64: not found"))
return false; return false;
return runAdb({"shell", "run-as", m_packageName, "chmod", flags, to}); return runAdb({"shell", "run-as", m_packageName, "chmod", flags, to});
} }
@@ -426,17 +426,34 @@ void AndroidRunnerWorker::asyncStartHelper()
// e.g. on Android 8 with NDK 10e // e.g. on Android 8 with NDK 10e
runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir}); runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir});
QString gdbServerExecutable;
QString gdbServerPrefix = "./lib/";
if (m_gdbserverPath.isEmpty() || !uploadFile(m_gdbserverPath, "gdbserver")) { if (m_gdbserverPath.isEmpty() || !uploadFile(m_gdbserverPath, "gdbserver")) {
emit remoteProcessFinished(tr("Cannot find/copy C++ debug server.")); // upload failed - check for old devices
return; if (runAdb({"shell", "run-as", m_packageName, "ls", "lib/"})) {
for (const auto &line: m_lastRunAdbRawOutput.split('\n')) {
if (line.indexOf("gdbserver") != -1/* || line.indexOf("lldb-server") != -1*/) {
gdbServerExecutable = QString::fromUtf8(line.trimmed());
break;
}
}
}
if (gdbServerExecutable.isEmpty()) {
emit remoteProcessFinished(tr("Cannot find/copy C++ debug server."));
return;
}
} else {
gdbServerPrefix = "./";
gdbServerExecutable = "gdbserver";
} }
QString gdbServerSocket = packageDir + "/debug-socket"; QString gdbServerSocket = packageDir + "/debug-socket";
runAdb({"shell", "run-as", m_packageName, "killall", "gdbserver"}); runAdb({"shell", "run-as", m_packageName, "killall", gdbServerExecutable});
runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket}); runAdb({"shell", "run-as", m_packageName, "rm", gdbServerSocket});
std::unique_ptr<QProcess, Deleter> gdbServerProcess(new QProcess, deleter); std::unique_ptr<QProcess, Deleter> gdbServerProcess(new QProcess, deleter);
gdbServerProcess->start(m_adb, selector() << "shell" << "run-as" gdbServerProcess->start(m_adb, selector() << "shell" << "run-as"
<< m_packageName << "./gdbserver" << m_packageName << gdbServerPrefix + gdbServerExecutable
<< "--multi" << "+" + gdbServerSocket); << "--multi" << "+" + gdbServerSocket);
if (!gdbServerProcess->waitForStarted()) { if (!gdbServerProcess->waitForStarted()) {
emit remoteProcessFinished(tr("Failed to start C++ debugger.")); emit remoteProcessFinished(tr("Failed to start C++ debugger."));