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 16namespace base { 17namespace 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. 21enum 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. 39class BASE_EXPORT BuildInfo { 40 public: 41 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. 54 const char* device() const { 55 return device_; 56 } 57 58 const char* manufacturer() const { 59 return manufacturer_; 60 } 61 62 const char* model() const { 63 return model_; 64 } 65 66 const char* brand() const { 67 return brand_; 68 } 69 70 const char* android_build_id() const { 71 return android_build_id_; 72 } 73 74 const char* android_build_fp() const { 75 return android_build_fp_; 76 } 77 78 const char* gms_version_code() const { 79 return gms_version_code_; 80 } 81 82 const char* package_version_code() const { 83 return package_version_code_; 84 } 85 86 const char* package_version_name() const { 87 return package_version_name_; 88 } 89 90 const char* package_label() const { 91 return package_label_; 92 } 93 94 const char* package_name() const { 95 return package_name_; 96 } 97 98 const char* build_type() const { 99 return build_type_; 100 } 101 102 int sdk_int() const { 103 return sdk_int_; 104 } 105 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