From f84eb1f1807bff6741c2470d6bd707ce2de3eef4 Mon Sep 17 00:00:00 2001 From: "tabi.katalin" Date: Mon, 16 Apr 2018 13:11:26 +0200 Subject: [PATCH] Get default Activity on Android 6.0 "cmd package resolve-activity" is only available from Android 7.0. Pre Android 7.0 we can use "pm dump " to get the default Activity name. --- renderdoc/android/android.cpp | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/renderdoc/android/android.cpp b/renderdoc/android/android.cpp index e912316aa..2bcdece23 100644 --- a/renderdoc/android/android.cpp +++ b/renderdoc/android/android.cpp @@ -85,6 +85,46 @@ std::string GetDefaultActivityForPackage(const std::string &deviceID, const std: } } + // when failed to find default activiy with cmd package on Android 6.0 + // try using pm dump like in this example: + // $ adb shell pm dump com.android.gles3jni + // DUMP OF SERVICE package: + // Activity Resolver Table: + // Non-Data Actions: + // android.intent.action.MAIN: + // d97b36a com.android.gles3jni/.GLES3JNIActivity filter fa39fb9 + // ... + + activity = adbExecCommand(deviceID, StringFormat::Fmt("shell pm dump %s", packageName.c_str())); + + lines.clear(); + split(activity.strStdout, lines, '\n'); + + size_t numOfLines = lines.size(); + const char *intentFilter = "android.intent.action.MAIN:"; + size_t intentFilterSize = strlen(intentFilter); + + for(size_t idx = 0; idx < numOfLines; idx++) + { + std::string line = trim(lines[idx]); + if(!strncmp(line.c_str(), intentFilter, intentFilterSize) && idx + 1 < numOfLines) + { + std::string activityName = trim(lines[idx + 1]); + size_t startPos = activityName.find("/"); + if(startPos == std::string::npos) + { + RDCWARN("Failed to find default activity"); + return ""; + } + size_t endPos = activityName.find(" ", startPos + 1); + if(endPos == std::string::npos) + { + endPos = activityName.length(); + } + return activityName.substr(startPos + 1, endPos - startPos - 1); + } + } + RDCERR("Didn't find default activity in adb output"); return ""; }