Android: report am start errors in case process returns success

Somehow "am start" command can output to stderr even if the process
reports success, this can cause the activity launch to fail silently.

For example calling "am start -n package/activity --user 2" can fail
if the device has no user 2, however the process result will be success,
and the stderr will contain something like:
 Error type 3
 Error: Activity class {org.qtproject.example.scroll_example/
org.qtproject.qt.android.bindings.QtActivity} does not exist.

And the app won't start.

This concerns mostly extra am start args provided by the user, but not
sure if it might happen in other cases, so make sure to report the
stderr nonetheless.

Change-Id: I9317e118fcf4fe0c3ed83dcc53c1c00564c5148e
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Assam Boudjelthia
2021-10-28 18:28:49 +03:00
parent 5cde121aaa
commit 4e3658cfa4
2 changed files with 13 additions and 3 deletions

View File

@@ -327,7 +327,7 @@ AndroidRunnerWorker::~AndroidRunnerWorker()
} }
bool AndroidRunnerWorker::runAdb(const QStringList &args, QString *stdOut, bool AndroidRunnerWorker::runAdb(const QStringList &args, QString *stdOut,
const QByteArray &writeData) QString *stdErr, const QByteArray &writeData)
{ {
QStringList adbArgs = selector() + args; QStringList adbArgs = selector() + args;
SdkToolResult result = AndroidManager::runAdbCommand(adbArgs, writeData); SdkToolResult result = AndroidManager::runAdbCommand(adbArgs, writeData);
@@ -335,6 +335,8 @@ bool AndroidRunnerWorker::runAdb(const QStringList &args, QString *stdOut,
emit remoteErrorOutput(result.stdErr()); emit remoteErrorOutput(result.stdErr());
if (stdOut) if (stdOut)
*stdOut = result.stdOut(); *stdOut = result.stdOut();
if (stdErr)
*stdErr = result.stdErr();
return result.success(); return result.success();
} }
@@ -651,10 +653,17 @@ void AndroidRunnerWorker::asyncStartHelper()
.toUtf8().toBase64()); .toUtf8().toBase64());
} }
if (!runAdb(args)) { QString stdErr;
const bool startResult = runAdb(args, nullptr, &stdErr);
if (!startResult) {
emit remoteProcessFinished(tr("Failed to start the activity.")); emit remoteProcessFinished(tr("Failed to start the activity."));
return; return;
} }
if (!stdErr.isEmpty()) {
emit remoteErrorOutput(tr("Activity Manager threw the error: %1").arg(stdErr));
return;
}
} }
bool AndroidRunnerWorker::startDebuggerServer(const QString &packageDir, bool AndroidRunnerWorker::startDebuggerServer(const QString &packageDir,

View File

@@ -47,7 +47,8 @@ public:
AndroidRunnerWorker(ProjectExplorer::RunWorker *runner, const QString &packageName); AndroidRunnerWorker(ProjectExplorer::RunWorker *runner, const QString &packageName);
~AndroidRunnerWorker() override; ~AndroidRunnerWorker() override;
bool runAdb(const QStringList &args, QString *stdOut = nullptr, const QByteArray &writeData = {}); bool runAdb(const QStringList &args, QString *stdOut = nullptr, QString *stdErr = nullptr,
const QByteArray &writeData = {});
void adbKill(qint64 pid); void adbKill(qint64 pid);
QStringList selector() const; QStringList selector() const;
void forceStop(); void forceStop();