Make all char* in android's build_info std::strings
There used to be a comment about needing to use char* instead of std::string, but I think that's obsolete, since I couldn't find any uses of these build_info fields during crash time. They all seem to be set beforehand. Bug: 414609682 Change-Id: I5fb795b2701e25c74cf604adf14f8f0c73a4c486 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6526386 Commit-Queue: Sam Maier <smaier@chromium.org> Reviewed-by: Andrew Grieve <agrieve@chromium.org> Owners-Override: Sam Maier <smaier@chromium.org> Cr-Commit-Position: refs/heads/main@{#1459610}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
4feb0cc824
commit
05ccd44feb
base
android
android_info.ccandroid_info.hapk_info.ccapk_info.hbuild_info.ccbuild_info.hdevice_info.ccdevice_info.h
java
src
org
chromium
tracing
components
gpu
services/tracing/public/cpp/perfetto
ui/gl
@ -15,6 +15,7 @@
|
||||
#include "base/android/scoped_java_ref.h"
|
||||
#include "base/check.h"
|
||||
#include "base/compiler_specific.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
|
||||
// Must come after all headers that specialize FromJniType() / ToJniType().
|
||||
@ -25,126 +26,118 @@ namespace base::android::android_info {
|
||||
namespace {
|
||||
|
||||
struct AndroidInfo {
|
||||
// Const char* is used instead of std::strings because these values must be
|
||||
// available even if the process is in a crash state. Sadly
|
||||
// std::string.c_str() doesn't guarantee that memory won't be allocated when
|
||||
// it is called.
|
||||
const char* device;
|
||||
const std::string device;
|
||||
|
||||
const char* manufacturer;
|
||||
const std::string manufacturer;
|
||||
|
||||
const char* model;
|
||||
const std::string model;
|
||||
|
||||
const char* brand;
|
||||
const std::string brand;
|
||||
|
||||
const char* android_build_id;
|
||||
const std::string android_build_id;
|
||||
|
||||
const char* build_type;
|
||||
const std::string build_type;
|
||||
|
||||
const char* board;
|
||||
const std::string board;
|
||||
|
||||
const char* android_build_fp;
|
||||
const std::string android_build_fp;
|
||||
|
||||
int sdk_int;
|
||||
|
||||
bool is_debug_android;
|
||||
|
||||
const char* version_incremental;
|
||||
const std::string version_incremental;
|
||||
|
||||
const char* hardware;
|
||||
const std::string hardware;
|
||||
|
||||
const char* codename;
|
||||
const std::string codename;
|
||||
|
||||
// Available only on android S+. For S-, this method returns empty string.
|
||||
const char* soc_manufacturer;
|
||||
const std::string soc_manufacturer;
|
||||
|
||||
const char* abi_name;
|
||||
const std::string abi_name;
|
||||
};
|
||||
|
||||
std::optional<AndroidInfo> holder;
|
||||
static std::optional<AndroidInfo>& get_holder() {
|
||||
static base::NoDestructor<std::optional<AndroidInfo>> holder;
|
||||
return *holder;
|
||||
}
|
||||
|
||||
const AndroidInfo& get_android_info() {
|
||||
[[maybe_unused]] static auto once = [] {
|
||||
const std::optional<AndroidInfo>& holder = get_holder();
|
||||
if (!holder.has_value()) {
|
||||
Java_AndroidInfo_nativeReadyForFields(AttachCurrentThread());
|
||||
return std::monostate();
|
||||
}();
|
||||
// holder should be initialized as the java is supposed to call the native
|
||||
// method FillFields which will initialize the fields within the holder.
|
||||
DCHECK(holder.has_value());
|
||||
}
|
||||
return *holder;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
static void JNI_AndroidInfo_FillFields(
|
||||
JNIEnv* env,
|
||||
const jni_zero::JavaParamRef<jstring>& brand,
|
||||
const jni_zero::JavaParamRef<jstring>& device,
|
||||
const jni_zero::JavaParamRef<jstring>& buildId,
|
||||
const jni_zero::JavaParamRef<jstring>& manufacturer,
|
||||
const jni_zero::JavaParamRef<jstring>& model,
|
||||
const jni_zero::JavaParamRef<jstring>& type,
|
||||
const jni_zero::JavaParamRef<jstring>& board,
|
||||
const jni_zero::JavaParamRef<jstring>& androidBuildFingerprint,
|
||||
const jni_zero::JavaParamRef<jstring>& versionIncremental,
|
||||
const jni_zero::JavaParamRef<jstring>& hardware,
|
||||
const jni_zero::JavaParamRef<jstring>& codeName,
|
||||
const jni_zero::JavaParamRef<jstring>& socManufacturer,
|
||||
const jni_zero::JavaParamRef<jstring>& supportedAbis,
|
||||
jint sdkInt,
|
||||
jboolean isDebugAndroid) {
|
||||
static void JNI_AndroidInfo_FillFields(JNIEnv* env,
|
||||
std::string& brand,
|
||||
std::string& device,
|
||||
std::string& buildId,
|
||||
std::string& manufacturer,
|
||||
std::string& model,
|
||||
std::string& type,
|
||||
std::string& board,
|
||||
std::string& androidBuildFingerprint,
|
||||
std::string& versionIncremental,
|
||||
std::string& hardware,
|
||||
std::string& codeName,
|
||||
std::string& socManufacturer,
|
||||
std::string& supportedAbis,
|
||||
jint sdkInt,
|
||||
jboolean isDebugAndroid) {
|
||||
std::optional<AndroidInfo>& holder = get_holder();
|
||||
DCHECK(!holder.has_value());
|
||||
auto java_string_to_const_char =
|
||||
[](const jni_zero::JavaParamRef<jstring>& str) {
|
||||
return UNSAFE_TODO(strdup(ConvertJavaStringToUTF8(str).c_str()));
|
||||
};
|
||||
holder = AndroidInfo{
|
||||
.device = java_string_to_const_char(device),
|
||||
.manufacturer = java_string_to_const_char(manufacturer),
|
||||
.model = java_string_to_const_char(model),
|
||||
.brand = java_string_to_const_char(brand),
|
||||
.android_build_id = java_string_to_const_char(buildId),
|
||||
.build_type = java_string_to_const_char(type),
|
||||
.board = java_string_to_const_char(board),
|
||||
.android_build_fp = java_string_to_const_char(androidBuildFingerprint),
|
||||
.sdk_int = sdkInt,
|
||||
.is_debug_android = static_cast<bool>(isDebugAndroid),
|
||||
.version_incremental = java_string_to_const_char(versionIncremental),
|
||||
.hardware = java_string_to_const_char(hardware),
|
||||
.codename = java_string_to_const_char(codeName),
|
||||
.soc_manufacturer = java_string_to_const_char(socManufacturer),
|
||||
.abi_name = java_string_to_const_char(supportedAbis)};
|
||||
holder.emplace(
|
||||
AndroidInfo{.device = device,
|
||||
.manufacturer = manufacturer,
|
||||
.model = model,
|
||||
.brand = brand,
|
||||
.android_build_id = buildId,
|
||||
.build_type = type,
|
||||
.board = board,
|
||||
.android_build_fp = androidBuildFingerprint,
|
||||
.sdk_int = sdkInt,
|
||||
.is_debug_android = static_cast<bool>(isDebugAndroid),
|
||||
.version_incremental = versionIncremental,
|
||||
.hardware = hardware,
|
||||
.codename = codeName,
|
||||
.soc_manufacturer = socManufacturer,
|
||||
.abi_name = supportedAbis});
|
||||
}
|
||||
|
||||
const char* device() {
|
||||
const std::string& device() {
|
||||
return get_android_info().device;
|
||||
}
|
||||
|
||||
const char* manufacturer() {
|
||||
const std::string& manufacturer() {
|
||||
return get_android_info().manufacturer;
|
||||
}
|
||||
|
||||
const char* model() {
|
||||
const std::string& model() {
|
||||
return get_android_info().model;
|
||||
}
|
||||
|
||||
const char* brand() {
|
||||
const std::string& brand() {
|
||||
return get_android_info().brand;
|
||||
}
|
||||
|
||||
const char* android_build_id() {
|
||||
const std::string& android_build_id() {
|
||||
return get_android_info().android_build_id;
|
||||
}
|
||||
|
||||
const char* build_type() {
|
||||
const std::string& build_type() {
|
||||
return get_android_info().build_type;
|
||||
}
|
||||
|
||||
const char* board() {
|
||||
const std::string& board() {
|
||||
return get_android_info().board;
|
||||
}
|
||||
|
||||
const char* android_build_fp() {
|
||||
const std::string& android_build_fp() {
|
||||
return get_android_info().android_build_fp;
|
||||
}
|
||||
|
||||
@ -156,24 +149,24 @@ bool is_debug_android() {
|
||||
return get_android_info().is_debug_android;
|
||||
}
|
||||
|
||||
const char* version_incremental() {
|
||||
const std::string& version_incremental() {
|
||||
return get_android_info().version_incremental;
|
||||
}
|
||||
|
||||
const char* hardware() {
|
||||
const std::string& hardware() {
|
||||
return get_android_info().hardware;
|
||||
}
|
||||
|
||||
const char* codename() {
|
||||
const std::string& codename() {
|
||||
return get_android_info().codename;
|
||||
}
|
||||
|
||||
// Available only on android S+. For S-, this method returns empty string.
|
||||
const char* soc_manufacturer() {
|
||||
const std::string& soc_manufacturer() {
|
||||
return get_android_info().soc_manufacturer;
|
||||
}
|
||||
|
||||
const char* abi_name() {
|
||||
const std::string& abi_name() {
|
||||
return get_android_info().abi_name;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
#ifndef BASE_ANDROID_ANDROID_INFO_H_
|
||||
#define BASE_ANDROID_ANDROID_INFO_H_
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "base/base_export.h"
|
||||
|
||||
namespace base::android::android_info {
|
||||
@ -35,36 +37,36 @@ enum SdkVersion {
|
||||
SDK_VERSION_BAKLAVA = 36,
|
||||
};
|
||||
|
||||
const char* device();
|
||||
const std::string& device();
|
||||
|
||||
const char* manufacturer();
|
||||
const std::string& manufacturer();
|
||||
|
||||
const char* model();
|
||||
const std::string& model();
|
||||
|
||||
BASE_EXPORT const char* brand();
|
||||
BASE_EXPORT const std::string& brand();
|
||||
|
||||
const char* android_build_id();
|
||||
const std::string& android_build_id();
|
||||
|
||||
const char* build_type();
|
||||
const std::string& build_type();
|
||||
|
||||
const char* board();
|
||||
const std::string& board();
|
||||
|
||||
const char* android_build_fp();
|
||||
const std::string& android_build_fp();
|
||||
|
||||
BASE_EXPORT int sdk_int();
|
||||
|
||||
bool is_debug_android();
|
||||
|
||||
const char* version_incremental();
|
||||
const std::string& version_incremental();
|
||||
|
||||
BASE_EXPORT const char* hardware();
|
||||
BASE_EXPORT const std::string& hardware();
|
||||
|
||||
const char* codename();
|
||||
const std::string& codename();
|
||||
|
||||
// Available only on android S+. For S-, this method returns empty string.
|
||||
const char* soc_manufacturer();
|
||||
const std::string& soc_manufacturer();
|
||||
|
||||
const char* abi_name();
|
||||
const std::string& abi_name();
|
||||
|
||||
} // namespace base::android::android_info
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "base/android/jni_string.h"
|
||||
#include "base/android/scoped_java_ref.h"
|
||||
#include "base/compiler_specific.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
|
||||
// Must come after all headers that specialize FromJniType() / ToJniType().
|
||||
@ -22,96 +23,87 @@ namespace base::android::apk_info {
|
||||
namespace {
|
||||
|
||||
struct ApkInfo {
|
||||
// Const char* is used instead of std::strings because these values must be
|
||||
// available even if the process is in a crash state. Sadly
|
||||
// std::string.c_str() doesn't guarantee that memory won't be allocated when
|
||||
// it is called.
|
||||
const char* host_package_name;
|
||||
const char* host_version_code;
|
||||
const char* host_package_label;
|
||||
const char* package_version_code;
|
||||
const char* package_version_name;
|
||||
const char* package_name;
|
||||
const char* resources_version;
|
||||
const char* installer_package_name;
|
||||
const std::string host_package_name;
|
||||
const std::string host_version_code;
|
||||
const std::string host_package_label;
|
||||
const std::string package_version_code;
|
||||
const std::string package_version_name;
|
||||
const std::string package_name;
|
||||
const std::string resources_version;
|
||||
const std::string installer_package_name;
|
||||
bool is_debug_app;
|
||||
int target_sdk_version;
|
||||
};
|
||||
|
||||
std::optional<ApkInfo> holder;
|
||||
static std::optional<ApkInfo>& get_holder() {
|
||||
static base::NoDestructor<std::optional<ApkInfo>> holder;
|
||||
return *holder;
|
||||
}
|
||||
|
||||
ApkInfo& get_apk_info() {
|
||||
[[maybe_unused]] static auto once = [] {
|
||||
const ApkInfo& get_apk_info() {
|
||||
const std::optional<ApkInfo>& holder = get_holder();
|
||||
if (!holder.has_value()) {
|
||||
Java_ApkInfo_nativeReadyForFields(AttachCurrentThread());
|
||||
return std::monostate();
|
||||
}();
|
||||
// holder should be initialized as the java is supposed to call the native
|
||||
// method FillFields which will initialize the fields within the holder.
|
||||
DCHECK(holder.has_value());
|
||||
}
|
||||
return *holder;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
static void JNI_ApkInfo_FillFields(
|
||||
JNIEnv* env,
|
||||
const jni_zero::JavaParamRef<jstring>& hostPackageName,
|
||||
const jni_zero::JavaParamRef<jstring>& hostVersionCode,
|
||||
const jni_zero::JavaParamRef<jstring>& hostPackageLabel,
|
||||
const jni_zero::JavaParamRef<jstring>& packageVersionCode,
|
||||
const jni_zero::JavaParamRef<jstring>& packageVersionName,
|
||||
const jni_zero::JavaParamRef<jstring>& packageName,
|
||||
const jni_zero::JavaParamRef<jstring>& resourcesVersion,
|
||||
const jni_zero::JavaParamRef<jstring>& installerPackageName,
|
||||
jboolean isDebugApp,
|
||||
jint targetSdkVersion) {
|
||||
static void JNI_ApkInfo_FillFields(JNIEnv* env,
|
||||
std::string& hostPackageName,
|
||||
std::string& hostVersionCode,
|
||||
std::string& hostPackageLabel,
|
||||
std::string& packageVersionCode,
|
||||
std::string& packageVersionName,
|
||||
std::string& packageName,
|
||||
std::string& resourcesVersion,
|
||||
std::string& installerPackageName,
|
||||
jboolean isDebugApp,
|
||||
jint targetSdkVersion) {
|
||||
std::optional<ApkInfo>& holder = get_holder();
|
||||
DCHECK(!holder.has_value());
|
||||
auto java_string_to_const_char =
|
||||
[](const jni_zero::JavaParamRef<jstring>& str) {
|
||||
return UNSAFE_TODO(strdup(ConvertJavaStringToUTF8(str).c_str()));
|
||||
};
|
||||
holder = ApkInfo{
|
||||
.host_package_name = java_string_to_const_char(hostPackageName),
|
||||
.host_version_code = java_string_to_const_char(hostVersionCode),
|
||||
.host_package_label = java_string_to_const_char(hostPackageLabel),
|
||||
.package_version_code = java_string_to_const_char(packageVersionCode),
|
||||
.package_version_name = java_string_to_const_char(packageVersionName),
|
||||
.package_name = java_string_to_const_char(packageName),
|
||||
.resources_version = java_string_to_const_char(resourcesVersion),
|
||||
.installer_package_name = java_string_to_const_char(installerPackageName),
|
||||
.is_debug_app = static_cast<bool>(isDebugApp),
|
||||
.target_sdk_version = targetSdkVersion};
|
||||
holder.emplace(ApkInfo{.host_package_name = hostPackageName,
|
||||
.host_version_code = hostVersionCode,
|
||||
.host_package_label = hostPackageLabel,
|
||||
.package_version_code = packageVersionCode,
|
||||
.package_version_name = packageVersionName,
|
||||
.package_name = packageName,
|
||||
.resources_version = resourcesVersion,
|
||||
.installer_package_name = installerPackageName,
|
||||
.is_debug_app = static_cast<bool>(isDebugApp),
|
||||
.target_sdk_version = targetSdkVersion});
|
||||
}
|
||||
|
||||
const char* host_package_name() {
|
||||
const std::string& host_package_name() {
|
||||
return get_apk_info().host_package_name;
|
||||
}
|
||||
|
||||
const char* host_version_code() {
|
||||
const std::string& host_version_code() {
|
||||
return get_apk_info().host_version_code;
|
||||
}
|
||||
|
||||
const char* host_package_label() {
|
||||
const std::string& host_package_label() {
|
||||
return get_apk_info().host_package_label;
|
||||
}
|
||||
|
||||
const char* package_version_code() {
|
||||
const std::string& package_version_code() {
|
||||
return get_apk_info().package_version_code;
|
||||
}
|
||||
|
||||
const char* package_version_name() {
|
||||
const std::string& package_version_name() {
|
||||
return get_apk_info().package_version_name;
|
||||
}
|
||||
|
||||
const char* package_name() {
|
||||
const std::string& package_name() {
|
||||
return get_apk_info().package_name;
|
||||
}
|
||||
|
||||
const char* resources_version() {
|
||||
const std::string& resources_version() {
|
||||
return get_apk_info().resources_version;
|
||||
}
|
||||
|
||||
const char* installer_package_name() {
|
||||
const std::string& installer_package_name() {
|
||||
return get_apk_info().installer_package_name;
|
||||
}
|
||||
|
||||
|
@ -5,33 +5,35 @@
|
||||
#ifndef BASE_ANDROID_APK_INFO_H_
|
||||
#define BASE_ANDROID_APK_INFO_H_
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace base::android::apk_info {
|
||||
// The package name of the host app which has loaded WebView, retrieved from
|
||||
// the application context. In the context of the SDK Runtime, the package
|
||||
// name of the app that owns this particular instance of the SDK Runtime will
|
||||
// also be included. e.g.
|
||||
// com.google.android.sdksandbox:com:com.example.myappwithads
|
||||
const char* host_package_name();
|
||||
const std::string& host_package_name();
|
||||
|
||||
// The application name (e.g. "Chrome"). For WebView, this is name of the
|
||||
// embedding app. In the context of the SDK Runtime, this is the name of the
|
||||
// app that owns this particular instance of the SDK Runtime.
|
||||
const char* host_version_code();
|
||||
const std::string& host_version_code();
|
||||
|
||||
// By default: same as versionCode. For WebView: versionCode of the embedding
|
||||
// app. In the context of the SDK Runtime, this is the versionCode of the app
|
||||
// that owns this particular instance of the SDK Runtime.
|
||||
const char* host_package_label();
|
||||
const std::string& host_package_label();
|
||||
|
||||
const char* package_version_code();
|
||||
const std::string& package_version_code();
|
||||
|
||||
const char* package_version_name();
|
||||
const std::string& package_version_name();
|
||||
|
||||
const char* package_name();
|
||||
const std::string& package_name();
|
||||
|
||||
const char* resources_version();
|
||||
const std::string& resources_version();
|
||||
|
||||
const char* installer_package_name();
|
||||
const std::string& installer_package_name();
|
||||
|
||||
bool is_debug_app();
|
||||
|
||||
|
@ -72,7 +72,7 @@ BuildInfo::BuildInfo()
|
||||
|
||||
BuildInfo::~BuildInfo() = default;
|
||||
|
||||
const char* BuildInfo::gms_version_code() const {
|
||||
const std::string& BuildInfo::gms_version_code() const {
|
||||
return device_info::gms_version_code();
|
||||
}
|
||||
|
||||
@ -81,7 +81,7 @@ void BuildInfo::set_gms_version_code_for_test(
|
||||
device_info::set_gms_version_code_for_test(gms_version_code);
|
||||
}
|
||||
|
||||
std::string BuildInfo::host_signing_cert_sha256() {
|
||||
const std::string BuildInfo::host_signing_cert_sha256() {
|
||||
JNIEnv* env = AttachCurrentThread();
|
||||
return Java_BuildInfo_lazyGetHostSigningCertSha256(env);
|
||||
}
|
||||
|
@ -62,23 +62,19 @@ class BASE_EXPORT BuildInfo {
|
||||
// should only be one instance of BuildInfo ever created.
|
||||
static BuildInfo* GetInstance();
|
||||
|
||||
// Const char* is used instead of std::strings because these values must be
|
||||
// available even if the process is in a crash state. Sadly
|
||||
// std::string.c_str() doesn't guarantee that memory won't be allocated when
|
||||
// it is called.
|
||||
const char* device() const { return device_; }
|
||||
const std::string& device() const { return device_; }
|
||||
|
||||
const char* manufacturer() const { return manufacturer_; }
|
||||
const std::string& manufacturer() const { return manufacturer_; }
|
||||
|
||||
const char* model() const { return model_; }
|
||||
const std::string& model() const { return model_; }
|
||||
|
||||
const char* brand() const { return brand_; }
|
||||
const std::string& brand() const { return brand_; }
|
||||
|
||||
const char* android_build_id() const { return android_build_id_; }
|
||||
const std::string& android_build_id() const { return android_build_id_; }
|
||||
|
||||
const char* android_build_fp() const { return android_build_fp_; }
|
||||
const std::string& android_build_fp() const { return android_build_fp_; }
|
||||
|
||||
const char* gms_version_code() const;
|
||||
const std::string& gms_version_code() const;
|
||||
|
||||
void set_gms_version_code_for_test(const std::string& gms_version_code);
|
||||
|
||||
@ -87,37 +83,43 @@ class BASE_EXPORT BuildInfo {
|
||||
// name of the app that owns this particular instance of the SDK Runtime will
|
||||
// also be included. e.g.
|
||||
// com.google.android.sdksandbox:com:com.example.myappwithads
|
||||
const char* host_package_name() const { return host_package_name_; }
|
||||
const std::string& host_package_name() const { return host_package_name_; }
|
||||
|
||||
// The application name (e.g. "Chrome"). For WebView, this is name of the
|
||||
// embedding app. In the context of the SDK Runtime, this is the name of the
|
||||
// app that owns this particular instance of the SDK Runtime.
|
||||
const char* host_version_code() const { return host_version_code_; }
|
||||
const std::string& host_version_code() const { return host_version_code_; }
|
||||
|
||||
// By default: same as versionCode. For WebView: versionCode of the embedding
|
||||
// app. In the context of the SDK Runtime, this is the versionCode of the app
|
||||
// that owns this particular instance of the SDK Runtime.
|
||||
const char* host_package_label() const { return host_package_label_; }
|
||||
const std::string& host_package_label() const { return host_package_label_; }
|
||||
|
||||
// The SHA256 of the public certificate used to sign the host application.
|
||||
// This will default to an empty string if we were unable to retrieve it.
|
||||
std::string host_signing_cert_sha256();
|
||||
const std::string host_signing_cert_sha256();
|
||||
|
||||
const char* package_version_code() const { return package_version_code_; }
|
||||
const std::string& package_version_code() const {
|
||||
return package_version_code_;
|
||||
}
|
||||
|
||||
const char* package_version_name() const { return package_version_name_; }
|
||||
const std::string& package_version_name() const {
|
||||
return package_version_name_;
|
||||
}
|
||||
|
||||
const char* package_name() const { return package_name_; }
|
||||
const std::string& package_name() const { return package_name_; }
|
||||
|
||||
const char* resources_version() const { return resources_version_; }
|
||||
const std::string& resources_version() const { return resources_version_; }
|
||||
|
||||
const char* build_type() const { return build_type_; }
|
||||
const std::string& build_type() const { return build_type_; }
|
||||
|
||||
const char* board() const { return board_; }
|
||||
const std::string& board() const { return board_; }
|
||||
|
||||
const char* installer_package_name() const { return installer_package_name_; }
|
||||
const std::string& installer_package_name() const {
|
||||
return installer_package_name_;
|
||||
}
|
||||
|
||||
const char* abi_name() const { return abi_name_; }
|
||||
const std::string& abi_name() const { return abi_name_; }
|
||||
|
||||
int sdk_int() const { return sdk_int_; }
|
||||
|
||||
@ -133,13 +135,15 @@ class BASE_EXPORT BuildInfo {
|
||||
|
||||
bool is_tv() const { return is_tv_; }
|
||||
|
||||
const char* version_incremental() const { return version_incremental_; }
|
||||
const std::string& version_incremental() const {
|
||||
return version_incremental_;
|
||||
}
|
||||
|
||||
const char* hardware() const { return hardware_; }
|
||||
const std::string& hardware() const { return hardware_; }
|
||||
|
||||
bool is_automotive() const { return is_automotive_; }
|
||||
|
||||
const char* codename() const { return codename_; }
|
||||
const std::string& codename() const { return codename_; }
|
||||
|
||||
bool is_foldable() const { return is_foldable_; }
|
||||
|
||||
@ -149,7 +153,7 @@ class BASE_EXPORT BuildInfo {
|
||||
int32_t vulkan_deqp_level() const { return vulkan_deqp_level_; }
|
||||
|
||||
// Available only on android S+. For S-, this method returns empty string.
|
||||
const char* soc_manufacturer() const { return soc_manufacturer_; }
|
||||
const std::string& soc_manufacturer() const { return soc_manufacturer_; }
|
||||
|
||||
bool is_debug_app() const { return is_debug_app_; }
|
||||
|
||||
@ -158,39 +162,34 @@ class BASE_EXPORT BuildInfo {
|
||||
|
||||
explicit BuildInfo();
|
||||
|
||||
// Const char* is used instead of std::strings because these values must be
|
||||
// available even if the process is in a crash state. Sadly
|
||||
// std::string.c_str() doesn't guarantee that memory won't be allocated when
|
||||
// it is called.
|
||||
const char* const brand_;
|
||||
const char* const device_;
|
||||
const char* const android_build_id_;
|
||||
const char* const manufacturer_;
|
||||
const char* const model_;
|
||||
const std::string brand_;
|
||||
const std::string device_;
|
||||
const std::string android_build_id_;
|
||||
const std::string manufacturer_;
|
||||
const std::string model_;
|
||||
const int sdk_int_;
|
||||
const char* const build_type_;
|
||||
const char* const board_;
|
||||
const char* const host_package_name_;
|
||||
const char* const host_version_code_;
|
||||
const char* const host_package_label_;
|
||||
const char* const package_name_;
|
||||
const char* const package_version_code_;
|
||||
const char* const package_version_name_;
|
||||
const char* const android_build_fp_;
|
||||
const char* const installer_package_name_;
|
||||
const char* const abi_name_;
|
||||
const char* const resources_version_;
|
||||
// Not needed by breakpad.
|
||||
const std::string build_type_;
|
||||
const std::string board_;
|
||||
const std::string host_package_name_;
|
||||
const std::string host_version_code_;
|
||||
const std::string host_package_label_;
|
||||
const std::string package_name_;
|
||||
const std::string package_version_code_;
|
||||
const std::string package_version_name_;
|
||||
const std::string android_build_fp_;
|
||||
const std::string installer_package_name_;
|
||||
const std::string abi_name_;
|
||||
const std::string resources_version_;
|
||||
const int target_sdk_version_;
|
||||
const bool is_debug_android_;
|
||||
const bool is_tv_;
|
||||
const char* const version_incremental_;
|
||||
const char* const hardware_;
|
||||
const std::string version_incremental_;
|
||||
const std::string hardware_;
|
||||
const bool is_automotive_;
|
||||
const char* const codename_;
|
||||
const std::string codename_;
|
||||
const int32_t vulkan_deqp_level_;
|
||||
const bool is_foldable_;
|
||||
const char* const soc_manufacturer_;
|
||||
const std::string soc_manufacturer_;
|
||||
const bool is_debug_app_;
|
||||
const bool is_desktop_;
|
||||
};
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "base/android/jni_string.h"
|
||||
#include "base/android/scoped_java_ref.h"
|
||||
#include "base/compiler_specific.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/strings/string_number_conversions.h"
|
||||
|
||||
// Must come after all headers that specialize FromJniType() / ToJniType().
|
||||
@ -20,11 +21,7 @@
|
||||
namespace base::android::device_info {
|
||||
namespace {
|
||||
struct DeviceInfo {
|
||||
// Const char* is used instead of std::strings because these values must be
|
||||
// available even if the process is in a crash state. Sadly
|
||||
// std::string.c_str() doesn't guarantee that memory won't be allocated when
|
||||
// it is called.
|
||||
const char* gms_version_code;
|
||||
std::string gms_version_code;
|
||||
bool is_tv;
|
||||
bool is_automotive;
|
||||
bool is_foldable;
|
||||
@ -33,50 +30,44 @@ struct DeviceInfo {
|
||||
int32_t vulkan_deqp_level;
|
||||
};
|
||||
|
||||
std::optional<DeviceInfo> holder;
|
||||
static std::optional<DeviceInfo>& get_holder() {
|
||||
static base::NoDestructor<std::optional<DeviceInfo>> holder;
|
||||
return *holder;
|
||||
}
|
||||
|
||||
DeviceInfo& get_device_info() {
|
||||
[[maybe_unused]] static auto once = [] {
|
||||
std::optional<DeviceInfo>& holder = get_holder();
|
||||
if (!holder.has_value()) {
|
||||
Java_DeviceInfo_nativeReadyForFields(AttachCurrentThread());
|
||||
return std::monostate();
|
||||
}();
|
||||
// holder should be initialized as the java is supposed to call the native
|
||||
// method FillFields which will initialize the fields within the holder.
|
||||
DCHECK(holder.has_value());
|
||||
}
|
||||
return *holder;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
static void JNI_DeviceInfo_FillFields(
|
||||
JNIEnv* env,
|
||||
const jni_zero::JavaParamRef<jstring>& gmsVersionCode,
|
||||
jboolean isTV,
|
||||
jboolean isAutomotive,
|
||||
jboolean isFoldable,
|
||||
jboolean isDesktop,
|
||||
jint vulkanDeqpLevel) {
|
||||
static void JNI_DeviceInfo_FillFields(JNIEnv* env,
|
||||
std::string& gmsVersionCode,
|
||||
jboolean isTV,
|
||||
jboolean isAutomotive,
|
||||
jboolean isFoldable,
|
||||
jboolean isDesktop,
|
||||
jint vulkanDeqpLevel) {
|
||||
std::optional<DeviceInfo>& holder = get_holder();
|
||||
DCHECK(!holder.has_value());
|
||||
auto java_string_to_const_char =
|
||||
[](const jni_zero::JavaParamRef<jstring>& str) {
|
||||
return UNSAFE_TODO(strdup(ConvertJavaStringToUTF8(str).c_str()));
|
||||
};
|
||||
holder =
|
||||
DeviceInfo{.gms_version_code = java_string_to_const_char(gmsVersionCode),
|
||||
.is_tv = static_cast<bool>(isTV),
|
||||
.is_automotive = static_cast<bool>(isAutomotive),
|
||||
.is_foldable = static_cast<bool>(isFoldable),
|
||||
.is_desktop = static_cast<bool>(isDesktop),
|
||||
.vulkan_deqp_level = vulkanDeqpLevel};
|
||||
holder.emplace(DeviceInfo{.gms_version_code = gmsVersionCode,
|
||||
.is_tv = static_cast<bool>(isTV),
|
||||
.is_automotive = static_cast<bool>(isAutomotive),
|
||||
.is_foldable = static_cast<bool>(isFoldable),
|
||||
.is_desktop = static_cast<bool>(isDesktop),
|
||||
.vulkan_deqp_level = vulkanDeqpLevel});
|
||||
}
|
||||
|
||||
const char* gms_version_code() {
|
||||
const std::string& gms_version_code() {
|
||||
return get_device_info().gms_version_code;
|
||||
}
|
||||
|
||||
void set_gms_version_code_for_test(const std::string& gms_version_code) {
|
||||
get_device_info().gms_version_code =
|
||||
UNSAFE_TODO(strdup(gms_version_code.c_str()));
|
||||
get_device_info().gms_version_code = gms_version_code;
|
||||
Java_DeviceInfo_setGmsVersionCodeForTest(AttachCurrentThread(),
|
||||
gms_version_code);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
#include <string>
|
||||
|
||||
namespace base::android::device_info {
|
||||
const char* gms_version_code();
|
||||
const std::string& gms_version_code();
|
||||
|
||||
void set_gms_version_code_for_test(const std::string& gms_version_code);
|
||||
|
||||
|
@ -9,6 +9,7 @@ import android.text.TextUtils;
|
||||
|
||||
import org.jni_zero.CalledByNative;
|
||||
import org.jni_zero.JNINamespace;
|
||||
import org.jni_zero.JniType;
|
||||
import org.jni_zero.NativeMethods;
|
||||
|
||||
import org.chromium.build.annotations.NullMarked;
|
||||
@ -69,19 +70,19 @@ public final class AndroidInfo {
|
||||
@NativeMethods
|
||||
interface Natives {
|
||||
void fillFields(
|
||||
String brand,
|
||||
String device,
|
||||
String buildId,
|
||||
String manufacturer,
|
||||
String model,
|
||||
String type,
|
||||
String board,
|
||||
String androidBuildFingerprint,
|
||||
String versionIncremental,
|
||||
String hardware,
|
||||
String codeName,
|
||||
String socManufacturer,
|
||||
String supportedAbis,
|
||||
@JniType("std::string") String brand,
|
||||
@JniType("std::string") String device,
|
||||
@JniType("std::string") String buildId,
|
||||
@JniType("std::string") String manufacturer,
|
||||
@JniType("std::string") String model,
|
||||
@JniType("std::string") String type,
|
||||
@JniType("std::string") String board,
|
||||
@JniType("std::string") String androidBuildFingerprint,
|
||||
@JniType("std::string") String versionIncremental,
|
||||
@JniType("std::string") String hardware,
|
||||
@JniType("std::string") String codeName,
|
||||
@JniType("std::string") String socManufacturer,
|
||||
@JniType("std::string") String supportedAbis,
|
||||
int sdkInt,
|
||||
boolean isDebugAndroid);
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import android.os.Process;
|
||||
|
||||
import org.jni_zero.CalledByNative;
|
||||
import org.jni_zero.JNINamespace;
|
||||
import org.jni_zero.JniType;
|
||||
import org.jni_zero.NativeMethods;
|
||||
|
||||
import org.chromium.base.version_info.VersionInfo;
|
||||
@ -322,14 +323,14 @@ public final class ApkInfo {
|
||||
@NativeMethods
|
||||
interface Natives {
|
||||
void fillFields(
|
||||
String hostPackageName,
|
||||
String hostVersionCode,
|
||||
String hostPackageLabel,
|
||||
String packageVersionCode,
|
||||
String packageVersionName,
|
||||
String packageName,
|
||||
String resourcesVersion,
|
||||
String installerPackageName,
|
||||
@JniType("std::string") String hostPackageName,
|
||||
@JniType("std::string") String hostVersionCode,
|
||||
@JniType("std::string") String hostPackageLabel,
|
||||
@JniType("std::string") String packageVersionCode,
|
||||
@JniType("std::string") String packageVersionName,
|
||||
@JniType("std::string") String packageName,
|
||||
@JniType("std::string") String resourcesVersion,
|
||||
@JniType("std::string") String installerPackageName,
|
||||
boolean isDebugApp,
|
||||
int targetSdkVersion);
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ public final class DeviceInfo {
|
||||
@NativeMethods
|
||||
interface Natives {
|
||||
void fillFields(
|
||||
String gmsVersionCode,
|
||||
@JniType("std::string") String gmsVersionCode,
|
||||
boolean isTV,
|
||||
boolean isAutomotive,
|
||||
boolean isFoldable,
|
||||
|
@ -67,16 +67,17 @@ void PerfettoPlatform::ResetTaskRunner(
|
||||
// Note that we override the producer name for the mojo backend in ProducerHost,
|
||||
// and thus this only affects the producer name for the system backend.
|
||||
std::string PerfettoPlatform::GetCurrentProcessName() {
|
||||
const char* host_package_name = nullptr;
|
||||
#if BUILDFLAG(IS_ANDROID)
|
||||
host_package_name = android::apk_info::host_package_name();
|
||||
const std::string& host_package_name = android::apk_info::host_package_name();
|
||||
#else
|
||||
std::string host_package_name;
|
||||
#endif // BUILDFLAG(IS_ANDROID)
|
||||
|
||||
// On Android we want to include if this is webview inside of an app or
|
||||
// Android Chrome. To aid this we add the host_package_name to differentiate
|
||||
// the various apps and sources.
|
||||
std::string process_name;
|
||||
if (host_package_name) {
|
||||
if (!host_package_name.empty()) {
|
||||
process_name = StrCat(
|
||||
{process_name_prefix_, host_package_name, "-",
|
||||
NumberToString(trace_event::TraceLog::GetInstance()->process_id())});
|
||||
|
@ -165,8 +165,8 @@ class SandboxedHandler {
|
||||
restore_previous_handler_ =
|
||||
build_info->sdk_int() < base::android::SDK_VERSION_JELLY_BEAN_MR2 ||
|
||||
build_info->sdk_int() >= base::android::SDK_VERSION_OREO ||
|
||||
strcmp(build_info->build_type(), "eng") == 0 ||
|
||||
strcmp(build_info->build_type(), "userdebug") == 0;
|
||||
build_info->build_type() == "eng" ||
|
||||
build_info->build_type() == "userdebug";
|
||||
|
||||
bool signal_stack_initialized =
|
||||
CrashpadClient::InitializeSignalStackForThread();
|
||||
|
@ -51,13 +51,14 @@ bool AlwaysUseWideColorGamut() {
|
||||
|
||||
// As it takes some work to compute this, cache the result.
|
||||
static bool is_always_use_wide_color_gamut_enabled = [] {
|
||||
const char* current_model =
|
||||
const std::string& current_model =
|
||||
base::android::BuildInfo::GetInstance()->model();
|
||||
const std::array<std::string, 2> enabled_models = {
|
||||
std::string{"Pixel 4"}, std::string{"Pixel 4 XL"}};
|
||||
for (const std::string& model : enabled_models) {
|
||||
if (model == current_model)
|
||||
if (model == current_model) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -33,7 +33,7 @@ namespace features {
|
||||
namespace {
|
||||
|
||||
#if BUILDFLAG(IS_ANDROID)
|
||||
bool IsDeviceBlocked(const char* field, const std::string& block_list) {
|
||||
bool IsDeviceBlocked(const std::string& field, const std::string& block_list) {
|
||||
auto disable_patterns = base::SplitString(
|
||||
block_list, "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
||||
for (const auto& disable_pattern : disable_patterns) {
|
||||
|
@ -66,17 +66,18 @@ bool IsDeviceBlocked(std::string_view field, std::string_view block_list) {
|
||||
|
||||
int GetEMUIVersion() {
|
||||
const auto* build_info = base::android::BuildInfo::GetInstance();
|
||||
std::string_view manufacturer(build_info->manufacturer());
|
||||
|
||||
// TODO(crbug.com/40136096): check Honor devices as well.
|
||||
if (manufacturer != "HUAWEI")
|
||||
if (build_info->manufacturer() != "HUAWEI") {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Huawei puts EMUI version in the build version incremental.
|
||||
// Example: 11.0.0.130C00
|
||||
int version = 0;
|
||||
if (sscanf(build_info->version_incremental(), "%d.", &version) != 1)
|
||||
if (sscanf(build_info->version_incremental().c_str(), "%d.", &version) != 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
|
@ -42,9 +42,9 @@ void MetadataDataSource::WriteMetadata() {
|
||||
|
||||
#if BUILDFLAG(IS_ANDROID) && defined(OFFICIAL_BUILD)
|
||||
// Version code is only set for official builds on Android.
|
||||
const char* version_code_str =
|
||||
const std::string& version_code_str =
|
||||
base::android::BuildInfo::GetInstance()->package_version_code();
|
||||
if (version_code_str) {
|
||||
if (!version_code_str.empty()) {
|
||||
int version_code = 0;
|
||||
bool res = base::StringToInt(version_code_str, &version_code);
|
||||
DCHECK(res);
|
||||
|
@ -127,9 +127,9 @@ void TraceEventMetadataSource::WriteMetadataPacket(
|
||||
bool privacy_filtering_enabled) {
|
||||
#if BUILDFLAG(IS_ANDROID) && defined(OFFICIAL_BUILD)
|
||||
// Version code is only set for official builds on Android.
|
||||
const char* version_code_str =
|
||||
const std::string& version_code_str =
|
||||
base::android::BuildInfo::GetInstance()->package_version_code();
|
||||
if (version_code_str) {
|
||||
if (!version_code_str.empty()) {
|
||||
int version_code = 0;
|
||||
bool res = base::StringToInt(version_code_str, &version_code);
|
||||
DCHECK(res);
|
||||
|
@ -65,7 +65,7 @@ const base::FeatureParam<std::string>
|
||||
kPassthroughCommandDecoderBlockListByGPUVendorId{
|
||||
&kDefaultPassthroughCommandDecoder, "BlockListByGPUVendorId", ""};
|
||||
|
||||
bool IsDeviceBlocked(const char* field, const std::string& block_list) {
|
||||
bool IsDeviceBlocked(const std::string& field, const std::string& block_list) {
|
||||
auto disable_patterns = base::SplitString(
|
||||
block_list, "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
|
||||
for (const auto& disable_pattern : disable_patterns) {
|
||||
|
Reference in New Issue
Block a user