Build metrics_dump tool in Android.
Replace Makefile with Android.bp. Remove duplication of protos in proto directory. Since we are now building the metrics_dump tool under Android, use frameworks metrics.proto directly. Also, reference cdm's wv_metrics.proto from the cdm directory instead of creating a subset in proto directory. bug: 161783052 bug: 170607430 Test: build m -j128 metrics_dump Test: metrics_dump [bugreport from adt-3-r.zip] Test: metrics_dump [bugreport from sabrina-q.gz] Test: metrics_dump --widevine [adb shell dumpsys media.metrics output] Change-Id: I82c7e723453ac2a6335cb2bb732a376d535b9ea3
This commit is contained in:
@@ -4,114 +4,106 @@
|
||||
//
|
||||
// Format metric output from |adb shell dumpsys media.metrics|
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include "base64decode.h"
|
||||
#include "mediadrm_metrics.h"
|
||||
#include "parse_metrics.h"
|
||||
#include "wv_metrics.h"
|
||||
|
||||
namespace metrics_dump {
|
||||
|
||||
using namespace base64;
|
||||
using namespace mediadrm_metrics;
|
||||
using namespace wv_metrics;
|
||||
using std::cerr;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
string selected_one;
|
||||
std::vector<string> excluded_ones;
|
||||
|
||||
// Look for metrics pattern
|
||||
// q-metrics:
|
||||
// [:item:item:]
|
||||
// r-metrics:
|
||||
// {item, (item), (item)}
|
||||
//
|
||||
// @return true if metrics is formatted prior to R release
|
||||
bool is_q_metrics(const string &line) {
|
||||
int left_brackets = std::count(line.begin(), line.end(), '[');
|
||||
int right_brackets = std::count(line.begin(), line.end(), ']');
|
||||
return (left_brackets == 1 && right_brackets == 1 &&
|
||||
line.find('(') == string::npos && line.find(')') == string::npos);
|
||||
}
|
||||
|
||||
// Process one line of metrics
|
||||
void process_one_metric(const string &line) {
|
||||
std::istringstream fields(line);
|
||||
|
||||
#define READ_TOKEN(NAME) \
|
||||
if (!std::getline(fields, NAME, ':')) { \
|
||||
cerr << "error: expected |" #NAME "| field in '" << line << "'" << endl; \
|
||||
}
|
||||
|
||||
string index, version, component, session, uid, package, package_version;
|
||||
string pid, finalized, timestamp, item_count;
|
||||
|
||||
READ_TOKEN(index);
|
||||
READ_TOKEN(version);
|
||||
READ_TOKEN(component);
|
||||
READ_TOKEN(session);
|
||||
READ_TOKEN(uid);
|
||||
READ_TOKEN(package);
|
||||
READ_TOKEN(package_version);
|
||||
READ_TOKEN(pid);
|
||||
READ_TOKEN(finalized);
|
||||
READ_TOKEN(timestamp);
|
||||
READ_TOKEN(item_count);
|
||||
MediaMetrics metrics;
|
||||
parse_metrics(line, &metrics);
|
||||
|
||||
// handle specific package and component selection
|
||||
if (selected_one.size() && package != selected_one &&
|
||||
component != selected_one) {
|
||||
if (selected_one.size() && metrics.package != selected_one &&
|
||||
metrics.component != selected_one) {
|
||||
return;
|
||||
}
|
||||
if (std::find(excluded_ones.begin(), excluded_ones.end(), package) !=
|
||||
if (std::find(excluded_ones.begin(), excluded_ones.end(), metrics.package) !=
|
||||
excluded_ones.end()) {
|
||||
return;
|
||||
}
|
||||
if (std::find(excluded_ones.begin(), excluded_ones.end(), component) !=
|
||||
excluded_ones.end()) {
|
||||
if (std::find(excluded_ones.begin(), excluded_ones.end(),
|
||||
metrics.component) != excluded_ones.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
cout << "===================================================================="
|
||||
"============="
|
||||
<< endl;
|
||||
char timebuf[64];
|
||||
time_t time_s = stoll(timestamp) / 1000000000LL;
|
||||
strftime(timebuf, sizeof(timebuf), "%a %b %e %H:%M:%S", localtime(&time_s));
|
||||
cout << timebuf << " timestamp: " << time_s << endl << endl;
|
||||
if (is_q_metrics(line)) {
|
||||
char timebuf[128];
|
||||
time_t time_s = stoll(metrics.timestamp) / 1000000000LL;
|
||||
strftime(timebuf, sizeof(timebuf), "%a %b %e %H:%M:%S", localtime(&time_s));
|
||||
cout << timebuf << " timestamp: " << time_s << endl << endl;
|
||||
} else {
|
||||
cout << metrics.timestamp << endl << endl;
|
||||
}
|
||||
cout << " "
|
||||
<< "APK PACKAGE -> METRICS COMPONENT" << endl;
|
||||
cout << " " << package << " -> " << component << " | uid:" << uid
|
||||
<< " pid:" << pid << endl;
|
||||
cout << " " << metrics.package << " -> " << metrics.component << endl;
|
||||
cout << "\tuid:" << metrics.uid << " pid:" << metrics.pid << endl;
|
||||
|
||||
size_t items = std::stoi(item_count);
|
||||
for (size_t i = 0; i < items; i++) {
|
||||
string parameter, value;
|
||||
if (!std::getline(fields, parameter, '=')) {
|
||||
cerr << "error: expected |parameter| in item " << i << " in '" << line
|
||||
<< "'" << endl;
|
||||
}
|
||||
if (!std::getline(fields, value, ':')) {
|
||||
cerr << "error: expected |value| in item " << i << " in '" << line << "'"
|
||||
<< endl;
|
||||
}
|
||||
|
||||
if (parameter == "serialized_metrics") {
|
||||
for (auto property : metrics.properties) {
|
||||
string key = property.first;
|
||||
string value = property.second;
|
||||
if (key == "serialized_metrics") {
|
||||
string decoded = Base64::Decode(value);
|
||||
if (component == "drm.vendor.Google.WidevineCDM") {
|
||||
drm_metrics::WvCdmMetrics metrics;
|
||||
if (!metrics.ParseFromString(decoded)) {
|
||||
if (metrics.component == "drm.vendor.google.widevinecdm") {
|
||||
drm_metrics::WvCdmMetrics wv_metrics;
|
||||
if (!wv_metrics.ParseFromString(decoded)) {
|
||||
cerr << "failed to parse proto string" << endl;
|
||||
} else {
|
||||
string result;
|
||||
FormatWvCdmMetrics(metrics, result);
|
||||
FormatWvCdmMetrics(wv_metrics, result);
|
||||
cout << endl << result << endl;
|
||||
}
|
||||
} else {
|
||||
android::drm_metrics::DrmFrameworkMetrics metrics;
|
||||
if (!metrics.ParseFromString(decoded)) {
|
||||
android::drm_metrics::DrmFrameworkMetrics fw_metrics;
|
||||
if (!fw_metrics.ParseFromString(decoded)) {
|
||||
cerr << "failed to parse proto string" << endl;
|
||||
} else {
|
||||
string result;
|
||||
FormatDrmFrameworkMetrics(metrics, result);
|
||||
mediadrm_metrics::FormatDrmFrameworkMetrics(fw_metrics, result);
|
||||
cout << endl << result << endl;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cout << " " << parameter << ": " << value << endl;
|
||||
cout << " " << key << ": " << value << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -170,7 +162,7 @@ int main(int argc, char **argv) {
|
||||
} else if (arg == "--no-gms") {
|
||||
metrics_dump::excluded_ones.push_back("com.google.android.gms");
|
||||
} else if (arg == "--widevine") {
|
||||
metrics_dump::selected_one = "drm.vendor.Google.WidevineCDM";
|
||||
metrics_dump::selected_one = "drm.vendor.google.widevinecdm";
|
||||
} else if (arg == "--mediadrm") {
|
||||
metrics_dump::selected_one = "mediadrm";
|
||||
} else if (i == argc - 1) {
|
||||
@@ -185,9 +177,12 @@ int main(int argc, char **argv) {
|
||||
} else {
|
||||
// args with a parameter
|
||||
if (arg == "--exclude") {
|
||||
metrics_dump::excluded_ones.push_back(argv[++i]);
|
||||
string lowercase_argv = argv[++i];
|
||||
metrics_dump::to_lower(lowercase_argv);
|
||||
metrics_dump::excluded_ones.push_back(lowercase_argv);
|
||||
} else if (arg == "--select") {
|
||||
metrics_dump::selected_one = argv[++i];
|
||||
metrics_dump::to_lower(metrics_dump::selected_one);
|
||||
} else {
|
||||
usage();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user