Commit 53410c06 authored by Egor Pasko's avatar Egor Pasko Committed by Commit Bot

Revert "android: Launch Crashpad with /system/bin/linker on Q"

This reverts commit 54c5c662.

Reason for revert: http://crbug.com/935973, apk merging fails with:

ApkMergeFailure: Files don't match expectations:
  unexpected files: set(['libcrashpad_handler_trampoline.so'])

Original change's description:
> android: Launch Crashpad with /system/bin/linker on Q
> 
> This adds a small executable, libcrashpad_handler_trampoline.so, to
> Monochrome, Trichrome, and SystemWebView. The trampoline loads the
> remaining Crashpad handler code from the main native library, which
> must export `CrashpadHandlerMain()`.
> 
> All three packages will continue to use /system/bin/app_process to
> launch Crashpad on P-.
> 
> Note on static_initializers.gni:
> 
> There aren't any real, new static initializers. The increased count is
> due to the addition of the new object. Static initializers are counted
> by measuring the size of each object's .init_array and dividing by the
> object's pointer size. libcrashpad_handler_trampoline.so has two
> invalid slots which are ignored by the loader:
> 
> readelf -x .init_array libcrashpad_handler_trampoline.so
> 
> Hex dump of section '.init_array':
>   0x00001008 ffffffff 00000000
> 
> Bug: 928422
> Change-Id: Iba56cd6feda73ebc91f6758724d823e48b5c6e8f
> Reviewed-on: https://chromium-review.googlesource.com/c/1454078
> Reviewed-by: Richard Coles <torne@chromium.org>
> Reviewed-by: Mark Mentovai <mark@chromium.org>
> Reviewed-by: Andrew Grieve <agrieve@chromium.org>
> Commit-Queue: Joshua Peraza <jperaza@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#635269}

TBR=torne@chromium.org,agrieve@chromium.org,jperaza@chromium.org,mark@chromium.org

Change-Id: If4048a343ab12dd0b5af6747b2633de79db5ddd7
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 928422
Reviewed-on: https://chromium-review.googlesource.com/c/1489193Reviewed-by: default avatarEgor Pasko <pasko@chromium.org>
Commit-Queue: Egor Pasko <pasko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635510}
parent 9173cd3d
...@@ -32,18 +32,8 @@ template("system_webview_apk_tmpl") { ...@@ -32,18 +32,8 @@ template("system_webview_apk_tmpl") {
if (!_use_trichrome_library) { if (!_use_trichrome_library) {
shared_libraries = [ "//android_webview:libwebviewchromium" ] shared_libraries = [ "//android_webview:libwebviewchromium" ]
deps += [
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
if (build_apk_secondary_abi && android_64bit_target_cpu) { if (build_apk_secondary_abi && android_64bit_target_cpu) {
secondary_abi_shared_libraries = [ "//android_webview:libwebviewchromium($android_secondary_abi_toolchain)" ] secondary_abi_shared_libraries = [ "//android_webview:libwebviewchromium($android_secondary_abi_toolchain)" ]
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
deps += [ _trampoline ]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules =
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
} }
} else { } else {
uncompress_shared_libraries = true uncompress_shared_libraries = true
...@@ -52,11 +42,6 @@ template("system_webview_apk_tmpl") { ...@@ -52,11 +42,6 @@ template("system_webview_apk_tmpl") {
# architecture. # architecture.
if (android_64bit_target_cpu) { if (android_64bit_target_cpu) {
shared_libraries = [ "//android_webview:monochrome" ] shared_libraries = [ "//android_webview:monochrome" ]
deps += [
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
if (build_apk_secondary_abi) { if (build_apk_secondary_abi) {
secondary_native_lib_placeholders = [ "libdummy.so" ] secondary_native_lib_placeholders = [ "libdummy.so" ]
} }
......
...@@ -75,8 +75,7 @@ BuildInfo::BuildInfo(const std::vector<std::string>& params) ...@@ -75,8 +75,7 @@ BuildInfo::BuildInfo(const std::vector<std::string>& params)
firebase_app_id_(StrDupParam(params, 18)), firebase_app_id_(StrDupParam(params, 18)),
custom_themes_(StrDupParam(params, 19)), custom_themes_(StrDupParam(params, 19)),
resources_version_(StrDupParam(params, 20)), resources_version_(StrDupParam(params, 20)),
extracted_file_suffix_(params[21]), extracted_file_suffix_(params[21]) {}
is_at_least_q_(GetIntParam(params, 22)) {}
// static // static
BuildInfo* BuildInfo::GetInstance() { BuildInfo* BuildInfo::GetInstance() {
......
...@@ -122,8 +122,6 @@ class BASE_EXPORT BuildInfo { ...@@ -122,8 +122,6 @@ class BASE_EXPORT BuildInfo {
return sdk_int_; return sdk_int_;
} }
bool is_at_least_q() const { return is_at_least_q_; }
private: private:
friend struct BuildInfoSingletonTraits; friend struct BuildInfoSingletonTraits;
...@@ -156,7 +154,6 @@ class BASE_EXPORT BuildInfo { ...@@ -156,7 +154,6 @@ class BASE_EXPORT BuildInfo {
const char* const resources_version_; const char* const resources_version_;
// Not needed by breakpad. // Not needed by breakpad.
const std::string extracted_file_suffix_; const std::string extracted_file_suffix_;
const bool is_at_least_q_;
DISALLOW_COPY_AND_ASSIGN(BuildInfo); DISALLOW_COPY_AND_ASSIGN(BuildInfo);
}; };
......
...@@ -57,29 +57,13 @@ public class BuildInfo { ...@@ -57,29 +57,13 @@ public class BuildInfo {
BuildInfo buildInfo = getInstance(); BuildInfo buildInfo = getInstance();
String hostPackageName = ContextUtils.getApplicationContext().getPackageName(); String hostPackageName = ContextUtils.getApplicationContext().getPackageName();
return new String[] { return new String[] {
Build.BRAND, Build.BRAND, Build.DEVICE, Build.ID, Build.MANUFACTURER, Build.MODEL,
Build.DEVICE, String.valueOf(Build.VERSION.SDK_INT), Build.TYPE, Build.BOARD, hostPackageName,
Build.ID, String.valueOf(buildInfo.hostVersionCode), buildInfo.hostPackageLabel,
Build.MANUFACTURER, buildInfo.packageName, String.valueOf(buildInfo.versionCode), buildInfo.versionName,
Build.MODEL, buildInfo.androidBuildFingerprint, buildInfo.gmsVersionCode,
String.valueOf(Build.VERSION.SDK_INT), buildInfo.installerPackageName, buildInfo.abiString, BuildConfig.FIREBASE_APP_ID,
Build.TYPE, buildInfo.customThemes, buildInfo.resourcesVersion, buildInfo.extractedFileSuffix,
Build.BOARD,
hostPackageName,
String.valueOf(buildInfo.hostVersionCode),
buildInfo.hostPackageLabel,
buildInfo.packageName,
String.valueOf(buildInfo.versionCode),
buildInfo.versionName,
buildInfo.androidBuildFingerprint,
buildInfo.gmsVersionCode,
buildInfo.installerPackageName,
buildInfo.abiString,
BuildConfig.FIREBASE_APP_ID,
buildInfo.customThemes,
buildInfo.resourcesVersion,
buildInfo.extractedFileSuffix,
isAtLeastQ() ? "1" : "0",
}; };
} }
......
...@@ -208,7 +208,7 @@ def _AddNativeLibraries(out_apk, native_libs, android_abi, uncompress): ...@@ -208,7 +208,7 @@ def _AddNativeLibraries(out_apk, native_libs, android_abi, uncompress):
if (uncompress and os.path.splitext(basename)[1] == '.so' if (uncompress and os.path.splitext(basename)[1] == '.so'
and 'android_linker' not in basename and 'android_linker' not in basename
and (not has_crazy_linker or 'clang_rt' not in basename) and (not has_crazy_linker or 'clang_rt' not in basename)
and (not has_crazy_linker or 'crashpad_handler' not in basename)): and 'crashpad_handler' not in basename):
compress = False compress = False
# Add prefix to prevent android install from extracting upon install. # Add prefix to prevent android install from extracting upon install.
if has_crazy_linker: if has_crazy_linker:
......
...@@ -42,9 +42,7 @@ def main(): ...@@ -42,9 +42,7 @@ def main():
options = parser.parse_args() options = parser.parse_args()
# JNI_OnLoad is always exported. # JNI_OnLoad is always exported.
# CrashpadHandlerMain() is the entry point to the Crashpad handler, required symbol_list = ['JNI_OnLoad']
# for libcrashpad_handler_trampoline.so.
symbol_list = ['CrashpadHandlerMain', 'JNI_OnLoad']
if options.export_java_symbols: if options.export_java_symbols:
symbol_list.append('Java_*') symbol_list.append('Java_*')
......
...@@ -348,30 +348,6 @@ template("monochrome_public_common_apk_or_module_tmpl") { ...@@ -348,30 +348,6 @@ template("monochrome_public_common_apk_or_module_tmpl") {
if (!defined(deps)) { if (!defined(deps)) {
deps = [] deps = []
} }
if (!defined(loadable_modules)) {
loadable_modules = []
}
if (!defined(secondary_abi_loadable_modules)) {
secondary_abi_loadable_modules = []
}
if (!is_trichrome) {
deps += [
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules += [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
if (android_64bit_target_cpu && build_apk_secondary_abi &&
(!defined(invoker.is_64_bit_browser) || !invoker.is_64_bit_browser ||
invoker.include_32_bit_webview)) {
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
deps += [ _trampoline ]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules +=
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
}
}
deps += [ deps += [
"//chrome/android:chrome_public_non_pak_assets", "//chrome/android:chrome_public_non_pak_assets",
"//components/crash/android:handler_java", "//components/crash/android:handler_java",
...@@ -427,11 +403,11 @@ template("monochrome_public_common_apk_or_module_tmpl") { ...@@ -427,11 +403,11 @@ template("monochrome_public_common_apk_or_module_tmpl") {
# We store this as a separate .so in the APK and only load as needed. # We store this as a separate .so in the APK and only load as needed.
if (android_64bit_target_cpu && build_apk_secondary_abi) { if (android_64bit_target_cpu && build_apk_secondary_abi) {
secondary_abi_loadable_modules += [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ] secondary_abi_loadable_modules = [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ]
} else if (android_64bit_target_cpu && !build_apk_secondary_abi) { } else if (android_64bit_target_cpu && !build_apk_secondary_abi) {
loadable_modules += [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ] loadable_modules = [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ]
} else { } else {
loadable_modules += [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ] loadable_modules = [ "$root_gen_dir/third_party/android_deps/com_google_ar_core_java/jni/armeabi-v7a/libarcore_sdk_c.so" ]
} }
} }
} }
......
...@@ -13,8 +13,8 @@ if (current_toolchain == default_toolchain && ...@@ -13,8 +13,8 @@ if (current_toolchain == default_toolchain &&
(!is_debug && !using_sanitizer && proprietary_codecs)) { (!is_debug && !using_sanitizer && proprietary_codecs)) {
# Define expectations only for target_cpu covered by trybots. # Define expectations only for target_cpu covered by trybots.
if (target_cpu == "arm") { if (target_cpu == "arm") {
expected_static_initializer_count = 6 expected_static_initializer_count = 4
} else if (target_cpu == "arm64") { } else if (target_cpu == "arm64") {
expected_static_initializer_count = 5 expected_static_initializer_count = 3
} }
} }
...@@ -82,19 +82,9 @@ template("trichrome_library_apk_tmpl") { ...@@ -82,19 +82,9 @@ template("trichrome_library_apk_tmpl") {
if (build_apk_secondary_abi) { if (build_apk_secondary_abi) {
secondary_abi_shared_libraries = secondary_abi_shared_libraries =
[ "//chrome/android:monochrome_secondary_abi_lib" ] [ "//chrome/android:monochrome_secondary_abi_lib" ]
_trampoline = "//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline($android_secondary_abi_toolchain)"
deps += [ _trampoline ]
_secondary_out_dir = get_label_info(_trampoline, "root_out_dir")
secondary_abi_loadable_modules =
[ "$_secondary_out_dir/libcrashpad_handler_trampoline.so" ]
} }
} else { } else {
shared_libraries = [ "//chrome/android:monochrome" ] shared_libraries = [ "//chrome/android:monochrome" ]
deps += [
"//third_party/crashpad/crashpad/handler:crashpad_handler_trampoline",
]
loadable_modules = [ "$root_out_dir/libcrashpad_handler_trampoline.so" ]
} }
if (!is_java_debug) { if (!is_java_debug) {
......
...@@ -66,10 +66,7 @@ static_library("app") { ...@@ -66,10 +66,7 @@ static_library("app") {
} }
if (is_android) { if (is_android) {
deps += [ deps += [ "//components/crash/android:jni_headers" ]
"//components/crash/android:jni_headers",
"//third_party/crashpad/crashpad/handler",
]
} }
if (is_android || is_linux) { if (is_android || is_linux) {
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#include "components/crash/content/app/crashpad.h" #include "components/crash/content/app/crashpad.h"
#include <dlfcn.h>
#include <string.h> #include <string.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
...@@ -247,33 +246,6 @@ void SetBuildInfoAnnotations(std::map<std::string, std::string>* annotations) { ...@@ -247,33 +246,6 @@ void SetBuildInfoAnnotations(std::map<std::string, std::string>* annotations) {
} }
} }
// Constructs paths to a handler trampoline executable and a library exporting
// the symbol `CrashpadHandlerMain()`. This requires this function to be built
// into the same object exporting this symbol and the handler trampoline is
// adjacent to it.
bool GetHandlerTrampoline(std::string* handler_trampoline,
std::string* handler_library) {
Dl_info info;
if (dladdr(reinterpret_cast<void*>(&GetHandlerTrampoline), &info) == 0) {
return false;
}
std::string local_handler_library(info.dli_fname);
size_t libdir_end = local_handler_library.rfind('/');
if (libdir_end == std::string::npos) {
return false;
}
std::string local_handler_trampoline(local_handler_library, 0,
libdir_end + 1);
local_handler_trampoline += "libcrashpad_handler_trampoline.so";
handler_trampoline->swap(local_handler_trampoline);
handler_library->swap(local_handler_library);
return true;
}
#if defined(__arm__) && defined(__ARM_ARCH_7A__) #if defined(__arm__) && defined(__ARM_ARCH_7A__)
#define CURRENT_ABI "armeabi-v7a" #define CURRENT_ABI "armeabi-v7a"
#elif defined(__arm__) #elif defined(__arm__)
...@@ -309,8 +281,7 @@ void MakePackagePaths(std::string* classpath, std::string* libpath) { ...@@ -309,8 +281,7 @@ void MakePackagePaths(std::string* classpath, std::string* libpath) {
// Copies and extends the current environment with CLASSPATH and LD_LIBRARY_PATH // Copies and extends the current environment with CLASSPATH and LD_LIBRARY_PATH
// set to library paths in the APK. // set to library paths in the APK.
bool BuildEnvironmentWithApk(bool use_64_bit, bool BuildEnvironmentWithApk(std::vector<std::string>* result) {
std::vector<std::string>* result) {
DCHECK(result->empty()); DCHECK(result->empty());
std::string classpath; std::string classpath;
...@@ -328,12 +299,6 @@ bool BuildEnvironmentWithApk(bool use_64_bit, ...@@ -328,12 +299,6 @@ bool BuildEnvironmentWithApk(bool use_64_bit,
env->GetVar(kLdLibraryPathVar, &current_library_path); env->GetVar(kLdLibraryPathVar, &current_library_path);
library_path += ":" + current_library_path; library_path += ":" + current_library_path;
static constexpr char kRuntimeRootVar[] = "ANDROID_RUNTIME_ROOT";
std::string runtime_root;
if (env->GetVar(kRuntimeRootVar, &runtime_root)) {
library_path += ":" + runtime_root + (use_64_bit ? "/lib64" : "/lib");
}
result->push_back("CLASSPATH=" + classpath); result->push_back("CLASSPATH=" + classpath);
result->push_back("LD_LIBRARY_PATH=" + library_path); result->push_back("LD_LIBRARY_PATH=" + library_path);
for (char** envp = environ; *envp != nullptr; ++envp) { for (char** envp = environ; *envp != nullptr; ++envp) {
...@@ -449,19 +414,6 @@ bool SetLdLibraryPath(const base::FilePath& lib_path) { ...@@ -449,19 +414,6 @@ bool SetLdLibraryPath(const base::FilePath& lib_path) {
} }
class HandlerStarter { class HandlerStarter {
#if defined(OS_ANDROID)
// TODO(jperaza): Currently only launching a same-bitness handler is
// supported. The logic to build package paths, locate a handler executable,
// and the crashpad client interface for launching a Java handler need to be
// updated to use a specified bitness before a cross-bitness handler can be
// used.
#if defined(ARCH_CPU_64_BITS)
static constexpr bool kUse64Bit = true;
#else
static constexpr bool kUse64Bit = false;
#endif
#endif // OS_ANDROID
public: public:
static HandlerStarter* Get() { static HandlerStarter* Get() {
static HandlerStarter* instance = new HandlerStarter(); static HandlerStarter* instance = new HandlerStarter();
...@@ -491,35 +443,25 @@ class HandlerStarter { ...@@ -491,35 +443,25 @@ class HandlerStarter {
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
if (!base::PathExists(handler_path)) { if (!base::PathExists(handler_path)) {
// The linker doesn't support loading executables passed on its command use_java_handler_ = true;
// line until Q.
if (base::android::BuildInfo::GetInstance()->is_at_least_q()) {
bool found_library =
GetHandlerTrampoline(&handler_trampoline_, &handler_library_);
DCHECK(found_library);
} else {
use_java_handler_ = true;
}
} }
if (!dump_at_crash) { if (!dump_at_crash) {
return database_path; return database_path;
} }
if (use_java_handler_ || !handler_trampoline_.empty()) { if (use_java_handler_) {
std::vector<std::string> env; std::vector<std::string> env;
if (!BuildEnvironmentWithApk(kUse64Bit, &env)) { if (!BuildEnvironmentWithApk(&env)) {
return database_path; return database_path;
} }
bool result = use_java_handler_ // TODO(jperaza): The logic for constructing an appropriate
? GetCrashpadClient().StartJavaHandlerAtCrash( // CLASSPATH/LD_LIBRARY_PATH won't work for Android Q+. The handler will
kCrashpadJavaMain, &env, database_path, // need to be launched by executing the dynamic linker instead.
metrics_path, url, process_annotations, arguments) bool result = GetCrashpadClient().StartJavaHandlerAtCrash(
: GetCrashpadClient().StartHandlerWithLinkerAtCrash( kCrashpadJavaMain, &env, database_path, metrics_path, url,
handler_trampoline_, handler_library_, kUse64Bit, process_annotations, arguments);
&env, database_path, metrics_path, url,
process_annotations, arguments);
DCHECK(result); DCHECK(result);
return database_path; return database_path;
} }
...@@ -559,21 +501,18 @@ class HandlerStarter { ...@@ -559,21 +501,18 @@ class HandlerStarter {
} }
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
if (use_java_handler_ || !handler_trampoline_.empty()) { if (use_java_handler_) {
std::vector<std::string> env; std::vector<std::string> env;
if (!BuildEnvironmentWithApk(kUse64Bit, &env)) { if (!BuildEnvironmentWithApk(&env)) {
return false; return false;
} }
bool result = // TODO(jperaza): The logic for constructing an appropriate
use_java_handler_ // CLASSPATH/LD_LIBRARY_PATH won't work for Android Q+. The handler will
? GetCrashpadClient().StartJavaHandlerForClient( // need to be launched by executing the dynamic linker instead.
kCrashpadJavaMain, &env, database_path, metrics_path, url, bool result = GetCrashpadClient().StartJavaHandlerForClient(
process_annotations, arguments, fd) kCrashpadJavaMain, &env, database_path, metrics_path, url,
: GetCrashpadClient().StartHandlerWithLinkerForClient( process_annotations, arguments, fd);
handler_trampoline_, handler_library_, kUse64Bit, &env,
database_path, metrics_path, url, process_annotations,
arguments, fd);
return result; return result;
} }
#endif #endif
...@@ -593,8 +532,6 @@ class HandlerStarter { ...@@ -593,8 +532,6 @@ class HandlerStarter {
crashpad::SanitizationInformation browser_sanitization_info_; crashpad::SanitizationInformation browser_sanitization_info_;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
std::string handler_trampoline_;
std::string handler_library_;
bool use_java_handler_ = false; bool use_java_handler_ = false;
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment