Home | History | Annotate | Download | only in android
      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 
     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