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, ¶ms);
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