OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/sys_info.h" | 5 #include "base/sys_info.h" |
6 | 6 |
7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
8 #include <sys/system_properties.h> | 8 #include <sys/system_properties.h> |
9 | 9 |
10 #include "base/android/sys_utils.h" | 10 #include "base/android/sys_utils.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 // Default version of Android to fall back to when actual version numbers | 58 // Default version of Android to fall back to when actual version numbers |
59 // cannot be acquired. Use the latest Android release with a higher bug fix | 59 // cannot be acquired. Use the latest Android release with a higher bug fix |
60 // version to avoid unnecessarily comparison errors with the latest release. | 60 // version to avoid unnecessarily comparison errors with the latest release. |
61 // This should be manually kept up-to-date on each Android release. | 61 // This should be manually kept up-to-date on each Android release. |
62 const int kDefaultAndroidMajorVersion = 6; | 62 const int kDefaultAndroidMajorVersion = 6; |
63 const int kDefaultAndroidMinorVersion = 0; | 63 const int kDefaultAndroidMinorVersion = 0; |
64 const int kDefaultAndroidBugfixVersion = 99; | 64 const int kDefaultAndroidBugfixVersion = 99; |
65 | 65 |
66 // Parse out the OS version numbers from the system properties. | 66 // Parse out the OS version numbers from the system properties. |
67 void ParseOSVersionNumbers(const char* os_version_str, | 67 void ParseOSVersionNumbers(const char* os_version_str, |
68 int32 *major_version, | 68 int32_t* major_version, |
69 int32 *minor_version, | 69 int32_t* minor_version, |
70 int32 *bugfix_version) { | 70 int32_t* bugfix_version) { |
71 if (os_version_str[0]) { | 71 if (os_version_str[0]) { |
72 // Try to parse out the version numbers from the string. | 72 // Try to parse out the version numbers from the string. |
73 int num_read = sscanf(os_version_str, "%d.%d.%d", major_version, | 73 int num_read = sscanf(os_version_str, "%d.%d.%d", major_version, |
74 minor_version, bugfix_version); | 74 minor_version, bugfix_version); |
75 | 75 |
76 if (num_read > 0) { | 76 if (num_read > 0) { |
77 // If we don't have a full set of version numbers, make the extras 0. | 77 // If we don't have a full set of version numbers, make the extras 0. |
78 if (num_read < 2) *minor_version = 0; | 78 if (num_read < 2) *minor_version = 0; |
79 if (num_read < 3) *bugfix_version = 0; | 79 if (num_read < 3) *bugfix_version = 0; |
80 return; | 80 return; |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 // For some reason, we couldn't parse the version number string. | 84 // For some reason, we couldn't parse the version number string. |
85 *major_version = kDefaultAndroidMajorVersion; | 85 *major_version = kDefaultAndroidMajorVersion; |
86 *minor_version = kDefaultAndroidMinorVersion; | 86 *minor_version = kDefaultAndroidMinorVersion; |
87 *bugfix_version = kDefaultAndroidBugfixVersion; | 87 *bugfix_version = kDefaultAndroidBugfixVersion; |
88 } | 88 } |
89 | 89 |
90 // Parses a system property (specified with unit 'k','m' or 'g'). | 90 // Parses a system property (specified with unit 'k','m' or 'g'). |
91 // Returns a value in bytes. | 91 // Returns a value in bytes. |
92 // Returns -1 if the string could not be parsed. | 92 // Returns -1 if the string could not be parsed. |
93 int64 ParseSystemPropertyBytes(const base::StringPiece& str) { | 93 int64_t ParseSystemPropertyBytes(const base::StringPiece& str) { |
94 const int64 KB = 1024; | 94 const int64_t KB = 1024; |
95 const int64 MB = 1024 * KB; | 95 const int64_t MB = 1024 * KB; |
96 const int64 GB = 1024 * MB; | 96 const int64_t GB = 1024 * MB; |
97 if (str.size() == 0u) | 97 if (str.size() == 0u) |
98 return -1; | 98 return -1; |
99 int64 unit_multiplier = 1; | 99 int64_t unit_multiplier = 1; |
100 size_t length = str.size(); | 100 size_t length = str.size(); |
101 if (str[length - 1] == 'k') { | 101 if (str[length - 1] == 'k') { |
102 unit_multiplier = KB; | 102 unit_multiplier = KB; |
103 length--; | 103 length--; |
104 } else if (str[length - 1] == 'm') { | 104 } else if (str[length - 1] == 'm') { |
105 unit_multiplier = MB; | 105 unit_multiplier = MB; |
106 length--; | 106 length--; |
107 } else if (str[length - 1] == 'g') { | 107 } else if (str[length - 1] == 'g') { |
108 unit_multiplier = GB; | 108 unit_multiplier = GB; |
109 length--; | 109 length--; |
110 } | 110 } |
111 int64 result = 0; | 111 int64_t result = 0; |
112 bool parsed = base::StringToInt64(str.substr(0, length), &result); | 112 bool parsed = base::StringToInt64(str.substr(0, length), &result); |
113 bool negative = result <= 0; | 113 bool negative = result <= 0; |
114 bool overflow = result >= std::numeric_limits<int64>::max() / unit_multiplier; | 114 bool overflow = |
| 115 result >= std::numeric_limits<int64_t>::max() / unit_multiplier; |
115 if (!parsed || negative || overflow) | 116 if (!parsed || negative || overflow) |
116 return -1; | 117 return -1; |
117 return result * unit_multiplier; | 118 return result * unit_multiplier; |
118 } | 119 } |
119 | 120 |
120 int GetDalvikHeapSizeMB() { | 121 int GetDalvikHeapSizeMB() { |
121 char heap_size_str[PROP_VALUE_MAX]; | 122 char heap_size_str[PROP_VALUE_MAX]; |
122 __system_property_get("dalvik.vm.heapsize", heap_size_str); | 123 __system_property_get("dalvik.vm.heapsize", heap_size_str); |
123 // dalvik.vm.heapsize property is writable by a root user. | 124 // dalvik.vm.heapsize property is writable by a root user. |
124 // Clamp it to reasonable range as a sanity check, | 125 // Clamp it to reasonable range as a sanity check, |
125 // a typical android device will never have less than 48MB. | 126 // a typical android device will never have less than 48MB. |
126 const int64 MB = 1024 * 1024; | 127 const int64_t MB = 1024 * 1024; |
127 int64 result = ParseSystemPropertyBytes(heap_size_str); | 128 int64_t result = ParseSystemPropertyBytes(heap_size_str); |
128 if (result == -1) { | 129 if (result == -1) { |
129 // We should consider not exposing these values if they are not reliable. | 130 // We should consider not exposing these values if they are not reliable. |
130 LOG(ERROR) << "Can't parse dalvik.vm.heapsize: " << heap_size_str; | 131 LOG(ERROR) << "Can't parse dalvik.vm.heapsize: " << heap_size_str; |
131 result = base::SysInfo::AmountOfPhysicalMemoryMB() / 3; | 132 result = base::SysInfo::AmountOfPhysicalMemoryMB() / 3; |
132 } | 133 } |
133 result = std::min<int64>(std::max<int64>(32 * MB, result), 1024 * MB) / MB; | 134 result = |
| 135 std::min<int64_t>(std::max<int64_t>(32 * MB, result), 1024 * MB) / MB; |
134 return static_cast<int>(result); | 136 return static_cast<int>(result); |
135 } | 137 } |
136 | 138 |
137 int GetDalvikHeapGrowthLimitMB() { | 139 int GetDalvikHeapGrowthLimitMB() { |
138 char heap_size_str[PROP_VALUE_MAX]; | 140 char heap_size_str[PROP_VALUE_MAX]; |
139 __system_property_get("dalvik.vm.heapgrowthlimit", heap_size_str); | 141 __system_property_get("dalvik.vm.heapgrowthlimit", heap_size_str); |
140 // dalvik.vm.heapgrowthlimit property is writable by a root user. | 142 // dalvik.vm.heapgrowthlimit property is writable by a root user. |
141 // Clamp it to reasonable range as a sanity check, | 143 // Clamp it to reasonable range as a sanity check, |
142 // a typical android device will never have less than 24MB. | 144 // a typical android device will never have less than 24MB. |
143 const int64 MB = 1024 * 1024; | 145 const int64_t MB = 1024 * 1024; |
144 int64 result = ParseSystemPropertyBytes(heap_size_str); | 146 int64_t result = ParseSystemPropertyBytes(heap_size_str); |
145 if (result == -1) { | 147 if (result == -1) { |
146 // We should consider not exposing these values if they are not reliable. | 148 // We should consider not exposing these values if they are not reliable. |
147 LOG(ERROR) << "Can't parse dalvik.vm.heapgrowthlimit: " << heap_size_str; | 149 LOG(ERROR) << "Can't parse dalvik.vm.heapgrowthlimit: " << heap_size_str; |
148 result = base::SysInfo::AmountOfPhysicalMemoryMB() / 6; | 150 result = base::SysInfo::AmountOfPhysicalMemoryMB() / 6; |
149 } | 151 } |
150 result = std::min<int64>(std::max<int64>(16 * MB, result), 512 * MB) / MB; | 152 result = std::min<int64_t>(std::max<int64_t>(16 * MB, result), 512 * MB) / MB; |
151 return static_cast<int>(result); | 153 return static_cast<int>(result); |
152 } | 154 } |
153 | 155 |
154 } // anonymous namespace | 156 } // anonymous namespace |
155 | 157 |
156 namespace base { | 158 namespace base { |
157 | 159 |
158 std::string SysInfo::HardwareModelName() { | 160 std::string SysInfo::HardwareModelName() { |
159 char device_model_str[PROP_VALUE_MAX]; | 161 char device_model_str[PROP_VALUE_MAX]; |
160 __system_property_get("ro.product.model", device_model_str); | 162 __system_property_get("ro.product.model", device_model_str); |
161 return std::string(device_model_str); | 163 return std::string(device_model_str); |
162 } | 164 } |
163 | 165 |
164 std::string SysInfo::OperatingSystemName() { | 166 std::string SysInfo::OperatingSystemName() { |
165 return "Android"; | 167 return "Android"; |
166 } | 168 } |
167 | 169 |
168 std::string SysInfo::OperatingSystemVersion() { | 170 std::string SysInfo::OperatingSystemVersion() { |
169 int32 major, minor, bugfix; | 171 int32_t major, minor, bugfix; |
170 OperatingSystemVersionNumbers(&major, &minor, &bugfix); | 172 OperatingSystemVersionNumbers(&major, &minor, &bugfix); |
171 return StringPrintf("%d.%d.%d", major, minor, bugfix); | 173 return StringPrintf("%d.%d.%d", major, minor, bugfix); |
172 } | 174 } |
173 | 175 |
174 void SysInfo::OperatingSystemVersionNumbers(int32* major_version, | 176 void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version, |
175 int32* minor_version, | 177 int32_t* minor_version, |
176 int32* bugfix_version) { | 178 int32_t* bugfix_version) { |
177 // Read the version number string out from the properties. | 179 // Read the version number string out from the properties. |
178 char os_version_str[PROP_VALUE_MAX]; | 180 char os_version_str[PROP_VALUE_MAX]; |
179 __system_property_get("ro.build.version.release", os_version_str); | 181 __system_property_get("ro.build.version.release", os_version_str); |
180 | 182 |
181 // Parse out the numbers. | 183 // Parse out the numbers. |
182 ParseOSVersionNumbers(os_version_str, major_version, minor_version, | 184 ParseOSVersionNumbers(os_version_str, major_version, minor_version, |
183 bugfix_version); | 185 bugfix_version); |
184 } | 186 } |
185 | 187 |
186 std::string SysInfo::GetAndroidBuildCodename() { | 188 std::string SysInfo::GetAndroidBuildCodename() { |
(...skipping 22 matching lines...) Expand all Loading... |
209 base::internal::LazySysInfoValue<bool, | 211 base::internal::LazySysInfoValue<bool, |
210 android::SysUtils::IsLowEndDeviceFromJni> >::Leaky | 212 android::SysUtils::IsLowEndDeviceFromJni> >::Leaky |
211 g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER; | 213 g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER; |
212 | 214 |
213 bool SysInfo::IsLowEndDevice() { | 215 bool SysInfo::IsLowEndDevice() { |
214 return g_lazy_low_end_device.Get().value(); | 216 return g_lazy_low_end_device.Get().value(); |
215 } | 217 } |
216 | 218 |
217 | 219 |
218 } // namespace base | 220 } // namespace base |
OLD | NEW |