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 ~BuildInfo()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. device()39 const char* device() const { 40 return device_; 41 } 42 model()43 const char* model() const { 44 return model_; 45 } 46 brand()47 const char* brand() const { 48 return brand_; 49 } 50 android_build_id()51 const char* android_build_id() const { 52 return android_build_id_; 53 } 54 android_build_fp()55 const char* android_build_fp() const { 56 return android_build_fp_; 57 } 58 package_version_code()59 const char* package_version_code() const { 60 return package_version_code_; 61 } 62 package_version_name()63 const char* package_version_name() const { 64 return package_version_name_; 65 } 66 package_label()67 const char* package_label() const { 68 return package_label_; 69 } 70 package_name()71 const char* package_name() const { 72 return package_name_; 73 } 74 sdk_int()75 int sdk_int() const { 76 return sdk_int_; 77 } 78 java_exception_info()79 const char* java_exception_info() const { 80 return java_exception_info_; 81 } 82 83 void set_java_exception_info(const std::string& info); 84 85 static bool RegisterBindings(JNIEnv* env); 86 87 private: 88 friend struct BuildInfoSingletonTraits; 89 90 explicit BuildInfo(JNIEnv* env); 91 92 // Const char* is used instead of std::strings because these values must be 93 // available even if the process is in a crash state. Sadly 94 // std::string.c_str() doesn't guarantee that memory won't be allocated when 95 // it is called. 96 const char* const device_; 97 const char* const model_; 98 const char* const brand_; 99 const char* const android_build_id_; 100 const char* const android_build_fp_; 101 const char* const package_version_code_; 102 const char* const package_version_name_; 103 const char* const package_label_; 104 const char* const package_name_; 105 const int sdk_int_; 106 // This is set via set_java_exception_info, not at constructor time. 107 const char* java_exception_info_; 108 109 DISALLOW_COPY_AND_ASSIGN(BuildInfo); 110 }; 111 112 } // namespace android 113 } // namespace base 114 115 #endif // BASE_ANDROID_BUILD_INFO_H_ 116