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 <packagename>" to get the default Activity name.
This commit is contained in:
tabi.katalin
2018-04-16 13:11:26 +02:00
committed by Baldur Karlsson
parent e7dec9e5ae
commit f84eb1f180
+40
View File
@@ -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 "";
}