| 77 | } |
| 78 | |
| 79 | rdcstr GetDefaultActivityForPackage(const rdcstr &deviceID, const rdcstr &packageName) |
| 80 | { |
| 81 | Process::ProcessResult activity = |
| 82 | adbExecCommand(deviceID, StringFormat::Fmt("shell cmd package resolve-activity" |
| 83 | " -c android.intent.category.LAUNCHER %s", |
| 84 | packageName.c_str())); |
| 85 | |
| 86 | if(activity.strStdout.empty()) |
| 87 | { |
| 88 | RDCERR("Failed to resolve default activity of APK. STDERR: %s", activity.strStderror.c_str()); |
| 89 | return ""; |
| 90 | } |
| 91 | |
| 92 | rdcarray<rdcstr> lines; |
| 93 | split(activity.strStdout, lines, '\n'); |
| 94 | |
| 95 | for(rdcstr &line : lines) |
| 96 | { |
| 97 | line.trim(); |
| 98 | |
| 99 | if(line.beginsWith("name=") && !line.contains("com.android")) |
| 100 | { |
| 101 | return line.substr(5); |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | // when failed to find default activiy with cmd package on Android 6.0 |
| 106 | // try using pm dump like in this example: |
| 107 | // $ adb shell pm dump com.android.gles3jni |
| 108 | // DUMP OF SERVICE package: |
| 109 | // Activity Resolver Table: |
| 110 | // Non-Data Actions: |
| 111 | // android.intent.action.MAIN: |
| 112 | // d97b36a com.android.gles3jni/.GLES3JNIActivity filter fa39fb9 |
| 113 | // ... |
| 114 | |
| 115 | activity = adbExecCommand(deviceID, StringFormat::Fmt("shell pm dump %s", packageName.c_str())); |
| 116 | |
| 117 | lines.clear(); |
| 118 | split(activity.strStdout, lines, '\n'); |
| 119 | |
| 120 | size_t numOfLines = lines.size(); |
| 121 | const char *intentFilter = "android.intent.action.MAIN:"; |
| 122 | |
| 123 | for(size_t idx = 0; idx < numOfLines; idx++) |
| 124 | { |
| 125 | lines[idx].trim(); |
| 126 | |
| 127 | if(lines[idx].beginsWith(intentFilter) && idx + 1 < numOfLines) |
| 128 | { |
| 129 | rdcstr activityName = lines[idx + 1].trimmed(); |
| 130 | int startPos = activityName.find('/'); |
| 131 | if(startPos < 0) |
| 132 | { |
| 133 | RDCWARN("Failed to find default activity"); |
| 134 | return ""; |
| 135 | } |
| 136 | int endPos = activityName.find(' ', startPos + 1); |
no test coverage detected