diff options
author | BogDan Vatra <bogdan@kdab.com> | 2018-03-17 09:31:56 +0200 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2018-04-13 14:05:40 +0000 |
commit | 429c596395697ff3533e679a848ad26cd1ee97cb (patch) | |
tree | 631a8837ef1bfacb66e02c7f8c847ede67489c68 /src/plugins/android/androidrunnerworker.h | |
parent | 6a62717271ed651f1c1467647499992d1104ca37 (diff) |
Android: Fix debugging on Android 8+
The new way is much reliable and now we can debug all the libs from very
first start, including static constructors, JNI_OnLoad, etc.
The downside is that the startup is a little bit slower then before.
On a Ryzen 1700X is 2 to 5 seconds slower.
Task-number: QTCREATORBUG-19081
Change-Id: Iacedf7b8aa84de5026f9c81eeca35dd377cf4640
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/android/androidrunnerworker.h')
-rw-r--r-- | src/plugins/android/androidrunnerworker.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/plugins/android/androidrunnerworker.h b/src/plugins/android/androidrunnerworker.h new file mode 100644 index 0000000000..7a5c6614b8 --- /dev/null +++ b/src/plugins/android/androidrunnerworker.h @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2018 BogDan Vatra <bog_dan_ro@yahoo.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + + +#pragma once + +#include <qmldebug/qmldebugcommandlinearguments.h> + +#include <QFuture> +#include <QTcpSocket> + +#include "androidrunnable.h" + +namespace ProjectExplorer { +class RunControl; +} + +namespace Android { +namespace Internal { + +const int MIN_SOCKET_HANDSHAKE_PORT = 20001; + +static void deleter(QProcess *p) +{ + p->terminate(); + if (!p->waitForFinished(1000)) { + p->kill(); + p->waitForFinished(); + } + // Might get deleted from its own signal handler. + p->deleteLater(); +} + +class AndroidRunnerWorkerBase : public QObject +{ + Q_OBJECT +public: + AndroidRunnerWorkerBase(ProjectExplorer::RunControl *runControl, const AndroidRunnable &runnable); + ~AndroidRunnerWorkerBase() override; + bool adbShellAmNeedsQuotes(); + bool runAdb(const QStringList &args, int timeoutS = 10); + void adbKill(qint64 pid); + QStringList selector() const; + void forceStop(); + void logcatReadStandardError(); + void logcatReadStandardOutput(); + void logcatProcess(const QByteArray &text, QByteArray &buffer, bool onlyError); + void setAndroidRunnable(const AndroidRunnable &runnable); + + virtual void asyncStart(); + virtual void asyncStop(); + virtual void handleRemoteDebuggerRunning(); + virtual void handleJdbWaiting(); + virtual void handleJdbSettled(); + +signals: + void remoteProcessStarted(Utils::Port gdbServerPort, const QUrl &qmlServer, int pid); + void remoteProcessFinished(const QString &errString = QString()); + + void remoteOutput(const QString &output); + void remoteErrorOutput(const QString &output); + +protected: + enum class JDBState { + Idle, + Waiting, + Settled + }; + virtual void onProcessIdChanged(qint64 pid); + + // Create the processes and timer in the worker thread, for correct thread affinity + AndroidRunnable m_androidRunnable; + QString m_adb; + qint64 m_processPID = -1; + std::unique_ptr<QProcess, decltype(&deleter)> m_adbLogcatProcess; + std::unique_ptr<QProcess, decltype(&deleter)> m_psIsAlive; + QByteArray m_stdoutBuffer; + QByteArray m_stderrBuffer; + QRegExp m_logCatRegExp; + QFuture<qint64> m_pidFinder; + bool m_useCppDebugger = false; + QmlDebug::QmlDebugServicesPreset m_qmlDebugServices; + Utils::Port m_localGdbServerPort; // Local end of forwarded debug socket. + QUrl m_qmlServer; + QByteArray m_lastRunAdbRawOutput; + QString m_lastRunAdbError; + JDBState m_jdbState = JDBState::Idle; + Utils::Port m_localJdbServerPort; + std::unique_ptr<QProcess, decltype(&deleter)> m_gdbServerProcess; + std::unique_ptr<QProcess, decltype(&deleter)> m_jdbProcess; +}; + + +class AndroidRunnerWorker : public AndroidRunnerWorkerBase +{ + Q_OBJECT +public: + AndroidRunnerWorker(ProjectExplorer::RunControl *runControl, const AndroidRunnable &runnable); + void asyncStart() override; +}; + + +class AndroidRunnerWorkerPreNougat : public AndroidRunnerWorkerBase +{ + Q_OBJECT +public: + AndroidRunnerWorkerPreNougat(ProjectExplorer::RunControl *runControl, const AndroidRunnable &runnable); + void asyncStart() override; +}; + +} // namespace Internal +} // namespace Android |