blob: 2299d58043e9e61f00f6be12913da0c44323f340 [file] [log] [blame]
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +09001// 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#include "base/android/build_info.h"
6
7#include <string>
8
9#include "base/android/jni_android.h"
agrievee34ff452017-06-17 00:57:24 +090010#include "base/android/jni_array.h"
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090011#include "base/android/scoped_java_ref.h"
12#include "base/logging.h"
13#include "base/memory/singleton.h"
agrievee34ff452017-06-17 00:57:24 +090014#include "base/strings/string_number_conversions.h"
bulach@chromium.org4c248ed2012-07-20 05:02:55 +090015#include "jni/BuildInfo_jni.h"
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090016
agrievea5081842017-04-25 00:44:29 +090017namespace base {
18namespace android {
19
agrievee34ff452017-06-17 00:57:24 +090020namespace {
21
22// We are leaking these strings.
23const char* StrDupParam(const std::vector<std::string>& params, int index) {
24 return strdup(params[index].c_str());
25}
26
Shimi Zhangf0a9f402018-04-20 08:16:14 +090027int GetIntParam(const std::vector<std::string>& params, int index) {
agrievee34ff452017-06-17 00:57:24 +090028 int ret = 0;
29 bool success = StringToInt(params[index], &ret);
30 DCHECK(success);
31 return ret;
32}
33
34} // namespace
35
bulach@chromium.org8d153762012-06-21 01:42:39 +090036struct BuildInfoSingletonTraits {
37 static BuildInfo* New() {
agrievee34ff452017-06-17 00:57:24 +090038 JNIEnv* env = AttachCurrentThread();
39 ScopedJavaLocalRef<jobjectArray> params_objs = Java_BuildInfo_getAll(env);
40 std::vector<std::string> params;
41 AppendJavaStringArrayToStringVector(env, params_objs.obj(), &params);
42 return new BuildInfo(params);
bulach@chromium.org8d153762012-06-21 01:42:39 +090043 }
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090044
bulach@chromium.org8d153762012-06-21 01:42:39 +090045 static void Delete(BuildInfo* x) {
46 // We're leaking this type, see kRegisterAtExit.
47 NOTREACHED();
48 }
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090049
bulach@chromium.org8d153762012-06-21 01:42:39 +090050 static const bool kRegisterAtExit = false;
gabfb83c5a2016-08-02 05:03:41 +090051#if DCHECK_IS_ON()
bulach@chromium.org8d153762012-06-21 01:42:39 +090052 static const bool kAllowedToAccessOnNonjoinableThread = true;
thakis@chromium.org2a1f9262014-03-06 10:11:54 +090053#endif
bulach@chromium.org8d153762012-06-21 01:42:39 +090054};
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090055
agrievee34ff452017-06-17 00:57:24 +090056BuildInfo::BuildInfo(const std::vector<std::string>& params)
57 : brand_(StrDupParam(params, 0)),
58 device_(StrDupParam(params, 1)),
59 android_build_id_(StrDupParam(params, 2)),
60 manufacturer_(StrDupParam(params, 3)),
61 model_(StrDupParam(params, 4)),
Shimi Zhangf0a9f402018-04-20 08:16:14 +090062 sdk_int_(GetIntParam(params, 5)),
agrievee34ff452017-06-17 00:57:24 +090063 build_type_(StrDupParam(params, 6)),
Tobias Sargeant53eed3e2018-03-08 05:26:05 +090064 board_(StrDupParam(params, 7)),
65 host_package_name_(StrDupParam(params, 8)),
66 host_version_code_(StrDupParam(params, 9)),
67 host_package_label_(StrDupParam(params, 10)),
68 package_name_(StrDupParam(params, 11)),
69 package_version_code_(StrDupParam(params, 12)),
70 package_version_name_(StrDupParam(params, 13)),
71 android_build_fp_(StrDupParam(params, 14)),
72 gms_version_code_(StrDupParam(params, 15)),
73 installer_package_name_(StrDupParam(params, 16)),
74 abi_name_(StrDupParam(params, 17)),
75 firebase_app_id_(StrDupParam(params, 18)),
Eric Stevenson97e72ea2018-04-05 04:30:58 +090076 custom_themes_(StrDupParam(params, 19)),
77 resources_version_(StrDupParam(params, 20)),
78 extracted_file_suffix_(params[21]),
Shimi Zhangf0a9f402018-04-20 08:16:14 +090079 is_at_least_p_(GetIntParam(params, 22)),
wnwen149c1c52017-03-30 03:09:23 +090080 java_exception_info_(NULL) {}
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090081
82// static
83BuildInfo* BuildInfo::GetInstance() {
bulach@chromium.org8d153762012-06-21 01:42:39 +090084 return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090085}
86
cjhopman9169abc2015-05-07 06:37:48 +090087void BuildInfo::SetJavaExceptionInfo(const std::string& info) {
nileshagrawal@chromium.org390066b2012-05-23 14:59:49 +090088 DCHECK(!java_exception_info_) << "info should be set only once.";
Andrew Grieve3c695ae2018-02-27 11:20:20 +090089 // Java stacks can be really long!
90 java_exception_info_ = strndup(info.c_str(), 5 * 4096);
nileshagrawal@chromium.org390066b2012-05-23 14:59:49 +090091}
92
cjhopman9169abc2015-05-07 06:37:48 +090093void BuildInfo::ClearJavaExceptionInfo() {
94 delete java_exception_info_;
95 java_exception_info_ = nullptr;
96}
97
carlosvaldivia@google.com2a5b0832012-04-11 07:52:44 +090098} // namespace android
99} // namespace base