aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/android/androidrunnerworker.h
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kdab.com>2018-03-17 09:31:56 +0200
committerBogDan Vatra <bogdan@kdab.com>2018-04-13 14:05:40 +0000
commit429c596395697ff3533e679a848ad26cd1ee97cb (patch)
tree631a8837ef1bfacb66e02c7f8c847ede67489c68 /src/plugins/android/androidrunnerworker.h
parent6a62717271ed651f1c1467647499992d1104ca37 (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.h134
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