Home | History | Annotate | Download | only in mediaanalytics
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      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 <future>
     30 
     31 #include <media/IMediaAnalyticsService.h>
     32 
     33 namespace android {
     34 
     35 class MediaAnalyticsService : public BnMediaAnalyticsService
     36 {
     37 
     38  public:
     39 
     40     // on this side, caller surrenders ownership
     41     virtual int64_t submit(MediaAnalyticsItem *item, bool forcenew);
     42 
     43     static  void            instantiate();
     44     virtual status_t        dump(int fd, const Vector<String16>& args);
     45 
     46                             MediaAnalyticsService();
     47     virtual                 ~MediaAnalyticsService();
     48 
     49     bool processExpirations();
     50 
     51  private:
     52     MediaAnalyticsItem::SessionID_t generateUniqueSessionID();
     53 
     54     // statistics about our analytics
     55     int64_t mItemsSubmitted;
     56     int64_t mItemsFinalized;
     57     int64_t mItemsDiscarded;
     58     int64_t mItemsDiscardedExpire;
     59     int64_t mItemsDiscardedCount;
     60     MediaAnalyticsItem::SessionID_t mLastSessionID;
     61 
     62     // partitioned a bit so we don't over serialize
     63     mutable Mutex           mLock;
     64     mutable Mutex           mLock_ids;
     65     mutable Mutex           mLock_mappings;
     66 
     67     // limit how many records we'll retain
     68     // by count (in each queue (open, finalized))
     69     int32_t mMaxRecords;
     70     // by time (none older than this long agan
     71     nsecs_t mMaxRecordAgeNs;
     72     // max to expire per expirations_l() invocation
     73     int32_t mMaxRecordsExpiredAtOnce;
     74     //
     75     // # of sets of summaries
     76     int32_t mMaxRecordSets;
     77     // nsecs until we start a new record set
     78     nsecs_t mNewSetInterval;
     79 
     80     // input validation after arrival from client
     81     bool contentValid(MediaAnalyticsItem *item, bool isTrusted);
     82     bool rateLimited(MediaAnalyticsItem *);
     83 
     84     // (oldest at front) so it prints nicely for dumpsys
     85     List<MediaAnalyticsItem *> mItems;
     86     void saveItem(MediaAnalyticsItem *);
     87 
     88     bool expirations_l(MediaAnalyticsItem *);
     89     std::future<bool> mExpireFuture;
     90 
     91     // support for generating output
     92     int mDumpProto;
     93     int mDumpProtoDefault;
     94     String8 dumpQueue();
     95     String8 dumpQueue(nsecs_t, const char *only);
     96 
     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);
    100 
    101     // mapping uids to package names
    102     struct UidToPkgMap {
    103         uid_t uid;
    104         std::string pkg;
    105         std::string installer;
    106         int64_t versionCode;
    107         nsecs_t expiration;
    108     };
    109 
    110     KeyedVector<uid_t,struct UidToPkgMap>  mPkgMappings;
    111     void setPkgInfo(MediaAnalyticsItem *item, uid_t uid, bool setName, bool setVersion);
    112 
    113 };
    114 
    115 // hook to send things off to the statsd subsystem
    116 extern bool dump2Statsd(MediaAnalyticsItem *item);
    117 
    118 // ----------------------------------------------------------------------------
    119 
    120 }; // namespace android
    121 
    122 #endif // ANDROID_MEDIAANALYTICSSERVICE_H
    123