blob: 3b34f4451707bfd4ca5bd8c2ad4c476893befb89 [file] [log] [blame]
Ray Essick3938dc62016-11-01 08:56:56 -07001/*
Ray Essick2e9c63b2017-03-29 15:16:44 -07002 * Copyright (C) 2017 The Android Open Source Project
Ray Essick3938dc62016-11-01 08:56:56 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18#ifndef ANDROID_MEDIAANALYTICSSERVICE_H
19#define ANDROID_MEDIAANALYTICSSERVICE_H
20
21#include <arpa/inet.h>
22
23#include <utils/threads.h>
24#include <utils/Errors.h>
25#include <utils/KeyedVector.h>
26#include <utils/String8.h>
27#include <utils/List.h>
28
29#include <media/IMediaAnalyticsService.h>
30
Ray Essick2e9c63b2017-03-29 15:16:44 -070031#include "MetricsSummarizer.h"
32
Ray Essick3938dc62016-11-01 08:56:56 -070033
34namespace android {
35
36class MediaAnalyticsService : public BnMediaAnalyticsService
37{
38
39 public:
40
Ray Essickb5fac8e2016-12-12 11:33:56 -080041 // on this side, caller surrenders ownership
42 virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
Ray Essick3938dc62016-11-01 08:56:56 -070043
Ray Essick3938dc62016-11-01 08:56:56 -070044 static void instantiate();
45 virtual status_t dump(int fd, const Vector<String16>& args);
46
47 MediaAnalyticsService();
48 virtual ~MediaAnalyticsService();
49
50 private:
51 MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
52
53 // statistics about our analytics
54 int64_t mItemsSubmitted;
55 int64_t mItemsFinalized;
56 int64_t mItemsDiscarded;
Ray Essickf65f4212017-08-31 11:41:19 -070057 int64_t mItemsDiscardedExpire;
58 int64_t mItemsDiscardedCount;
Ray Essick2e9c63b2017-03-29 15:16:44 -070059 int64_t mSetsDiscarded;
Ray Essick3938dc62016-11-01 08:56:56 -070060 MediaAnalyticsItem::SessionID_t mLastSessionID;
61
62 // partitioned a bit so we don't over serialize
63 mutable Mutex mLock;
64 mutable Mutex mLock_ids;
Ray Essickfa149562017-09-19 09:27:31 -070065 mutable Mutex mLock_mappings;
Ray Essick3938dc62016-11-01 08:56:56 -070066
Ray Essickf65f4212017-08-31 11:41:19 -070067 // limit how many records we'll retain
68 // by count (in each queue (open, finalized))
Ray Essick3938dc62016-11-01 08:56:56 -070069 int32_t mMaxRecords;
Ray Essickf65f4212017-08-31 11:41:19 -070070 // by time (none older than this long agan
71 nsecs_t mMaxRecordAgeNs;
72 //
Ray Essick2e9c63b2017-03-29 15:16:44 -070073 // # of sets of summaries
74 int32_t mMaxRecordSets;
75 // nsecs until we start a new record set
76 nsecs_t mNewSetInterval;
Ray Essick3938dc62016-11-01 08:56:56 -070077
78 // input validation after arrival from client
Ray Essickd38e1742017-01-23 15:17:06 -080079 bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
Ray Essickb5fac8e2016-12-12 11:33:56 -080080 bool rateLimited(MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -070081
82 // the ones that are still open
83 // (newest at front) since we keep looking for them
Ray Essickb5fac8e2016-12-12 11:33:56 -080084 List<MediaAnalyticsItem *> *mOpen;
Ray Essick3938dc62016-11-01 08:56:56 -070085 // the ones we've finalized
86 // (oldest at front) so it prints nicely for dumpsys
Ray Essickb5fac8e2016-12-12 11:33:56 -080087 List<MediaAnalyticsItem *> *mFinalized;
Ray Essick3938dc62016-11-01 08:56:56 -070088 // searching within these queues: queue, key
Ray Essickb5fac8e2016-12-12 11:33:56 -080089 MediaAnalyticsItem *findItem(List<MediaAnalyticsItem *> *,
90 MediaAnalyticsItem *, bool removeit);
Ray Essick3938dc62016-11-01 08:56:56 -070091
Ray Essick2e9c63b2017-03-29 15:16:44 -070092 // summarizers
93 void summarize(MediaAnalyticsItem *item);
94 class SummarizerSet {
95 nsecs_t mStarted;
96 List<MetricsSummarizer *> *mSummarizers;
97
98 public:
99 void appendSummarizer(MetricsSummarizer *s) {
100 if (s) {
101 mSummarizers->push_back(s);
102 }
103 };
104 nsecs_t getStarted() { return mStarted;}
105 void setStarted(nsecs_t started) {mStarted = started;}
106 List<MetricsSummarizer *> *getSummarizers() { return mSummarizers;}
107
108 SummarizerSet();
109 ~SummarizerSet();
110 };
111 void newSummarizerSet();
112 List<SummarizerSet *> *mSummarizerSets;
113 SummarizerSet *mCurrentSet;
114 List<MetricsSummarizer *> *getFirstSet() {
115 List<SummarizerSet *>::iterator first = mSummarizerSets->begin();
116 if (first != mSummarizerSets->end()) {
117 return (*first)->getSummarizers();
118 }
119 return NULL;
120 }
121
Ray Essickb5fac8e2016-12-12 11:33:56 -0800122 void saveItem(MediaAnalyticsItem);
123 void saveItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *, int);
124 void deleteItem(List<MediaAnalyticsItem *> *, MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -0700125
Ray Essick2e9c63b2017-03-29 15:16:44 -0700126 // support for generating output
Ray Essickf65f4212017-08-31 11:41:19 -0700127 int mDumpProto;
Ray Essick583a23a2017-11-27 12:49:57 -0800128 int mDumpProtoDefault;
Ray Essickb5fac8e2016-12-12 11:33:56 -0800129 String8 dumpQueue(List<MediaAnalyticsItem*> *);
Ray Essick2e9c63b2017-03-29 15:16:44 -0700130 String8 dumpQueue(List<MediaAnalyticsItem*> *, nsecs_t, const char *only);
131
132 void dumpHeaders(String8 &result, nsecs_t ts_since);
133 void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only);
134 void dumpRecent(String8 &result, nsecs_t ts_since, const char * only);
Ray Essick3938dc62016-11-01 08:56:56 -0700135
Ray Essickf65f4212017-08-31 11:41:19 -0700136 // mapping uids to package names
137 struct UidToPkgMap {
138 uid_t uid;
139 AString pkg;
Ray Essickfa149562017-09-19 09:27:31 -0700140 AString installer;
141 int32_t versionCode;
142 nsecs_t expiration;
Ray Essickf65f4212017-08-31 11:41:19 -0700143 };
144
Ray Essickfa149562017-09-19 09:27:31 -0700145 KeyedVector<uid_t,struct UidToPkgMap> mPkgMappings;
146 void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion);
Ray Essickf65f4212017-08-31 11:41:19 -0700147
Ray Essick3938dc62016-11-01 08:56:56 -0700148};
149
150// ----------------------------------------------------------------------------
151
152}; // namespace android
153
154#endif // ANDROID_MEDIAANALYTICSSERVICE_H