1*33f37583SAndroid Build Coastguard Worker /* 2*33f37583SAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*33f37583SAndroid Build Coastguard Worker * 4*33f37583SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*33f37583SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*33f37583SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*33f37583SAndroid Build Coastguard Worker * 8*33f37583SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*33f37583SAndroid Build Coastguard Worker * 10*33f37583SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*33f37583SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*33f37583SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*33f37583SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*33f37583SAndroid Build Coastguard Worker * limitations under the License. 15*33f37583SAndroid Build Coastguard Worker */ 16*33f37583SAndroid Build Coastguard Worker 17*33f37583SAndroid Build Coastguard Worker #pragma once 18*33f37583SAndroid Build Coastguard Worker 19*33f37583SAndroid Build Coastguard Worker #include <map> 20*33f37583SAndroid Build Coastguard Worker #include <memory> 21*33f37583SAndroid Build Coastguard Worker #include <span> 22*33f37583SAndroid Build Coastguard Worker #include <string> 23*33f37583SAndroid Build Coastguard Worker #include <vector> 24*33f37583SAndroid Build Coastguard Worker 25*33f37583SAndroid Build Coastguard Worker #include "apex_constants.h" 26*33f37583SAndroid Build Coastguard Worker 27*33f37583SAndroid Build Coastguard Worker namespace android::apex { 28*33f37583SAndroid Build Coastguard Worker 29*33f37583SAndroid Build Coastguard Worker class ApexFile; 30*33f37583SAndroid Build Coastguard Worker class ApexSession; 31*33f37583SAndroid Build Coastguard Worker 32*33f37583SAndroid Build Coastguard Worker enum class InstallType { 33*33f37583SAndroid Build Coastguard Worker Staged, 34*33f37583SAndroid Build Coastguard Worker NonStaged, 35*33f37583SAndroid Build Coastguard Worker }; 36*33f37583SAndroid Build Coastguard Worker 37*33f37583SAndroid Build Coastguard Worker enum class InstallResult { 38*33f37583SAndroid Build Coastguard Worker Success, 39*33f37583SAndroid Build Coastguard Worker Failure, 40*33f37583SAndroid Build Coastguard Worker }; 41*33f37583SAndroid Build Coastguard Worker 42*33f37583SAndroid Build Coastguard Worker class Metrics { 43*33f37583SAndroid Build Coastguard Worker public: 44*33f37583SAndroid Build Coastguard Worker struct ApexFileInfo { 45*33f37583SAndroid Build Coastguard Worker std::string name; 46*33f37583SAndroid Build Coastguard Worker int64_t version; 47*33f37583SAndroid Build Coastguard Worker bool shared_libs; 48*33f37583SAndroid Build Coastguard Worker int64_t file_size; 49*33f37583SAndroid Build Coastguard Worker std::string file_hash; 50*33f37583SAndroid Build Coastguard Worker ApexPartition partition; 51*33f37583SAndroid Build Coastguard Worker std::vector<std::string> hals; 52*33f37583SAndroid Build Coastguard Worker }; 53*33f37583SAndroid Build Coastguard Worker 54*33f37583SAndroid Build Coastguard Worker virtual ~Metrics() = default; 55*33f37583SAndroid Build Coastguard Worker virtual void SendInstallationRequested(InstallType install_type, 56*33f37583SAndroid Build Coastguard Worker bool is_rollback, 57*33f37583SAndroid Build Coastguard Worker const ApexFileInfo& info) = 0; 58*33f37583SAndroid Build Coastguard Worker virtual void SendInstallationEnded(const std::string& file_hash, 59*33f37583SAndroid Build Coastguard Worker InstallResult result) = 0; 60*33f37583SAndroid Build Coastguard Worker }; 61*33f37583SAndroid Build Coastguard Worker 62*33f37583SAndroid Build Coastguard Worker std::unique_ptr<Metrics> InitMetrics(std::unique_ptr<Metrics> metrics); 63*33f37583SAndroid Build Coastguard Worker 64*33f37583SAndroid Build Coastguard Worker void SendSessionApexInstallationEndedAtom(const ApexSession& session, 65*33f37583SAndroid Build Coastguard Worker InstallResult install_result); 66*33f37583SAndroid Build Coastguard Worker 67*33f37583SAndroid Build Coastguard Worker // Helper class to send "installation_requested" event. Events are 68*33f37583SAndroid Build Coastguard Worker // sent in its destructor using Metrics::Send* methods. 69*33f37583SAndroid Build Coastguard Worker class InstallRequestedEvent { 70*33f37583SAndroid Build Coastguard Worker public: InstallRequestedEvent(InstallType install_type,bool is_rollback)71*33f37583SAndroid Build Coastguard Worker InstallRequestedEvent(InstallType install_type, bool is_rollback) 72*33f37583SAndroid Build Coastguard Worker : install_type_(install_type), is_rollback_(is_rollback) {} 73*33f37583SAndroid Build Coastguard Worker // Sends the "requested" event. 74*33f37583SAndroid Build Coastguard Worker // Sends the "end" event if it's non-staged or failed. 75*33f37583SAndroid Build Coastguard Worker ~InstallRequestedEvent(); 76*33f37583SAndroid Build Coastguard Worker 77*33f37583SAndroid Build Coastguard Worker void AddFiles(std::span<const ApexFile> files); 78*33f37583SAndroid Build Coastguard Worker 79*33f37583SAndroid Build Coastguard Worker // Adds HAL Information for each APEX. 80*33f37583SAndroid Build Coastguard Worker // Since the event can contain multiple APEX files, HAL information is 81*33f37583SAndroid Build Coastguard Worker // passed as a map of APEX name to a list of HAL names. 82*33f37583SAndroid Build Coastguard Worker void AddHals(const std::map<std::string, std::vector<std::string>>& hals); 83*33f37583SAndroid Build Coastguard Worker 84*33f37583SAndroid Build Coastguard Worker // Marks the current installation request has succeeded. 85*33f37583SAndroid Build Coastguard Worker void MarkSucceeded(); 86*33f37583SAndroid Build Coastguard Worker 87*33f37583SAndroid Build Coastguard Worker // Returns file hashes for APEX files added by AddFile() 88*33f37583SAndroid Build Coastguard Worker std::vector<std::string> GetFileHashes() const; 89*33f37583SAndroid Build Coastguard Worker 90*33f37583SAndroid Build Coastguard Worker private: 91*33f37583SAndroid Build Coastguard Worker InstallType install_type_; 92*33f37583SAndroid Build Coastguard Worker bool is_rollback_; 93*33f37583SAndroid Build Coastguard Worker std::vector<Metrics::ApexFileInfo> files_; 94*33f37583SAndroid Build Coastguard Worker bool succeeded_ = false; 95*33f37583SAndroid Build Coastguard Worker }; 96*33f37583SAndroid Build Coastguard Worker 97*33f37583SAndroid Build Coastguard Worker } // namespace android::apex 98