From 858b02480bfc8ce798af895370c16e25d40c3d17 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 24 May 2018 17:03:19 +0100 Subject: [PATCH] Pass command-line args as 'intent args' when launching apk. Refs #987 --- qrenderdoc/Code/Interface/QRDInterface.h | 3 +++ qrenderdoc/Windows/Dialogs/CaptureDialog.cpp | 10 ++++++++++ qrenderdoc/Windows/Dialogs/CaptureDialog.h | 1 + qrenderdoc/Windows/MainWindow.cpp | 12 ++++++++++++ renderdoc/android/android.cpp | 10 +++++----- renderdoc/android/android.h | 2 +- renderdoc/core/remote_server.cpp | 3 ++- 7 files changed, 34 insertions(+), 7 deletions(-) diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index 6f793dbc5..0cfb5cc3c 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -386,6 +386,9 @@ struct ICaptureDialog DOCUMENT("Update the current state of the global hook, e.g. if it has been enabled."); virtual void UpdateGlobalHook() = 0; + DOCUMENT("Update the current state based on the current remote host, when that changes."); + virtual void UpdateRemoteHost() = 0; + protected: ICaptureDialog() = default; ~ICaptureDialog() = default; diff --git a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp index 02cdd4efc..8a243f47c 100644 --- a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp @@ -984,6 +984,16 @@ void CaptureDialog::UpdateGlobalHook() } } +void CaptureDialog::UpdateRemoteHost() +{ + const RemoteHost *host = m_Ctx.Replay().CurrentRemote(); + + if(host && host->IsADB()) + ui->cmdLineLabel->setText(tr("Intent Arguments")); + else + ui->cmdLineLabel->setText(tr("Command-line Arguments")); +} + void CaptureDialog::SetEnvironmentModifications(const rdcarray &modifications) { m_EnvModifications = modifications; diff --git a/qrenderdoc/Windows/Dialogs/CaptureDialog.h b/qrenderdoc/Windows/Dialogs/CaptureDialog.h index 0403b5a46..114e943f1 100644 --- a/qrenderdoc/Windows/Dialogs/CaptureDialog.h +++ b/qrenderdoc/Windows/Dialogs/CaptureDialog.h @@ -73,6 +73,7 @@ public: void LoadSettings(const rdcstr &filename) override; void SaveSettings(const rdcstr &filename) override; void UpdateGlobalHook() override; + void UpdateRemoteHost() override; public slots: bool checkAllowClose(); diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index e5d704ca4..699a2a3e0 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -1602,6 +1602,9 @@ void MainWindow::messageCheck() m_Ctx.Replay().DisconnectFromRemoteServer(); } + + if(m_Ctx.HasCaptureDialog()) + m_Ctx.GetCaptureDialog()->UpdateRemoteHost(); }); } } @@ -1714,6 +1717,9 @@ void MainWindow::switchContext() statusText->setText(QString()); SetTitle(); + + if(m_Ctx.HasCaptureDialog()) + m_Ctx.GetCaptureDialog()->UpdateRemoteHost(); } else { @@ -1788,6 +1794,9 @@ void MainWindow::switchContext() } contextChooser->setEnabled(true); + + if(m_Ctx.HasCaptureDialog()) + m_Ctx.GetCaptureDialog()->UpdateRemoteHost(); }); }); th->selfDelete(true); @@ -1879,6 +1888,9 @@ void MainWindow::OnCaptureClosed() tr("Remote server disconnected. To attempt to reconnect please select it again.")); contextChooser->setText(tr("Replay Context: %1").arg(tr("Local"))); m_Ctx.Replay().DisconnectFromRemoteServer(); + + if(m_Ctx.HasCaptureDialog()) + m_Ctx.GetCaptureDialog()->UpdateRemoteHost(); } } diff --git a/renderdoc/android/android.cpp b/renderdoc/android/android.cpp index 08fde92b8..10067898a 100644 --- a/renderdoc/android/android.cpp +++ b/renderdoc/android/android.cpp @@ -177,7 +177,7 @@ int GetCurrentPID(const std::string &deviceID, const std::string &packageName) } ExecuteResult StartAndroidPackageForCapture(const char *host, const char *package, - const CaptureOptions &opts) + const char *intentArgs, const CaptureOptions &opts) { int index = 0; std::string deviceID; @@ -244,8 +244,8 @@ ExecuteResult StartAndroidPackageForCapture(const char *host, const char *packag RDCLOG("Setting up to launch the application as a debugger to inject."); // start the activity in this package with debugging enabled and force-stop after starting - adbExecCommand(deviceID, StringFormat::Fmt("shell am start -S -D %s/%s", packageName.c_str(), - activityName.c_str())); + adbExecCommand(deviceID, StringFormat::Fmt("shell am start -S -D %s/%s %s", packageName.c_str(), + activityName.c_str(), intentArgs)); // adb shell ps | grep $PACKAGE | awk '{print $2}') pid = GetCurrentPID(deviceID, packageName); @@ -255,8 +255,8 @@ ExecuteResult StartAndroidPackageForCapture(const char *host, const char *packag RDCLOG("Not doing any injection - assuming APK is pre-loaded with RenderDoc capture library."); // start the activity in this package with debugging enabled and force-stop after starting - adbExecCommand(deviceID, StringFormat::Fmt("shell am start %s/%s", packageName.c_str(), - activityName.c_str())); + adbExecCommand(deviceID, StringFormat::Fmt("shell am start %s/%s %s", packageName.c_str(), + activityName.c_str(), intentArgs)); // don't connect JDWP jdwpPort = 0; diff --git a/renderdoc/android/android.h b/renderdoc/android/android.h index 69b31d8c1..05c98d05c 100644 --- a/renderdoc/android/android.h +++ b/renderdoc/android/android.h @@ -32,7 +32,7 @@ namespace Android { bool IsHostADB(const char *hostname); ExecuteResult StartAndroidPackageForCapture(const char *host, const char *package, - const CaptureOptions &opts); + const char *intentArgs, const CaptureOptions &opts); void ResetCaptureSettings(const std::string &deviceID); void ExtractDeviceIDAndIndex(const std::string &hostname, int &index, std::string &deviceID); Process::ProcessResult adbExecCommand(const std::string &deviceID, const std::string &args, diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp index eff52338d..22758ed7f 100644 --- a/renderdoc/core/remote_server.cpp +++ b/renderdoc/core/remote_server.cpp @@ -1250,7 +1250,8 @@ public: ok = Ping(); }); - ExecuteResult ret = Android::StartAndroidPackageForCapture(host, app.c_str(), opts); + ExecuteResult ret = + Android::StartAndroidPackageForCapture(host, app.c_str(), cmdline.c_str(), opts); Atomic::Inc32(&done);