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 3 // found in the LICENSE file. 4 5 #ifndef BASE_ANDROID_BUILD_INFO_H_ 6 #define BASE_ANDROID_BUILD_INFO_H_ 7 8 #include <jni.h> 9 10 #include <string> 11 12 #include "base/base_export.h" 13 #include "base/macros.h" 14 #include "base/memory/singleton.h" 15 16 namespace base { 17 namespace android { 18 19 // This enumeration maps to the values returned by BuildInfo::sdk_int(), 20 // indicating the Android release associated with a given SDK version. 21 enum SdkVersion { 22 SDK_VERSION_JELLY_BEAN = 16, 23 SDK_VERSION_JELLY_BEAN_MR1 = 17, 24 SDK_VERSION_JELLY_BEAN_MR2 = 18, 25 SDK_VERSION_KITKAT = 19, 26 SDK_VERSION_KITKAT_WEAR = 20, 27 SDK_VERSION_LOLLIPOP = 21, 28 SDK_VERSION_LOLLIPOP_MR1 = 22, 29 SDK_VERSION_MARSHMALLOW = 23, 30 SDK_VERSION_NOUGAT = 24 31 }; 32 33 // BuildInfo is a singleton class that stores android build and device 34 // information. It will be called from Android specific code and gets used 35 // primarily in crash reporting. 36 37 // It is also used to store the last java exception seen during JNI. 38 // TODO(nileshagrawal): Find a better place to store this info. 39 class BASE_EXPORT BuildInfo { 40 public: 41 ~BuildInfo()42 ~BuildInfo() {} 43 44 // Static factory method for getting the singleton BuildInfo instance. 45 // Note that ownership is not conferred on the caller and the BuildInfo in 46 // question isn't actually freed until shutdown. This is ok because there 47 // should only be one instance of BuildInfo ever created. 48 static BuildInfo* GetInstance(); 49 50 // Const char* is used instead of std::strings because these values must be 51 // available even if the process is in a crash state. Sadly 52 // std::string.c_str() doesn't guarantee that memory won't be allocated when 53 // it is called. device()54 const char* device() const { 55 return device_; 56 } 57 manufacturer()58 const char* manufacturer() const { 59 return manufacturer_; 60 } 61 model()62 const char* model() const { 63 return model_; 64 } 65 brand()66 const char* brand() const { 67 return brand_; 68 } 69 android_build_id()70 const char* android_build_id() const { 71 return android_build_id_; 72 } 73 android_build_fp()74 const char* android_build_fp() const { 75 return android_build_fp_; 76 } 77 gms_version_code()78 const char* gms_version_code() const { 79 return gms_version_code_; 80 } 81 package_version_code()82 const char* package_version_code() const { 83 return package_version_code_; 84 } 85 package_version_name()86 const char* package_version_name() const { 87 return package_version_name_; 88 } 89 package_label()90 const char* package_label() const { 91 return package_label_; 92 } 93 package_name()94 const char* package_name() const { 95 return package_name_; 96 } 97 build_type()98 const char* build_type() const { 99 return build_type_; 100 } 101 sdk_int()102 int sdk_int() const { 103 return sdk_int_; 104 } 105 java_exception_info()106 const char* java_exception_info() const { 107 return java_exception_info_; 108 } 109 110 void SetJavaExceptionInfo(const std::string& info); 111 112 void ClearJavaExceptionInfo(); 113 114 private: 115 friend struct BuildInfoSingletonTraits; 116 117 explicit BuildInfo(JNIEnv* env); 118 119 // Const char* is used instead of std::strings because these values must be 120 // available even if the process is in a crash state. Sadly 121 // std::string.c_str() doesn't guarantee that memory won't be allocated when 122 // it is called. 123 const char* const device_; 124 const char* const manufacturer_; 125 const char* const model_; 126 const char* const brand_; 127 const char* const android_build_id_; 128 const char* const android_build_fp_; 129 const char* const gms_version_code_; 130 const char* const package_version_code_; 131 const char* const package_version_name_; 132 const char* const package_label_; 133 const char* const package_name_; 134 const char* const build_type_; 135 const int sdk_int_; 136 // This is set via set_java_exception_info, not at constructor time. 137 const char* java_exception_info_; 138 139 DISALLOW_COPY_AND_ASSIGN(BuildInfo); 140 }; 141 142 } // namespace android 143 } // namespace base 144 145 #endif // BASE_ANDROID_BUILD_INFO_H_ 146