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/libmedia/Android.bp b/media/libmedia/Android.bp
index 0223cfd..9e33610 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -359,6 +359,7 @@
"libaudioclient",
"libmedia_codeclist",
"libmedia_omx",
+ "media_permission-aidl-cpp",
],
export_shared_lib_headers: [
@@ -367,14 +368,17 @@
"libandroidicu",
//"libsonivox",
"libmedia_omx",
+ "media_permission-aidl-cpp",
],
static_libs: [
"resourcemanager_aidl_interface-ndk_platform",
+ "media_permission-aidl-cpp",
],
export_static_lib_headers: [
"resourcemanager_aidl_interface-ndk_platform",
+ "media_permission-aidl-cpp",
],
export_include_dirs: [
diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp
index 11005c6..0f189ee 100644
--- a/media/libmedia/IMediaPlayerService.cpp
+++ b/media/libmedia/IMediaPlayerService.cpp
@@ -35,6 +35,8 @@
namespace android {
+using media::permission::Identity;
+
enum {
CREATE = IBinder::FIRST_CALL_TRANSACTION,
CREATE_MEDIA_RECORDER,
@@ -63,22 +65,22 @@
virtual sp<IMediaPlayer> create(
const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
- const std::string opPackageName) {
+ const Identity& identity) {
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(client));
data.writeInt32(audioSessionId);
- data.writeCString(opPackageName.c_str());
+ data.writeParcelable(identity);
remote()->transact(CREATE, data, &reply);
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName)
+ virtual sp<IMediaRecorder> createMediaRecorder(const Identity& identity)
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
- data.writeString16(opPackageName);
+ data.writeParcelable(identity);
remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
return interface_cast<IMediaRecorder>(reply.readStrongBinder());
}
@@ -129,19 +131,23 @@
sp<IMediaPlayerClient> client =
interface_cast<IMediaPlayerClient>(data.readStrongBinder());
audio_session_t audioSessionId = (audio_session_t) data.readInt32();
- const char* opPackageName = data.readCString();
- if (opPackageName == nullptr) {
- return FAILED_TRANSACTION;
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
}
- std::string opPackageNameStr(opPackageName);
- sp<IMediaPlayer> player = create(client, audioSessionId, opPackageNameStr);
+ sp<IMediaPlayer> player = create(client, audioSessionId, identity);
reply->writeStrongBinder(IInterface::asBinder(player));
return NO_ERROR;
} break;
case CREATE_MEDIA_RECORDER: {
CHECK_INTERFACE(IMediaPlayerService, data, reply);
- const String16 opPackageName = data.readString16();
- sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName);
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ sp<IMediaRecorder> recorder = createMediaRecorder(identity);
reply->writeStrongBinder(IInterface::asBinder(recorder));
return NO_ERROR;
} break;
diff --git a/media/libmedia/include/media/IMediaPlayerService.h b/media/libmedia/include/media/IMediaPlayerService.h
index a4207eb..243e9c7 100644
--- a/media/libmedia/include/media/IMediaPlayerService.h
+++ b/media/libmedia/include/media/IMediaPlayerService.h
@@ -27,6 +27,7 @@
#include <media/IMediaPlayerClient.h>
#include <media/IMediaMetadataRetriever.h>
+#include <android/media/permission/Identity.h>
#include <string>
@@ -46,11 +47,13 @@
public:
DECLARE_META_INTERFACE(MediaPlayerService);
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName) = 0;
+ virtual sp<IMediaRecorder> createMediaRecorder(
+ const android::media::permission::Identity &identity) = 0;
virtual sp<IMediaMetadataRetriever> createMetadataRetriever() = 0;
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,
audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE,
- const std::string opPackage = "") = 0;
+ const android::media::permission::Identity& identity =
+ android::media::permission::Identity()) = 0;
virtual sp<IMediaCodecList> getCodecList() const = 0;
// Connects to a remote display.
diff --git a/media/libmedia/include/media/MediaRecorderBase.h b/media/libmedia/include/media/MediaRecorderBase.h
index d9a7efb..b5325ce 100644
--- a/media/libmedia/include/media/MediaRecorderBase.h
+++ b/media/libmedia/include/media/MediaRecorderBase.h
@@ -21,6 +21,7 @@
#include <media/AudioSystem.h>
#include <media/MicrophoneInfo.h>
#include <media/mediarecorder.h>
+#include <android/media/permission/Identity.h>
#include <system/audio.h>
@@ -33,8 +34,8 @@
struct PersistentSurface;
struct MediaRecorderBase {
- MediaRecorderBase(const String16 &opPackageName)
- : mOpPackageName(opPackageName) {}
+ explicit MediaRecorderBase(const media::permission::Identity &client)
+ : mClient(client) {}
virtual ~MediaRecorderBase() {}
virtual status_t init() = 0;
@@ -83,7 +84,7 @@
protected:
- String16 mOpPackageName;
+ media::permission::Identity mClient;
private:
MediaRecorderBase(const MediaRecorderBase &);
diff --git a/media/libmedia/include/media/mediaplayer.h b/media/libmedia/include/media/mediaplayer.h
index 71c0bc5..fbba398 100644
--- a/media/libmedia/include/media/mediaplayer.h
+++ b/media/libmedia/include/media/mediaplayer.h
@@ -29,6 +29,7 @@
#include <media/IMediaPlayer.h>
#include <media/IMediaDeathNotifier.h>
#include <media/IStreamSource.h>
+#include <android/media/permission/Identity.h>
#include <utils/KeyedVector.h>
#include <utils/String8.h>
@@ -211,7 +212,8 @@
public virtual IMediaDeathNotifier
{
public:
- MediaPlayer(const std::string opPackageName = "");
+ explicit MediaPlayer(const android::media::permission::Identity& mIdentity =
+ android::media::permission::Identity());
~MediaPlayer();
void died();
void disconnect();
@@ -315,7 +317,7 @@
float mSendLevel;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
- const std::string mOpPackageName;
+ const android::media::permission::Identity mIdentity;
};
}; // namespace android
diff --git a/media/libmedia/include/media/mediarecorder.h b/media/libmedia/include/media/mediarecorder.h
index 84c92f6..96a3293 100644
--- a/media/libmedia/include/media/mediarecorder.h
+++ b/media/libmedia/include/media/mediarecorder.h
@@ -25,6 +25,7 @@
#include <media/IMediaRecorderClient.h>
#include <media/IMediaDeathNotifier.h>
#include <media/MicrophoneInfo.h>
+#include <android/media/permission/Identity.h>
namespace android {
@@ -226,7 +227,7 @@
public virtual IMediaDeathNotifier
{
public:
- MediaRecorder(const String16& opPackageName);
+ explicit MediaRecorder(const media::permission::Identity& identity);
~MediaRecorder();
void died();
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 30c5006..7504787 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -40,8 +40,9 @@
namespace android {
using media::VolumeShaper;
+using media::permission::Identity;
-MediaPlayer::MediaPlayer(const std::string opPackageName) : mOpPackageName(opPackageName)
+MediaPlayer::MediaPlayer(const Identity& identity) : mIdentity(identity)
{
ALOGV("constructor");
mListener = NULL;
@@ -152,7 +153,7 @@
if (url != NULL) {
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(httpService, url, headers))) {
player.clear();
@@ -169,7 +170,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(fd, offset, length))) {
player.clear();
@@ -185,7 +186,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(source))) {
player.clear();
@@ -201,7 +202,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(rtpParams))) {
player.clear();
diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp
index e3cd9d8..da2b190 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -33,6 +33,8 @@
namespace android {
+using media::permission::Identity;
+
status_t MediaRecorder::setCamera(const sp<hardware::ICamera>& camera,
const sp<ICameraRecordingProxy>& proxy)
{
@@ -758,13 +760,13 @@
return INVALID_OPERATION;
}
-MediaRecorder::MediaRecorder(const String16& opPackageName) : mSurfaceMediaSource(NULL)
+MediaRecorder::MediaRecorder(const Identity &identity) : mSurfaceMediaSource(NULL)
{
ALOGV("constructor");
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != NULL) {
- mMediaRecorder = service->createMediaRecorder(opPackageName);
+ mMediaRecorder = service->createMediaRecorder(identity);
}
if (mMediaRecorder != NULL) {
mCurrentState = MEDIA_RECORDER_IDLE;
diff --git a/media/libmedia/tests/mediaplayer/Android.bp b/media/libmedia/tests/mediaplayer/Android.bp
index 0fff7b4..50f35ea 100644
--- a/media/libmedia/tests/mediaplayer/Android.bp
+++ b/media/libmedia/tests/mediaplayer/Android.bp
@@ -39,6 +39,7 @@
"libstagefright",
"libstagefright_foundation",
"libutils",
+ "media_permission-aidl-cpp",
],
compile_multilib: "first",
cflags: [