blob: 632c692ce650d93ea491171fec88f0bda9617ddc [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
Ray Essick72a436b2018-06-14 15:08:13 -070029#include <future>
30
Ray Essick3938dc62016-11-01 08:56:56 -070031#include <media/IMediaAnalyticsService.h>
32
Ray Essick3938dc62016-11-01 08:56:56 -070033namespace android {
34
35class MediaAnalyticsService : public BnMediaAnalyticsService
36{
37
38 public:
39
Ray Essickb5fac8e2016-12-12 11:33:56 -080040 // on this side, caller surrenders ownership
41 virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
Ray Essick3938dc62016-11-01 08:56:56 -070042
Ray Essick3938dc62016-11-01 08:56:56 -070043 static void instantiate();
44 virtual status_t dump(int fd, const Vector<String16>& args);
45
46 MediaAnalyticsService();
47 virtual ~MediaAnalyticsService();
48
Ray Essick72a436b2018-06-14 15:08:13 -070049 bool processExpirations();
50
Ray Essick3938dc62016-11-01 08:56:56 -070051 private:
52 MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
53
54 // statistics about our analytics
55 int64_t mItemsSubmitted;
56 int64_t mItemsFinalized;
57 int64_t mItemsDiscarded;
Ray Essickf65f4212017-08-31 11:41:19 -070058 int64_t mItemsDiscardedExpire;
59 int64_t mItemsDiscardedCount;
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;
Ray Essick72a436b2018-06-14 15:08:13 -070072 // max to expire per expirations_l() invocation
73 int32_t mMaxRecordsExpiredAtOnce;
Ray Essickf65f4212017-08-31 11:41:19 -070074 //
Ray Essick2e9c63b2017-03-29 15:16:44 -070075 // # of sets of summaries
76 int32_t mMaxRecordSets;
77 // nsecs until we start a new record set
78 nsecs_t mNewSetInterval;
Ray Essick3938dc62016-11-01 08:56:56 -070079
80 // input validation after arrival from client
Ray Essickd38e1742017-01-23 15:17:06 -080081 bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
Ray Essickb5fac8e2016-12-12 11:33:56 -080082 bool rateLimited(MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -070083
Ray Essick3938dc62016-11-01 08:56:56 -070084 // (oldest at front) so it prints nicely for dumpsys
Ray Essick92d23b42018-01-29 12:10:30 -080085 List<MediaAnalyticsItem *> mItems;
86 void saveItem(MediaAnalyticsItem *);
Ray Essick3938dc62016-11-01 08:56:56 -070087
Ray Essick72a436b2018-06-14 15:08:13 -070088 bool expirations_l(MediaAnalyticsItem *);
89 std::future<bool> mExpireFuture;
90
Ray Essick2e9c63b2017-03-29 15:16:44 -070091 // support for generating output
Ray Essickf65f4212017-08-31 11:41:19 -070092 int mDumpProto;
Ray Essick583a23a2017-11-27 12:49:57 -080093 int mDumpProtoDefault;
Ray Essick92d23b42018-01-29 12:10:30 -080094 String8 dumpQueue();
95 String8 dumpQueue(nsecs_t, const char *only);
Ray Essick2e9c63b2017-03-29 15:16:44 -070096
97 void dumpHeaders(String8 &result, nsecs_t ts_since);
98 void dumpSummaries(String8 &result, nsecs_t ts_since, const char * only);
99 void dumpRecent(String8 &result, nsecs_t ts_since, const char * only);
Ray Essick3938dc62016-11-01 08:56:56 -0700100
Ray Essickf65f4212017-08-31 11:41:19 -0700101 // mapping uids to package names
102 struct UidToPkgMap {
103 uid_t uid;
Ray Essick783bd0d2018-01-11 11:10:35 -0800104 std::string pkg;
105 std::string installer;
Dianne Hackborn4e2eeff2017-11-27 14:01:29 -0800106 int64_t versionCode;
Ray Essickfa149562017-09-19 09:27:31 -0700107 nsecs_t expiration;
Ray Essickf65f4212017-08-31 11:41:19 -0700108 };
109
Ray Essickfa149562017-09-19 09:27:31 -0700110 KeyedVector<uid_t,struct UidToPkgMap> mPkgMappings;
111 void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion);
Ray Essickf65f4212017-08-31 11:41:19 -0700112
Ray Essick3938dc62016-11-01 08:56:56 -0700113};
114
115// ----------------------------------------------------------------------------
116
117}; // namespace android
118
119#endif // ANDROID_MEDIAANALYTICSSERVICE_H