18

有人使用Google Breakpad for Android 本机代码 (NDK) 吗?

如果是这样,您能否详细说明如何启动和运行它(即客户端)。文档非常有限,根本没有提到 Android。构建系统包含 android 信息,但这让我认为它不应该是一个问题。

4

3 回答 3

9

很抱歉,我做了最初的移植,但我并没有真正记录任何东西。然而,其中一位 Chrome 工程师在端口上做了一些工作并编写了一个非常好的 README: https ://chromium.googlesource.com/breakpad/breakpad/+/master/README.ANDROID

现在还有一个与 NDK 兼容的 Android.mk 文件,因此如果您使用的是标准 NDK 构建系统,那么合并 Breakpad 应该很简单。

于 2012-09-25T00:46:54.967 回答
1

我还为此找到了一个很好的示例项目。就像在项目中一样,您可以像这样设置 Google Breakpad:

extern "C" {
    void Java_com_pluusystem_breakpadjavacall_MainActivity_initNative(JNIEnv* env, jobject obj, jstring filepath)
    {
        const char *path = env->GetStringUTFChars(filepath, 0);
        google_breakpad::MinidumpDescriptor descriptor(path);
        exceptionHandler = new google_breakpad::ExceptionHandler(descriptor, NULL, DumpCallback, NULL, true, -1);
    }
}

在 cpp 方面,例如:

    // Save Dump Path
    initNative(getExternalCacheDir().getAbsolutePath());

在java端。

在实现该bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded)功能之后,您将能够在应用程序崩溃之前做一些事情。

我经历过并且也发现了这个问题,这证实了我,在这个函数中,你不能在 DVM 下的 ART 下执行 java 回调(在 android 5 - Lollipop 之前)。

于 2016-03-04T08:53:29.267 回答
0

我的 Flutter Android/iOS 示例仓库:https ://github.com/Sunbreak/flutter-breakpad.trial


安卓

$NDK 是您的 Android NDK 目录的本地路径

$CLI_BREAKPAD 是https://github.com/Sunbreak/cli-breakpad.trial的本地克隆

cd $BREAKPAD/src/android
cp -r google_breakpad jni
$NDK/ndk-build
  • 安装libbreakpad_client.a所有架构
mkdir -p ./android/app/src/main/cmakeLibs
cp -r $BREAKPAD/src/android/obj/local/* ./android/app/src/main/cmakeLibs/
  • 在 macOS/Linux 上运行
# Device/emulator connected
$ android_abi=`adb shell getprop ro.product.cpu.abi`
$ flutter run
✓ Built build/app/outputs/flutter-apk/app-debug.apk.
I/flutter_breakpad(31631): JNI_OnLoad
D/flutter_breakpad(31631): Dump path: /data/data/com.example.flutter_breakpad/files/f5258c0e-eff3-433a-7ea47880-c756fc17.dmp
$ adb shell "run-as com.example.flutter_breakpad sh -c 'cat /data/data/com.example.flutter_breakpad/files/f5258c0e-eff3-433a-7ea47880-c756fc17.dmp'" >| libflutter-breakpad.so.dmp
$ $CLI_BREAKPAD/breakpad/linux/$(arch)/dump_syms build/app/intermediates/cmake/debug/obj/${android_abi}/libflutter-breakpad.so > libflutter-breakpad.so.sym
$ uuid=`awk 'FNR==1{print \$4}' libflutter-breakpad.so.sym`
$ mkdir -p symbols/libflutter-breakpad.so/$uuid/
$ mv ./libflutter-breakpad.so.sym symbols/libflutter-breakpad.so/$uuid/
$ $CLI_BREAKPAD/breakpad/linux/$(arch)/minidump_stackwalk libflutter-breakpad.so.dmp symbols/ > libflutter-breakpad.so.log
于 2021-10-20T02:58:07.700 回答