Merge "Change from mediaanalytics to mediametrics"
diff --git a/include/media/IMediaAnalyticsService.h b/include/media/IMediaAnalyticsService.h
index 9213637..f635e94 100644
--- a/include/media/IMediaAnalyticsService.h
+++ b/include/media/IMediaAnalyticsService.h
@@ -52,14 +52,6 @@
// caller continues to own the passed item
virtual MediaAnalyticsItem::SessionID_t submit(MediaAnalyticsItem *item, bool forcenew) = 0;
-
- // return lists of records that match the supplied parameters.
- // finished [or not] records since time 'ts' with key 'key'
- // timestamp 'ts' is nanoseconds, unix time.
- // caller responsible for deallocating returned data structures
- virtual List<MediaAnalyticsItem *> *getMediaAnalyticsItemList(bool finished, int64_t ts) = 0;
- virtual List<MediaAnalyticsItem *> *getMediaAnalyticsItemList(bool finished, int64_t ts, MediaAnalyticsItem::Key key) = 0;
-
};
// ----------------------------------------------------------------------------
diff --git a/media/libmedia/IMediaAnalyticsService.cpp b/media/libmedia/IMediaAnalyticsService.cpp
index cc4aa35..340cf19 100644
--- a/media/libmedia/IMediaAnalyticsService.cpp
+++ b/media/libmedia/IMediaAnalyticsService.cpp
@@ -50,7 +50,6 @@
enum {
GENERATE_UNIQUE_SESSIONID = IBinder::FIRST_CALL_TRANSACTION,
SUBMIT_ITEM,
- GET_ITEM_LIST,
};
class BpMediaAnalyticsService: public BpInterface<IMediaAnalyticsService>
@@ -115,45 +114,6 @@
return sessionid;
}
- virtual List<MediaAnalyticsItem*> *getMediaAnalyticsItemList(bool finished, nsecs_t ts)
- {
- return getMediaAnalyticsItemList(finished, ts, MediaAnalyticsItem::kKeyAny);
- }
-
- virtual List<MediaAnalyticsItem*> *getMediaAnalyticsItemList(bool finished, nsecs_t ts, MediaAnalyticsItem::Key key)
- {
- Parcel data, reply;
- status_t err;
-
- data.writeInterfaceToken(IMediaAnalyticsService::getInterfaceDescriptor());
- data.writeInt32(finished);
- data.writeInt64(ts);
- const char *str = key.c_str();
- if (key.empty()) {
- str = MediaAnalyticsItem::kKeyNone.c_str();
- }
- data.writeCString(str);
- err = remote()->transact(GET_ITEM_LIST, data, &reply);
- if (err != NO_ERROR) {
- return NULL;
- }
-
- // read a count
- int32_t count = reply.readInt32();
- List<MediaAnalyticsItem*> *list = NULL;
-
- if (count > 0) {
- list = new List<MediaAnalyticsItem*>();
- for (int i=0;i<count;i++) {
- MediaAnalyticsItem *item = new MediaAnalyticsItem();
- // XXX: watch for failures here
- item->readFromParcel(reply);
- list->push_back(item);
- }
- }
-
- return list;
- }
};
IMPLEMENT_META_INTERFACE(MediaAnalyticsService, "android.media.IMediaAnalyticsService");
@@ -204,33 +164,6 @@
return NO_ERROR;
} break;
- case GET_ITEM_LIST: {
- CHECK_INTERFACE(IMediaPlayerService, data, reply);
- // get the parameters
- bool finished = data.readInt32();
- nsecs_t ts = data.readInt64();
- MediaAnalyticsItem::Key key = data.readCString();
-
- // find the (0 or more) items
- List<MediaAnalyticsItem*> *list = getMediaAnalyticsItemList(finished, ts, key);
- // encapsulate/serialize them
- reply->writeInt32(list->size());
- if (list->size() > 0) {
- for (List<MediaAnalyticsItem*>::iterator it = list->begin();
- it != list->end(); it++) {
- (*it)->writeToParcel(reply);
- }
-
-
- }
-
- // avoid leakiness; organized discarding of list and its contents
- list->clear();
- delete list;
-
- return NO_ERROR;
- } break;
-
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libmedia/MediaAnalyticsItem.cpp b/media/libmedia/MediaAnalyticsItem.cpp
index 76397c7..375d1d5 100644
--- a/media/libmedia/MediaAnalyticsItem.cpp
+++ b/media/libmedia/MediaAnalyticsItem.cpp
@@ -49,15 +49,15 @@
const MediaAnalyticsItem::Key MediaAnalyticsItem::kKeyAny = "any";
const MediaAnalyticsItem::Key MediaAnalyticsItem::kKeyNone = "none";
-const char * const MediaAnalyticsItem::EnabledProperty = "media.analytics.enabled";
-const char * const MediaAnalyticsItem::EnabledPropertyPersist = "persist.media.analytics.enabled";
+const char * const MediaAnalyticsItem::EnabledProperty = "media.metrics.enabled";
+const char * const MediaAnalyticsItem::EnabledPropertyPersist = "persist.media.metrics.enabled";
const int MediaAnalyticsItem::EnabledProperty_default = 0;
// access functions for the class
MediaAnalyticsItem::MediaAnalyticsItem()
- : mPid(0),
- mUid(0),
+ : mPid(-1),
+ mUid(-1),
mSessionID(MediaAnalyticsItem::SessionIDNone),
mTimestamp(0),
mFinalized(0),
@@ -67,8 +67,8 @@
}
MediaAnalyticsItem::MediaAnalyticsItem(MediaAnalyticsItem::Key key)
- : mPid(0),
- mUid(0),
+ : mPid(-1),
+ mUid(-1),
mSessionID(MediaAnalyticsItem::SessionIDNone),
mTimestamp(0),
mFinalized(0),
@@ -92,6 +92,9 @@
// clean allocated storage from key
mKey.clear();
+ // clean various major parameters
+ mSessionID = MediaAnalyticsItem::SessionIDNone;
+
// clean attributes
// contents of the attributes
for (size_t i = 0 ; i < mPropSize; i++ ) {
@@ -646,7 +649,6 @@
}
-
AString MediaAnalyticsItem::toString() {
AString result = "(";
@@ -763,7 +765,7 @@
//static
sp<IMediaAnalyticsService> MediaAnalyticsItem::getInstance() {
- static const char *servicename = "media.analytics";
+ static const char *servicename = "media.metrics";
static int tries_remaining = SVC_TRIES;
int enabled = isEnabled();
diff --git a/media/libmediaanalyticsservice/Android.mk b/media/libmediaanalyticsservice/Android.mk
deleted file mode 100644
index dd59651..0000000
--- a/media/libmediaanalyticsservice/Android.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-#
-# libmediaanalyticsservice
-#
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- MediaAnalyticsService.cpp \
-
-LOCAL_SHARED_LIBRARIES := \
- libbinder \
- libcutils \
- liblog \
- libdl \
- libgui \
- libmedia \
- libmediautils \
- libstagefright_foundation \
- libutils
-
-LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libmedia
-
-LOCAL_C_INCLUDES := \
- $(TOP)/frameworks/av/media/libstagefright/include \
- $(TOP)/frameworks/av/media/libstagefright/rtsp \
- $(TOP)/frameworks/av/media/libstagefright/wifi-display \
- $(TOP)/frameworks/av/media/libstagefright/webm \
- $(TOP)/frameworks/av/include/media \
- $(TOP)/frameworks/av/include/camera \
- $(TOP)/frameworks/native/include/media/openmax \
- $(TOP)/frameworks/native/include/media/hardware \
- $(TOP)/external/tremolo/Tremolo \
- libcore/include \
-
-LOCAL_CFLAGS += -Werror -Wno-error=deprecated-declarations -Wall
-LOCAL_CLANG := true
-
-LOCAL_MODULE:= libmediaanalyticsservice
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/services/mediaanalytics/Android.mk b/services/mediaanalytics/Android.mk
index 76a5c1c..ef49df4 100644
--- a/services/mediaanalytics/Android.mk
+++ b/services/mediaanalytics/Android.mk
@@ -5,28 +5,43 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
- main_mediaanalytics.cpp
+ main_mediametrics.cpp \
+ MediaAnalyticsService.cpp
LOCAL_SHARED_LIBRARIES := \
- libcutils \
- liblog \
- libmedia \
- libmediaanalyticsservice \
- libutils \
- libbinder \
- libicuuc
+ libcutils \
+ liblog \
+ libmedia \
+ libutils \
+ libbinder \
+ libdl \
+ libgui \
+ libmedia \
+ libmediautils \
+ libstagefright_foundation \
+ libutils
LOCAL_STATIC_LIBRARIES := \
- libicuandroid_utils \
libregistermsext
-LOCAL_C_INCLUDES := \
- frameworks/av/media/libmediaanalyticsservice
+LOCAL_C_INCLUDES := \
+ $(TOP)/frameworks/av/media/libstagefright/include \
+ $(TOP)/frameworks/av/media/libstagefright/rtsp \
+ $(TOP)/frameworks/av/media/libstagefright/wifi-display \
+ $(TOP)/frameworks/av/media/libstagefright/webm \
+ $(TOP)/frameworks/av/include/media \
+ $(TOP)/frameworks/av/include/camera \
+ $(TOP)/frameworks/native/include/media/openmax \
+ $(TOP)/frameworks/native/include/media/hardware \
+ $(TOP)/external/tremolo/Tremolo \
+ libcore/include
-LOCAL_MODULE:= mediaanalytics
-LOCAL_INIT_RC := mediaanalytics.rc
+LOCAL_MODULE:= mediametrics
-LOCAL_CFLAGS := -Werror -Wall
+LOCAL_INIT_RC := mediametrics.rc
+
+LOCAL_CFLAGS := -Werror -Wall -Wno-error=deprecated-declarations
+LOCAL_CLANG := true
include $(BUILD_EXECUTABLE)
diff --git a/media/libmediaanalyticsservice/MediaAnalyticsService.cpp b/services/mediaanalytics/MediaAnalyticsService.cpp
similarity index 87%
rename from media/libmediaanalyticsservice/MediaAnalyticsService.cpp
rename to services/mediaanalytics/MediaAnalyticsService.cpp
index 1d0246d..eacafdd 100644
--- a/media/libmediaanalyticsservice/MediaAnalyticsService.cpp
+++ b/services/mediaanalytics/MediaAnalyticsService.cpp
@@ -85,7 +85,7 @@
void MediaAnalyticsService::instantiate() {
defaultServiceManager()->addService(
- String16("media.analytics"), new MediaAnalyticsService());
+ String16("media.metrics"), new MediaAnalyticsService());
}
// XXX: add dynamic controls for mMaxRecords
@@ -125,18 +125,46 @@
MediaAnalyticsItem::SessionID_t id = MediaAnalyticsItem::SessionIDInvalid;
- // we control these, not using whatever the user might have sent
+ // we control these, generally not trusting user input
nsecs_t now = systemTime(SYSTEM_TIME_REALTIME);
item->setTimestamp(now);
int pid = IPCThreadState::self()->getCallingPid();
- item->setPid(pid);
int uid = IPCThreadState::self()->getCallingUid();
- item->setUid(uid);
+
+ int uid_given = item->getUid();
+ int pid_given = item->getPid();
+
+ // although we do make exceptions for particular client uids
+ // that we know we trust.
+ //
+ bool isTrusted = false;
+
+ switch (uid) {
+ case AID_MEDIA:
+ case AID_MEDIA_CODEC:
+ case AID_MEDIA_EX:
+ case AID_MEDIA_DRM:
+ // trusted source, only override default values
+ isTrusted = true;
+ if (uid_given == (-1)) {
+ item->setUid(uid);
+ }
+ if (pid_given == (-1)) {
+ item->setPid(pid);
+ }
+ break;
+ default:
+ isTrusted = false;
+ item->setPid(pid);
+ item->setUid(uid);
+ break;
+ }
+
mItemsSubmitted++;
// validate the record; we discard if we don't like it
- if (contentValid(item) == false) {
+ if (contentValid(item, isTrusted) == false) {
delete item;
return MediaAnalyticsItem::SessionIDInvalid;
}
@@ -275,14 +303,14 @@
Mutex::Autolock _l(mLock);
- snprintf(buffer, SIZE, "Dump of the mediaanalytics process:\n");
+ snprintf(buffer, SIZE, "Dump of the mediametrics process:\n");
result.append(buffer);
int enabled = MediaAnalyticsItem::isEnabled();
if (enabled) {
- snprintf(buffer, SIZE, "Analytics gathering: enabled\n");
+ snprintf(buffer, SIZE, "Metrics gathering: enabled\n");
} else {
- snprintf(buffer, SIZE, "Analytics gathering: DISABLED via property\n");
+ snprintf(buffer, SIZE, "Metrics gathering: DISABLED via property\n");
}
result.append(buffer);
@@ -300,11 +328,11 @@
}
// show the recently recorded records
- snprintf(buffer, sizeof(buffer), "\nFinalized Analytics (oldest first):\n");
+ snprintf(buffer, sizeof(buffer), "\nFinalized Metrics (oldest first):\n");
result.append(buffer);
result.append(this->dumpQueue(mFinalized, ts_since));
- snprintf(buffer, sizeof(buffer), "\nIn-Progress Analytics (newest first):\n");
+ snprintf(buffer, sizeof(buffer), "\nIn-Progress Metrics (newest first):\n");
result.append(buffer);
result.append(this->dumpQueue(mOpen, ts_since));
@@ -402,9 +430,7 @@
oitem->getTimestamp());
}
l->erase(l->begin());
- ALOGD("drop record at %s:%d", __FILE__, __LINE__);
delete oitem;
- ALOGD("[done] drop record at %s:%d", __FILE__, __LINE__);
mItemsDiscarded++;
}
}
@@ -510,10 +536,34 @@
}
}
-// are the contents good
-bool MediaAnalyticsService::contentValid(MediaAnalyticsItem *) {
+static AString allowedKeys[] =
+{
+ "codec",
+ "extractor"
+};
- // certain keys require certain uids
+static const int nAllowedKeys = sizeof(allowedKeys) / sizeof(allowedKeys[0]);
+
+// are the contents good
+bool MediaAnalyticsService::contentValid(MediaAnalyticsItem *item, bool isTrusted) {
+
+ // untrusted uids can only send us a limited set of keys
+ if (isTrusted == false) {
+ // restrict to a specific set of keys
+ AString key = item->getKey();
+
+ size_t i;
+ for(i = 0; i < nAllowedKeys; i++) {
+ if (key == allowedKeys[i]) {
+ break;
+ }
+ }
+ if (i == nAllowedKeys) {
+ ALOGD("Ignoring (key): %s", item->toString().c_str());
+ return false;
+ }
+ }
+
// internal consistency
return true;
diff --git a/media/libmediaanalyticsservice/MediaAnalyticsService.h b/services/mediaanalytics/MediaAnalyticsService.h
similarity index 97%
rename from media/libmediaanalyticsservice/MediaAnalyticsService.h
rename to services/mediaanalytics/MediaAnalyticsService.h
index 3e2298f..d2b0f09 100644
--- a/media/libmediaanalyticsservice/MediaAnalyticsService.h
+++ b/services/mediaanalytics/MediaAnalyticsService.h
@@ -69,7 +69,7 @@
int32_t mMaxRecords;
// input validation after arrival from client
- bool contentValid(MediaAnalyticsItem *);
+ bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
bool rateLimited(MediaAnalyticsItem *);
// the ones that are still open
diff --git a/services/mediaanalytics/main_mediaanalytics.cpp b/services/mediaanalytics/main_mediametrics.cpp
similarity index 87%
rename from services/mediaanalytics/main_mediaanalytics.cpp
rename to services/mediaanalytics/main_mediametrics.cpp
index 672d13d..8020a03 100644
--- a/services/mediaanalytics/main_mediaanalytics.cpp
+++ b/services/mediaanalytics/main_mediametrics.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#define LOG_TAG "mediaanalytics"
+#define LOG_TAG "mediametrics"
//#define LOG_NDEBUG 0
#include <binder/IPCThreadState.h>
@@ -24,7 +24,6 @@
//#include "RegisterExtensions.h"
// from LOCAL_C_INCLUDES
-#include "IcuUtils.h"
#include "MediaAnalyticsService.h"
using namespace android;
@@ -34,16 +33,16 @@
signal(SIGPIPE, SIG_IGN);
// to match the service name
- // we're replacing "/system/bin/mediaanalytics" with "media.analytics"
+ // we're replacing "/system/bin/mediametrics" with "media.metrics"
// we add a ".", but discard the path components: we finish with a shorter string
- strcpy(argv[0], "media.analytics");
+ strcpy(argv[0], "media.metrics");
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm(defaultServiceManager());
ALOGI("ServiceManager: %p", sm.get());
- InitializeIcuOrDie();
MediaAnalyticsService::instantiate();
+
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
diff --git a/services/mediaanalytics/mediaanalytics.rc b/services/mediaanalytics/mediametrics.rc
similarity index 69%
rename from services/mediaanalytics/mediaanalytics.rc
rename to services/mediaanalytics/mediametrics.rc
index 0af69f5..3829f8c 100644
--- a/services/mediaanalytics/mediaanalytics.rc
+++ b/services/mediaanalytics/mediametrics.rc
@@ -1,4 +1,4 @@
-service mediaanalytics /system/bin/mediaanalytics
+service mediametrics /system/bin/mediametrics
class main
user media
ioprio rt 4