13938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick/* 22e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick * Copyright (C) 2017 The Android Open Source Project 33938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * 43938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * Licensed under the Apache License, Version 2.0 (the "License"); 53938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * you may not use this file except in compliance with the License. 63938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * You may obtain a copy of the License at 73938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * 83938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * http://www.apache.org/licenses/LICENSE-2.0 93938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * 103938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * Unless required by applicable law or agreed to in writing, software 113938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * distributed under the License is distributed on an "AS IS" BASIS, 123938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * See the License for the specific language governing permissions and 143938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick * limitations under the License. 153938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick */ 163938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 173938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 183938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#ifndef ANDROID_MEDIAANALYTICSSERVICE_H 193938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#define ANDROID_MEDIAANALYTICSSERVICE_H 203938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 213938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <arpa/inet.h> 223938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 233938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/threads.h> 243938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/Errors.h> 253938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/KeyedVector.h> 263938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/String8.h> 273938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <utils/List.h> 283938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 293938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#include <media/IMediaAnalyticsService.h> 303938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 312e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick#include "MetricsSummarizer.h" 322e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick 333938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 343938dc6363949ef126bb6188d26b5bef6db8be4dRay Essicknamespace android { 353938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 363938dc6363949ef126bb6188d26b5bef6db8be4dRay Essickclass MediaAnalyticsService : public BnMediaAnalyticsService 373938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick{ 383938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 393938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick public: 403938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 41b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick // on this side, caller surrenders ownership 42b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew); 433938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 443938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick static void instantiate(); 453938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick virtual status_t dump(int fd, const Vector<String16>& args); 463938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 473938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick MediaAnalyticsService(); 483938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick virtual ~MediaAnalyticsService(); 493938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 503938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick private: 513938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick MediaAnalyticsItem::SessionID_t generateUniqueSessionID(); 523938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 533938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // statistics about our analytics 543938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick int64_t mItemsSubmitted; 553938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick int64_t mItemsFinalized; 563938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick int64_t mItemsDiscarded; 57f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick int64_t mItemsDiscardedExpire; 58f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick int64_t mItemsDiscardedCount; 592e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick int64_t mSetsDiscarded; 603938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick MediaAnalyticsItem::SessionID_t mLastSessionID; 613938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 623938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // partitioned a bit so we don't over serialize 633938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick mutable Mutex mLock; 643938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick mutable Mutex mLock_ids; 65fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick mutable Mutex mLock_mappings; 663938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 67f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick // limit how many records we'll retain 68f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick // by count (in each queue (open, finalized)) 693938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick int32_t mMaxRecords; 70f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick // by time (none older than this long agan 71f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick nsecs_t mMaxRecordAgeNs; 72f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick // 732e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick // # of sets of summaries 742e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick int32_t mMaxRecordSets; 752e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick // nsecs until we start a new record set 762e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick nsecs_t mNewSetInterval; 773938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 783938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // input validation after arrival from client 79d38e174ddbde8e7419ba01deaded4ff0ead1caaaRay Essick bool contentValid(MediaAnalyticsItem *item, bool isTrusted); 80b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick bool rateLimited(MediaAnalyticsItem *); 813938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 823938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // the ones that are still open 833938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // (newest at front) since we keep looking for them 84b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick List<MediaAnalyticsItem *> *mOpen; 853938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // the ones we've finalized 863938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // (oldest at front) so it prints nicely for dumpsys 87b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick List<MediaAnalyticsItem *> *mFinalized; 883938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick // searching within these queues: queue, key 89b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick MediaAnalyticsItem *findItem(List<MediaAnalyticsItem *> *, 90b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick MediaAnalyticsItem *, bool removeit); 913938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 922e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick // summarizers 932e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void summarize(MediaAnalyticsItem *item); 942e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick class SummarizerSet { 952e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick nsecs_t mStarted; 962e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick List<MetricsSummarizer *> *mSummarizers; 972e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick 982e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick public: 992e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void appendSummarizer(MetricsSummarizer *s) { 1002e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick if (s) { 1012e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick mSummarizers->push_back(s); 1022e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick } 1032e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick }; 1042e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick nsecs_t getStarted() { return mStarted;} 1052e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void setStarted(nsecs_t started) {mStarted = started;} 1062e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick List<MetricsSummarizer *> *getSummarizers() { return mSummarizers;} 1072e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick 1082e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick SummarizerSet(); 1092e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick ~SummarizerSet(); 1102e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick }; 1112e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void newSummarizerSet(); 1122e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick List<SummarizerSet *> *mSummarizerSets; 1132e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick SummarizerSet *mCurrentSet; 1142e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick List<MetricsSummarizer *> *getFirstSet() { 1152e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick List<SummarizerSet *>::iterator first = mSummarizerSets->begin(); 1162e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick if (first != mSummarizerSets->end()) { 1172e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick return (*first)->getSummarizers(); 1182e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick } 1192e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick return NULL; 1202e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick } 1212e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick 122b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick void saveItem(MediaAnalyticsItem); 123b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick void saveItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *, int); 124b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick void deleteItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *); 1253938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 1262e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick // support for generating output 127f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick int mDumpProto; 128b5fac8ef36b302c12f897d06c7e097981843f3a0Ray Essick String8 dumpQueue(List<MediaAnalyticsItem*> *); 1292e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick String8 dumpQueue(List<MediaAnalyticsItem*> *, nsecs_t, const char *only); 1302e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick 1312e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void dumpHeaders(String8 &result, nsecs_t ts_since); 1322e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only); 1332e9c63b2fddfe313d1508118ff4f1bca65c0ffeeRay Essick void dumpRecent(String8 &result, nsecs_t ts_since, const char * only); 1343938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 135f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick // mapping uids to package names 136f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick struct UidToPkgMap { 137f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick uid_t uid; 138f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick AString pkg; 139fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick AString installer; 140fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick int32_t versionCode; 141fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick nsecs_t expiration; 142f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick }; 143f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick 144fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick KeyedVector<uid_t,struct UidToPkgMap> mPkgMappings; 145fa149560f4f4b529de3df9e87923ff7f9a8e89adRay Essick void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion); 146f65f421540d8d1e2aad17b86368405b83cb40a26Ray Essick 1473938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick}; 1483938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 1493938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick// ---------------------------------------------------------------------------- 1503938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 1513938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick}; // namespace android 1523938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick 1533938dc6363949ef126bb6188d26b5bef6db8be4dRay Essick#endif // ANDROID_MEDIAANALYTICSSERVICE_H 154