Add attributionTag to audio-recordings
... by replacing packageName/uid/pid by the Identity class.
This allows us to track which parts of the app trigger audio-recordings.
90% of the code is just sending around the additional parameters.
This adds it for the Java and native API.
Test: atest CtsAppOpsTestCases
CtsNativeMediaAAudioTestCases
Fixes: 160150145
Change-Id: Ibd7b884f7fcd4668a4e27f997e59cfc3217a9e89
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 1d5ccca..b85e139 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -49,6 +49,7 @@
#include <codec2/hidl/client.h>
#include <datasource/HTTPBase.h>
+#include <media/AidlConversion.h>
#include <media/IMediaHTTPService.h>
#include <media/IRemoteDisplay.h>
#include <media/IRemoteDisplayClient.h>
@@ -94,6 +95,7 @@
using android::NOT_ENOUGH_DATA;
using android::Parcel;
using android::media::VolumeShaper;
+using android::media::permission::Identity;
// Max number of entries in the filter.
const int kMaxFilterSize = 64; // I pulled that out of thin air.
@@ -453,14 +455,21 @@
ALOGV("MediaPlayerService destroyed");
}
-sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const String16 &opPackageName)
+sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
- sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid, opPackageName);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ sp<MediaRecorderClient> recorder =
+ new MediaRecorderClient(this, verifiedIdentity);
wp<MediaRecorderClient> w = recorder;
Mutex::Autolock lock(mLock);
mMediaRecorderClients.add(w);
- ALOGV("Create new media recorder client from pid %d", pid);
+ ALOGV("Create new media recorder client from pid %s",
+ verifiedIdentity.toString().c_str());
return recorder;
}
@@ -480,17 +489,21 @@
}
sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, std::string opPackageName)
+ audio_session_t audioSessionId, const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
int32_t connId = android_atomic_inc(&mNextConnId);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
sp<Client> c = new Client(
- this, pid, connId, client, audioSessionId,
- IPCThreadState::self()->getCallingUid(), opPackageName);
+ this, verifiedIdentity, connId, client, audioSessionId);
- ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,
- IPCThreadState::self()->getCallingUid());
+ ALOGV("Create new client(%d) from %s, ", connId,
+ verifiedIdentity.toString().c_str());
wp<Client> w = c;
{
@@ -543,8 +556,8 @@
char buffer[SIZE];
String8 result;
result.append(" Client\n");
- snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n",
- mPid, mConnId, mStatus, mLoop?"true": "false");
+ snprintf(buffer, 255, " Identity(%s), connId(%d), status(%d), looping(%s)\n",
+ mIdentity.toString().c_str(), mConnId, mStatus, mLoop?"true": "false");
result.append(buffer);
sp<MediaPlayerBase> p;
@@ -608,7 +621,7 @@
for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) {
sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote();
if (c != 0) {
- snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid);
+ snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mIdentity.pid);
result.append(buffer);
write(fd, result.string(), result.size());
result = "\n";
@@ -731,20 +744,18 @@
}
MediaPlayerService::Client::Client(
- const sp<MediaPlayerService>& service, pid_t pid,
+ const sp<MediaPlayerService>& service, const Identity& identity,
int32_t connId, const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, uid_t uid, const std::string& opPackageName)
- : mOpPackageName(opPackageName)
+ audio_session_t audioSessionId)
+ : mIdentity(identity)
{
ALOGV("Client(%d) constructor", connId);
- mPid = pid;
mConnId = connId;
mService = service;
mClient = client;
mLoop = false;
mStatus = NO_INIT;
mAudioSessionId = audioSessionId;
- mUid = uid;
mRetransmitEndpointValid = false;
mAudioAttributes = NULL;
mListener = new Listener(this);
@@ -757,7 +768,7 @@
MediaPlayerService::Client::~Client()
{
- ALOGV("Client(%d) destructor pid = %d", mConnId, mPid);
+ ALOGV("Client(%d) destructor identity = %s", mConnId, mIdentity.toString().c_str());
mAudioOutput.clear();
wp<Client> client(this);
disconnect();
@@ -770,7 +781,7 @@
void MediaPlayerService::Client::disconnect()
{
- ALOGV("disconnect(%d) from pid %d", mConnId, mPid);
+ ALOGV("disconnect(%d) from identity %s", mConnId, mIdentity.toString().c_str());
// grab local reference and clear main reference to prevent future
// access to object
sp<MediaPlayerBase> p;
@@ -810,11 +821,12 @@
p.clear();
}
if (p == NULL) {
- p = MediaPlayerFactory::createPlayer(playerType, mListener, mPid);
+ p = MediaPlayerFactory::createPlayer(playerType, mListener,
+ VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mIdentity.pid)));
}
if (p != NULL) {
- p->setUID(mUid);
+ p->setUID(VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mIdentity.uid)));
}
return p;
@@ -922,8 +934,8 @@
mAudioDeviceUpdatedListener = new AudioDeviceUpdatedNotifier(p);
if (!p->hardwareOutput()) {
- mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid(),
- mPid, mAudioAttributes, mAudioDeviceUpdatedListener, mOpPackageName);
+ mAudioOutput = new AudioOutput(mAudioSessionId, mIdentity,
+ mAudioAttributes, mAudioDeviceUpdatedListener);
static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);
}
@@ -1772,9 +1784,8 @@
#undef LOG_TAG
#define LOG_TAG "AudioSink"
-MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
- const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback,
- const std::string& opPackageName)
+MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, const Identity& identity,
+ const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback)
: mCallback(NULL),
mCallbackCookie(NULL),
mCallbackData(NULL),
@@ -1786,8 +1797,7 @@
mMsecsPerFrame(0),
mFrameSize(0),
mSessionId(sessionId),
- mUid(uid),
- mPid(pid),
+ mIdentity(identity),
mSendLevel(0.0),
mAuxEffectId(0),
mFlags(AUDIO_OUTPUT_FLAG_NONE),
@@ -1795,8 +1805,7 @@
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
mDeviceCallbackEnabled(false),
- mDeviceCallback(deviceCallback),
- mOpPackageName(opPackageName)
+ mDeviceCallback(deviceCallback)
{
ALOGV("AudioOutput(%d)", sessionId);
if (attr != NULL) {
@@ -2185,13 +2194,11 @@
mSessionId,
AudioTrack::TRANSFER_CALLBACK,
offloadInfo,
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
1.0f, // default value for maxRequiredSpeed
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
} else {
// TODO: Due to buffer memory concerns, we use a max target playback speed
// based on mPlaybackRate at the time of open (instead of kMaxRequiredSpeed),
@@ -2214,13 +2221,11 @@
mSessionId,
AudioTrack::TRANSFER_DEFAULT,
NULL, // offload info
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
targetSpeed,
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
}
// Set caller name so it can be logged in destructor.
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_MEDIA