Adding in AIDL calls to log API start and stop in audioflinger code
Test: manual testing on device
Bug: b/263304156
Change-Id: If12e12755036b4b0ca182632ceb68dc3a3522a97
diff --git a/services/audioflinger/Android.bp b/services/audioflinger/Android.bp
index 43ef311..3e8afee 100644
--- a/services/audioflinger/Android.bp
+++ b/services/audioflinger/Android.bp
@@ -67,6 +67,7 @@
"av-types-aidl-cpp",
"effect-aidl-cpp",
"libaudioclient_aidl_conversion",
+ "libactivitymanager_aidl",
"libaudioflinger_timing",
"libaudiofoundation",
"libaudiohal",
diff --git a/services/audioflinger/TrackMetrics.h b/services/audioflinger/TrackMetrics.h
index 6fc70d6..a1a0cfe 100644
--- a/services/audioflinger/TrackMetrics.h
+++ b/services/audioflinger/TrackMetrics.h
@@ -17,6 +17,9 @@
#ifndef ANDROID_AUDIO_TRACKMETRICS_H
#define ANDROID_AUDIO_TRACKMETRICS_H
+#include <binder/IActivityManager.h>
+#include <binder/IPCThreadState.h>
+#include <binder/IServiceManager.h>
#include <mutex>
namespace android {
@@ -38,10 +41,13 @@
* We currently deliver metrics based on an AudioIntervalGroup.
*/
class TrackMetrics final {
+
+
public:
- TrackMetrics(std::string metricsId, bool isOut)
+ TrackMetrics(std::string metricsId, bool isOut, int clientUid)
: mMetricsId(std::move(metricsId))
, mIsOut(isOut)
+ , mUid(clientUid)
{} // we don't log a constructor item, we wait for more info in logConstructor().
~TrackMetrics() {
@@ -64,6 +70,12 @@
AMEDIAMETRICS_PROP_EVENT_VALUE_BEGINAUDIOINTERVALGROUP, devices.c_str());
}
++mIntervalCount;
+ const auto& mActivityManager = getActivityManager();
+ if (mActivityManager) {
+ mActivityManager->logFgsApiBegin(AUDIO_API,
+ mUid,
+ IPCThreadState::self() -> getCallingPid());
+ }
}
void logConstructor(pid_t creatorPid, uid_t creatorUid, int32_t internalTrackId,
@@ -93,6 +105,12 @@
logVolume_l(mVolume); // flush out the last volume.
mLastVolumeChangeTimeNs = 0;
}
+ const auto& mActivityManager = getActivityManager();
+ if (mActivityManager) {
+ mActivityManager->logFgsApiEnd(AUDIO_API,
+ mUid,
+ IPCThreadState::self() -> getCallingPid());
+ }
}
void logInvalidate() const {
@@ -221,9 +239,24 @@
// do not reset mUnderrunCount - it keeps continuously running for tracks.
}
+ // Meyer's singleton is thread-safe.
+ static const sp<IActivityManager>& getActivityManager() {
+ static const auto activityManager = []() -> sp<IActivityManager> {
+ const sp<IServiceManager> sm(defaultServiceManager());
+ if (sm != nullptr) {
+ return interface_cast<IActivityManager>(sm->checkService(String16("activity")));
+ }
+ return nullptr;
+ }();
+ return activityManager;
+ }
+
const std::string mMetricsId;
const bool mIsOut; // if true, than a playback track, otherwise used for record.
+ static constexpr int AUDIO_API = 5;
+ const int mUid;
+
mutable std::mutex mLock;
// Devices in the interval group.
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index 1fbf720..c5403ba 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -118,7 +118,7 @@
mThreadIoHandle(thread ? thread->id() : AUDIO_IO_HANDLE_NONE),
mPortId(portId),
mIsInvalid(false),
- mTrackMetrics(std::move(metricsId), isOut),
+ mTrackMetrics(std::move(metricsId), isOut, clientUid),
mCreatorPid(creatorPid)
{
const uid_t callingUid = IPCThreadState::self()->getCallingUid();