• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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