aboutsummaryrefslogtreecommitdiff
path: root/src/android_internal/tracing_service_proxy.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/android_internal/tracing_service_proxy.cc')
-rw-r--r--src/android_internal/tracing_service_proxy.cc51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/android_internal/tracing_service_proxy.cc b/src/android_internal/tracing_service_proxy.cc
index e297b75f8..a88668983 100644
--- a/src/android_internal/tracing_service_proxy.cc
+++ b/src/android_internal/tracing_service_proxy.cc
@@ -17,21 +17,29 @@
#include "src/android_internal/tracing_service_proxy.h"
#include <android/tracing/ITracingServiceProxy.h>
+#include <android/tracing/TraceReportParams.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
+#include <binder/ParcelFileDescriptor.h>
#include <binder/Status.h>
+#include <utils/String16.h>
namespace perfetto {
namespace android_internal {
using android::sp;
using android::binder::Status;
+using android::os::ParcelFileDescriptor;
using android::tracing::ITracingServiceProxy;
+using android::tracing::TraceReportParams;
-bool NotifyTraceSessionEnded(bool session_stolen) {
- sp<ITracingServiceProxy> service = android::interface_cast<ITracingServiceProxy>(
- android::defaultServiceManager()->getService(android::String16("tracing.proxy")));
+namespace {
+static constexpr char kServiceName[] = "tracing.proxy";
+}
+bool NotifyTraceSessionEnded(bool session_stolen) {
+ auto service = android::waitForService<ITracingServiceProxy>(
+ android::String16(kServiceName));
if (service == nullptr) {
return false;
}
@@ -40,5 +48,38 @@ bool NotifyTraceSessionEnded(bool session_stolen) {
return s.isOk();
}
-} // namespace android_internal
-} // namespace perfetto
+bool ReportTrace(const char* reporter_package_name,
+ const char* reporter_class_name,
+ int owned_trace_fd,
+ int64_t uuid_lsb,
+ int64_t uuid_msb,
+ bool use_pipe_in_framework_for_testing) {
+ // Keep this first so we recapture the raw fd in a RAII type as soon as
+ // possible.
+ android::base::unique_fd fd(owned_trace_fd);
+
+ auto service = android::waitForService<ITracingServiceProxy>(
+ android::String16(kServiceName));
+ if (service == nullptr) {
+ return false;
+ }
+
+ TraceReportParams params{};
+ params.reporterPackageName = android::String16(reporter_package_name);
+ params.reporterClassName = android::String16(reporter_class_name);
+ params.fd = ParcelFileDescriptor(std::move(fd));
+ params.uuidLsb = uuid_lsb;
+ params.uuidMsb = uuid_msb;
+ params.usePipeForTesting = use_pipe_in_framework_for_testing;
+
+ Status s = service->reportTrace(std::move(params));
+ if (!s.isOk()) {
+ __android_log_print(ANDROID_LOG_ERROR, "perfetto", "reportTrace failed: %s",
+ s.toString8().c_str());
+ }
+
+ return s.isOk();
+}
+
+} // namespace android_internal
+} // namespace perfetto