xref: /aosp_15_r20/external/cronet/components/metrics/android_metrics_helper.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/android_metrics_helper.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <set>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/metrics/histogram_functions.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
11*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_registry_simple.h"
13*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_service.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
16*6777b538SAndroid Build Coastguard Worker #include <sys/system_properties.h>
17*6777b538SAndroid Build Coastguard Worker #include "base/android/build_info.h"
18*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace metrics {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // static
GetInstance()23*6777b538SAndroid Build Coastguard Worker AndroidMetricsHelper* AndroidMetricsHelper::GetInstance() {
24*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
25*6777b538SAndroid Build Coastguard Worker   char abilist32[PROP_VALUE_MAX];
26*6777b538SAndroid Build Coastguard Worker   char abilist64[PROP_VALUE_MAX];
27*6777b538SAndroid Build Coastguard Worker   static AndroidMetricsHelper instance(
28*6777b538SAndroid Build Coastguard Worker       base::android::BuildInfo::GetInstance()->package_version_code(),
29*6777b538SAndroid Build Coastguard Worker       __system_property_get("ro.product.cpu.abilist32", abilist32) > 0,
30*6777b538SAndroid Build Coastguard Worker       __system_property_get("ro.product.cpu.abilist64", abilist64) > 0);
31*6777b538SAndroid Build Coastguard Worker #else
32*6777b538SAndroid Build Coastguard Worker   static AndroidMetricsHelper instance("", false, false);
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker   return &instance;
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker 
AndroidMetricsHelper(const std::string & version_code,bool has_abilist32,bool has_abilist64)37*6777b538SAndroid Build Coastguard Worker AndroidMetricsHelper::AndroidMetricsHelper(const std::string& version_code,
38*6777b538SAndroid Build Coastguard Worker                                            bool has_abilist32,
39*6777b538SAndroid Build Coastguard Worker                                            bool has_abilist64) {
40*6777b538SAndroid Build Coastguard Worker   cpu_abi_bitness_support_ =
41*6777b538SAndroid Build Coastguard Worker       has_abilist32 ? (has_abilist64 ? CpuAbiBitnessSupport::k32And64bit
42*6777b538SAndroid Build Coastguard Worker                                      : CpuAbiBitnessSupport::k32bitOnly)
43*6777b538SAndroid Build Coastguard Worker                     : (has_abilist64 ? CpuAbiBitnessSupport::k64bitOnly
44*6777b538SAndroid Build Coastguard Worker                                      : CpuAbiBitnessSupport::kNeither);
45*6777b538SAndroid Build Coastguard Worker   int output;
46*6777b538SAndroid Build Coastguard Worker   if (base::StringToInt(version_code, &output)) {
47*6777b538SAndroid Build Coastguard Worker     version_code_int_ = output;
48*6777b538SAndroid Build Coastguard Worker   }
49*6777b538SAndroid Build Coastguard Worker }
50*6777b538SAndroid Build Coastguard Worker 
EmitHistograms(PrefService * local_state,bool on_did_create_metrics_log)51*6777b538SAndroid Build Coastguard Worker void AndroidMetricsHelper::EmitHistograms(PrefService* local_state,
52*6777b538SAndroid Build Coastguard Worker                                           bool on_did_create_metrics_log) {
53*6777b538SAndroid Build Coastguard Worker   if (on_did_create_metrics_log) {
54*6777b538SAndroid Build Coastguard Worker     if (version_code_int_) {
55*6777b538SAndroid Build Coastguard Worker       // The values won't change within the session, so save only once.
56*6777b538SAndroid Build Coastguard Worker       if (!local_state_saved_) {
57*6777b538SAndroid Build Coastguard Worker         // version_code_int_ can change across session. Save it so that it can
58*6777b538SAndroid Build Coastguard Worker         // be restored in case the session dies before logs are flushed.
59*6777b538SAndroid Build Coastguard Worker         // cpu_abi_bitness_support_ doesn't change across sessions (that'd
60*6777b538SAndroid Build Coastguard Worker         // require OS reinstall), so no need to save it. It can be reliably
61*6777b538SAndroid Build Coastguard Worker         // reconstructed in the next session.
62*6777b538SAndroid Build Coastguard Worker         SaveLocalState(local_state, version_code_int_);
63*6777b538SAndroid Build Coastguard Worker         local_state_saved_ = true;
64*6777b538SAndroid Build Coastguard Worker       }
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker       // This may change across sessions, so log it only for current session.
67*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramSparse("Android.VersionCode", version_code_int_);
68*6777b538SAndroid Build Coastguard Worker     }
69*6777b538SAndroid Build Coastguard Worker   } else {
70*6777b538SAndroid Build Coastguard Worker     // Make sure we didn't overwrite the stored state yet.
71*6777b538SAndroid Build Coastguard Worker     CHECK(!local_state_saved_);
72*6777b538SAndroid Build Coastguard Worker     // For previous session, don't log version_code_int_ as version code may
73*6777b538SAndroid Build Coastguard Worker     // have changed (e.g. version update). Log saved value instead.
74*6777b538SAndroid Build Coastguard Worker     int restored_version_code_int =
75*6777b538SAndroid Build Coastguard Worker         local_state->GetInteger(prefs::kVersionCodePref);
76*6777b538SAndroid Build Coastguard Worker     if (restored_version_code_int) {
77*6777b538SAndroid Build Coastguard Worker       base::UmaHistogramSparse("Android.VersionCode",
78*6777b538SAndroid Build Coastguard Worker                                restored_version_code_int);
79*6777b538SAndroid Build Coastguard Worker     }
80*6777b538SAndroid Build Coastguard Worker   }
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   // cpu_abi_bitness_support_ doesn't change across sessions (that'd require OS
83*6777b538SAndroid Build Coastguard Worker   // reinstall), so no need to load it, just use the current value.
84*6777b538SAndroid Build Coastguard Worker   base::UmaHistogramEnumeration("Android.CpuAbiBitnessSupport",
85*6777b538SAndroid Build Coastguard Worker                                 cpu_abi_bitness_support_);
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker // static
RegisterPrefs(PrefRegistrySimple * registry)89*6777b538SAndroid Build Coastguard Worker void AndroidMetricsHelper::RegisterPrefs(PrefRegistrySimple* registry) {
90*6777b538SAndroid Build Coastguard Worker   registry->RegisterIntegerPref(prefs::kVersionCodePref, 0);
91*6777b538SAndroid Build Coastguard Worker   local_state_saved_ = false;
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker // static
SaveLocalState(PrefService * local_state,int version_code_int)95*6777b538SAndroid Build Coastguard Worker void AndroidMetricsHelper::SaveLocalState(PrefService* local_state,
96*6777b538SAndroid Build Coastguard Worker                                           int version_code_int) {
97*6777b538SAndroid Build Coastguard Worker   local_state->SetInteger(prefs::kVersionCodePref, version_code_int);
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
101