xref: /aosp_15_r20/external/cronet/base/system/sys_info_android.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 "base/system/sys_info.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker #include <sys/system_properties.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/android/sys_utils.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/lazy_instance.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/system/sys_info_internal.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker // Default version of Android to fall back to when actual version numbers
23*6777b538SAndroid Build Coastguard Worker // cannot be acquired. Use the latest Android release with a higher bug fix
24*6777b538SAndroid Build Coastguard Worker // version to avoid unnecessarily comparison errors with the latest release.
25*6777b538SAndroid Build Coastguard Worker // This should be manually kept up to date on each Android release.
26*6777b538SAndroid Build Coastguard Worker const int kDefaultAndroidMajorVersion = 12;
27*6777b538SAndroid Build Coastguard Worker const int kDefaultAndroidMinorVersion = 0;
28*6777b538SAndroid Build Coastguard Worker const int kDefaultAndroidBugfixVersion = 99;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker // Get and parse out the OS version numbers from the system properties.
31*6777b538SAndroid Build Coastguard Worker // Note if parse fails, the "default" version is returned as fallback.
GetOsVersionStringAndNumbers(std::string * version_string,int32_t * major_version,int32_t * minor_version,int32_t * bugfix_version)32*6777b538SAndroid Build Coastguard Worker void GetOsVersionStringAndNumbers(std::string* version_string,
33*6777b538SAndroid Build Coastguard Worker                                   int32_t* major_version,
34*6777b538SAndroid Build Coastguard Worker                                   int32_t* minor_version,
35*6777b538SAndroid Build Coastguard Worker                                   int32_t* bugfix_version) {
36*6777b538SAndroid Build Coastguard Worker   // Read the version number string out from the properties.
37*6777b538SAndroid Build Coastguard Worker   char os_version_str[PROP_VALUE_MAX];
38*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.build.version.release", os_version_str);
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   if (os_version_str[0]) {
41*6777b538SAndroid Build Coastguard Worker     // Try to parse out the version numbers from the string.
42*6777b538SAndroid Build Coastguard Worker     int num_read = sscanf(os_version_str, "%d.%d.%d", major_version,
43*6777b538SAndroid Build Coastguard Worker                           minor_version, bugfix_version);
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker     if (num_read > 0) {
46*6777b538SAndroid Build Coastguard Worker       // If we don't have a full set of version numbers, make the extras 0.
47*6777b538SAndroid Build Coastguard Worker       if (num_read < 2)
48*6777b538SAndroid Build Coastguard Worker         *minor_version = 0;
49*6777b538SAndroid Build Coastguard Worker       if (num_read < 3)
50*6777b538SAndroid Build Coastguard Worker         *bugfix_version = 0;
51*6777b538SAndroid Build Coastguard Worker       *version_string = std::string(os_version_str);
52*6777b538SAndroid Build Coastguard Worker       return;
53*6777b538SAndroid Build Coastguard Worker     }
54*6777b538SAndroid Build Coastguard Worker   }
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker   // For some reason, we couldn't parse the version number string.
57*6777b538SAndroid Build Coastguard Worker   *major_version = kDefaultAndroidMajorVersion;
58*6777b538SAndroid Build Coastguard Worker   *minor_version = kDefaultAndroidMinorVersion;
59*6777b538SAndroid Build Coastguard Worker   *bugfix_version = kDefaultAndroidBugfixVersion;
60*6777b538SAndroid Build Coastguard Worker   *version_string = ::base::StringPrintf("%d.%d.%d", *major_version,
61*6777b538SAndroid Build Coastguard Worker                                          *minor_version, *bugfix_version);
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker 
HardwareManufacturerName()64*6777b538SAndroid Build Coastguard Worker std::string HardwareManufacturerName() {
65*6777b538SAndroid Build Coastguard Worker   char device_model_str[PROP_VALUE_MAX];
66*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.product.manufacturer", device_model_str);
67*6777b538SAndroid Build Coastguard Worker   return std::string(device_model_str);
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker }  // anonymous namespace
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker namespace base {
73*6777b538SAndroid Build Coastguard Worker 
HardwareModelName()74*6777b538SAndroid Build Coastguard Worker std::string SysInfo::HardwareModelName() {
75*6777b538SAndroid Build Coastguard Worker   char device_model_str[PROP_VALUE_MAX];
76*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.product.model", device_model_str);
77*6777b538SAndroid Build Coastguard Worker   return std::string(device_model_str);
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker 
OperatingSystemName()80*6777b538SAndroid Build Coastguard Worker std::string SysInfo::OperatingSystemName() {
81*6777b538SAndroid Build Coastguard Worker   return "Android";
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker 
OperatingSystemVersion()84*6777b538SAndroid Build Coastguard Worker std::string SysInfo::OperatingSystemVersion() {
85*6777b538SAndroid Build Coastguard Worker   std::string version_string;
86*6777b538SAndroid Build Coastguard Worker   int32_t major, minor, bugfix;
87*6777b538SAndroid Build Coastguard Worker   GetOsVersionStringAndNumbers(&version_string, &major, &minor, &bugfix);
88*6777b538SAndroid Build Coastguard Worker   return version_string;
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
OperatingSystemVersionNumbers(int32_t * major_version,int32_t * minor_version,int32_t * bugfix_version)91*6777b538SAndroid Build Coastguard Worker void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version,
92*6777b538SAndroid Build Coastguard Worker                                             int32_t* minor_version,
93*6777b538SAndroid Build Coastguard Worker                                             int32_t* bugfix_version) {
94*6777b538SAndroid Build Coastguard Worker   std::string version_string;
95*6777b538SAndroid Build Coastguard Worker   GetOsVersionStringAndNumbers(&version_string, major_version, minor_version,
96*6777b538SAndroid Build Coastguard Worker                                bugfix_version);
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
GetAndroidBuildCodename()99*6777b538SAndroid Build Coastguard Worker std::string SysInfo::GetAndroidBuildCodename() {
100*6777b538SAndroid Build Coastguard Worker   char os_version_codename_str[PROP_VALUE_MAX];
101*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.build.version.codename", os_version_codename_str);
102*6777b538SAndroid Build Coastguard Worker   return std::string(os_version_codename_str);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker 
GetAndroidBuildID()105*6777b538SAndroid Build Coastguard Worker std::string SysInfo::GetAndroidBuildID() {
106*6777b538SAndroid Build Coastguard Worker   char os_build_id_str[PROP_VALUE_MAX];
107*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.build.id", os_build_id_str);
108*6777b538SAndroid Build Coastguard Worker   return std::string(os_build_id_str);
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker 
GetAndroidHardwareEGL()111*6777b538SAndroid Build Coastguard Worker std::string SysInfo::GetAndroidHardwareEGL() {
112*6777b538SAndroid Build Coastguard Worker   char os_hardware_egl_str[PROP_VALUE_MAX];
113*6777b538SAndroid Build Coastguard Worker   __system_property_get("ro.hardware.egl", os_hardware_egl_str);
114*6777b538SAndroid Build Coastguard Worker   return std::string(os_hardware_egl_str);
115*6777b538SAndroid Build Coastguard Worker }
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker static base::LazyInstance<base::internal::LazySysInfoValue<
118*6777b538SAndroid Build Coastguard Worker     bool,
119*6777b538SAndroid Build Coastguard Worker     android::SysUtils::IsLowEndDeviceFromJni>>::Leaky g_lazy_low_end_device =
120*6777b538SAndroid Build Coastguard Worker     LAZY_INSTANCE_INITIALIZER;
121*6777b538SAndroid Build Coastguard Worker 
IsLowEndDeviceImpl()122*6777b538SAndroid Build Coastguard Worker bool SysInfo::IsLowEndDeviceImpl() {
123*6777b538SAndroid Build Coastguard Worker   // This code might be used in some environments
124*6777b538SAndroid Build Coastguard Worker   // which might not have a Java environment.
125*6777b538SAndroid Build Coastguard Worker   // Note that we need to call the Java version here.
126*6777b538SAndroid Build Coastguard Worker   // There exists a complete native implementation in
127*6777b538SAndroid Build Coastguard Worker   // sys_info.cc but calling that here would mean that
128*6777b538SAndroid Build Coastguard Worker   // the Java code and the native code would call different
129*6777b538SAndroid Build Coastguard Worker   // implementations which could give different results.
130*6777b538SAndroid Build Coastguard Worker   // Also the Java code cannot depend on the native code
131*6777b538SAndroid Build Coastguard Worker   // since it might not be loaded yet.
132*6777b538SAndroid Build Coastguard Worker   if (!base::android::IsVMInitialized())
133*6777b538SAndroid Build Coastguard Worker     return false;
134*6777b538SAndroid Build Coastguard Worker   return g_lazy_low_end_device.Get().value();
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker // static
GetHardwareInfoSync()138*6777b538SAndroid Build Coastguard Worker SysInfo::HardwareInfo SysInfo::GetHardwareInfoSync() {
139*6777b538SAndroid Build Coastguard Worker   HardwareInfo info;
140*6777b538SAndroid Build Coastguard Worker   info.manufacturer = HardwareManufacturerName();
141*6777b538SAndroid Build Coastguard Worker   info.model = HardwareModelName();
142*6777b538SAndroid Build Coastguard Worker   DCHECK(IsStringUTF8(info.manufacturer));
143*6777b538SAndroid Build Coastguard Worker   DCHECK(IsStringUTF8(info.model));
144*6777b538SAndroid Build Coastguard Worker   return info;
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker }  // namespace base
148