• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/android/build_info.h"
6 
7 #include <string>
8 
9 #include "base/android/jni_android.h"
10 #include "base/android/jni_array.h"
11 #include "base/android/jni_string.h"
12 #include "base/android/scoped_java_ref.h"
13 #include "base/check_op.h"
14 #include "base/memory/singleton.h"
15 #include "base/notreached.h"
16 #include "base/strings/string_number_conversions.h"
17 
18 // Must come after all headers that specialize FromJniType() / ToJniType().
19 #include "base/base_jni/BuildInfo_jni.h"
20 
21 namespace base {
22 namespace android {
23 
24 namespace {
25 
26 // We are leaking these strings.
StrDupParam(const std::vector<std::string> & params,size_t index)27 const char* StrDupParam(const std::vector<std::string>& params, size_t index) {
28   return strdup(params[index].c_str());
29 }
30 
GetIntParam(const std::vector<std::string> & params,size_t index)31 int GetIntParam(const std::vector<std::string>& params, size_t index) {
32   int ret = 0;
33   bool success = StringToInt(params[index], &ret);
34   DCHECK(success);
35   return ret;
36 }
37 
38 }  // namespace
39 
40 struct BuildInfoSingletonTraits {
Newbase::android::BuildInfoSingletonTraits41   static BuildInfo* New() {
42     JNIEnv* env = AttachCurrentThread();
43     ScopedJavaLocalRef<jobjectArray> params_objs = Java_BuildInfo_getAll(env);
44     std::vector<std::string> params;
45     AppendJavaStringArrayToStringVector(env, params_objs, &params);
46     return new BuildInfo(params);
47   }
48 
Deletebase::android::BuildInfoSingletonTraits49   static void Delete(BuildInfo* x) {
50     // We're leaking this type, see kRegisterAtExit.
51     NOTREACHED();
52   }
53 
54   static const bool kRegisterAtExit = false;
55 #if DCHECK_IS_ON()
56   static const bool kAllowedToAccessOnNonjoinableThread = true;
57 #endif
58 };
59 
BuildInfo(const std::vector<std::string> & params)60 BuildInfo::BuildInfo(const std::vector<std::string>& params)
61     : brand_(StrDupParam(params, 0)),
62       device_(StrDupParam(params, 1)),
63       android_build_id_(StrDupParam(params, 2)),
64       manufacturer_(StrDupParam(params, 3)),
65       model_(StrDupParam(params, 4)),
66       sdk_int_(GetIntParam(params, 5)),
67       build_type_(StrDupParam(params, 6)),
68       board_(StrDupParam(params, 7)),
69       host_package_name_(StrDupParam(params, 8)),
70       host_version_code_(StrDupParam(params, 9)),
71       host_package_label_(StrDupParam(params, 10)),
72       package_name_(StrDupParam(params, 11)),
73       package_version_code_(StrDupParam(params, 12)),
74       package_version_name_(StrDupParam(params, 13)),
75       android_build_fp_(StrDupParam(params, 14)),
76       gms_version_code_(StrDupParam(params, 15)),
77       installer_package_name_(StrDupParam(params, 16)),
78       abi_name_(StrDupParam(params, 17)),
79       custom_themes_(StrDupParam(params, 18)),
80       resources_version_(StrDupParam(params, 19)),
81       target_sdk_version_(GetIntParam(params, 20)),
82       is_debug_android_(GetIntParam(params, 21)),
83       is_tv_(GetIntParam(params, 22)),
84       version_incremental_(StrDupParam(params, 23)),
85       hardware_(StrDupParam(params, 24)),
86       is_at_least_t_(GetIntParam(params, 25)),
87       is_automotive_(GetIntParam(params, 26)),
88       is_at_least_u_(GetIntParam(params, 27)),
89       targets_at_least_u_(GetIntParam(params, 28)),
90       codename_(StrDupParam(params, 29)),
91       vulkan_deqp_level_(GetIntParam(params, 30)),
92       is_foldable_(GetIntParam(params, 31)),
93       soc_manufacturer_(StrDupParam(params, 32)),
94       is_debug_app_(GetIntParam(params, 33)),
95       is_desktop_(GetIntParam(params, 34)) {}
96 
97 BuildInfo::~BuildInfo() = default;
98 
set_gms_version_code_for_test(const std::string & gms_version_code)99 void BuildInfo::set_gms_version_code_for_test(
100     const std::string& gms_version_code) {
101   // This leaks the string, just like production code.
102   gms_version_code_ = strdup(gms_version_code.c_str());
103   Java_BuildInfo_setGmsVersionCodeForTest(AttachCurrentThread(),
104                                           gms_version_code);
105 }
106 
host_signing_cert_sha256()107 std::string BuildInfo::host_signing_cert_sha256() {
108   JNIEnv* env = AttachCurrentThread();
109   return base::android::ConvertJavaStringToUTF8(
110       env, Java_BuildInfo_lazyGetHostSigningCertSha256(env));
111 }
112 
113 // static
GetInstance()114 BuildInfo* BuildInfo::GetInstance() {
115   return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
116 }
117 
118 }  // namespace android
119 }  // namespace base
120