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