Flutter bugly 傻瓜式操作,上传崩溃日志与符号表解析之Android

1.在 bugly 官网创建应用

 此处不表并附上官网地址 腾讯Bugly - 一种愉悦的开发方式 _android anr_android anr分析_iOS崩溃日志分析平台

    

2.创建完应用后,先对接 android sdk   在 flutter/android/app/build.gradle 文件中

android { 

    defaultConfig { 

        ndk { 

            // 设置支持的SO库架构 

            abiFilters 'armeabi’ 

            //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a’ 

       } 

    } 

} 

dependencies { 

    implementation 'com.tencent.bugly:crashreport:latest.release’ 

    //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如4.0.3

}

3.代码集成

通过“AndroidManifest.xml”配置后的初始化方法如下:

CrashReport.initCrashReport(getApplicationContext());

4.在 flutter main 文件中改造 app 入口,用于拦截所有错误(包括非崩溃 bug),然后手动上报给bugly

main() {

  AppCatchError().run(App());

}

//全局异常的捕捉

class AppCatchError {

  run(Widget app) {

    // Flutter 框架异常

    FlutterError.onError = (FlutterErrorDetails details) async {

      // 线上环境

      Map map = {};

      map["error"] = details.toString();

      MethodManager.invokeCatchedException(map);

      if (kReleaseMode) {

        Zone.current.handleUncaughtError(details.exception, details.stack!);

      } else {

        // 开发期间 print

        FlutterError.dumpErrorToConsole(details);

      }

      if (EasyLoading.isShow) {

        EasyLoading.dismiss();

      }

      logger.e(details.toString());

    };

    runZonedGuarded(() {

      // 受保护的代码块

      runApp(app);

    }, (error, stack) => catchError(error, stack));

  }

  ///对搜集的 异常进行处理  上报等等

  catchError(Object error, StackTrace stack) {

    logger.e('错误 message:$error,stack: $stack');

    Map map = {};

    map["error"] = "$error########################### stack$stack”;

    // 此处为 flutter 与原生交互 将 error 传给原生 

    MethodManager.invokeCatchedException(map);

    if (EasyLoading.isShow) {

      EasyLoading.dismiss();

    }

  }

}
原生中接收的代码

if (methodCall.method.equals("postCatchedException")) {

    // 错误日志上传bugly

    String error = methodCall.argument("error");

    CrashReport.postCatchedException(new Throwable(error));

}

此处如果不知道怎么跟原生交互,可以看我其他文章 有详细说明

到这个地方日志上报就完成了,但是这时候会发现 flutter 相关的错误在 bugly 上会是一些特殊符号无法解析出来 就需要解析符号表

5.在 bugly 官网找到符号表相关栏目

6.下载符号表工具(这里下载对应版本的符号表工具)

7.通过文档找到符号表工具使用的方法

java -jar buglyqq-upload-symbol.jar -appid <bugly应用的appid> -appkey <bugly应用的appkey> -bundleid <android app 的包名> -version <android app 的版本> -platform Android -inputSymbol <下载下来的符号表>

8.接下来就是把命令行需要的这些东西都找出来

appid和appkey都是在 buylg 官网第一步创建的应用中可以获取

bundleid在 flutter/android/app/build.gradle文件下的applicationId

version 同上面目录下的versionName

inputSymbol 获取就比较麻烦 在下一步操作

9.先通过命令行获取Engine的 id

10.在flutter_infra中下载对应的符号表解析对照文件

附上地址 https://console.cloud.google.com/storage/browser/flutter_infra_release/flutter;tab=objects?prefix=&forceOnObjectsSortingFiltering=false

11.内容太多 将9 步获取的 id  b20183e040筛选一下 ,就找到对应的符号表了

12.根据实际情况下载对应的包(不知道怎么下载的,看第二步如果配置的是armeabi那就下载第二个,以此类推)

13.下载里面解压出 symbols.zip,就会解压出libflutter.so文件,他就是需要的inputSymbol了

14.最终将刚才获取的那些东西替换成下面然后执行即可

java -jar buglyqq-upload-symbol.jar -appid *** -appkey *** -bundleid *** -version *** -platform Android -inputSymbol /Users/***/Downloads/libflutter.so

15.命令行成功的界面

这样就 ok 了 然后你再去 bugly 的日志上报上面看就能看到 正常的 flutter 的日志了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FlutterAndroid的交互可以通过平台通道(platform channel)来实现。平台通道允许Flutter应用程序与原生Android代码之间进行双向通信。 以下是使用平台通道进行FlutterAndroid交互的一般步骤: 1. 在Flutter应用程序中,使用`flutter create`命令创建一个新的Flutter项目,或者在现有项目中添加一个新的Android模块。 2. 在Flutter应用程序中创建一个`MethodChannel`对象,该对象用于在FlutterAndroid之间进行方法调用通信。例如,在Dart代码中添加以下代码: ```dart import 'package:flutter/services.dart'; // 创建 MethodChannel 对象 MethodChannel channel = MethodChannel('com.example.channelName'); // 在需要的地方调用原生 Android 方法 Future<void> callNativeMethod() async { try { final String result = await channel.invokeMethod('methodName'); print(result); } catch (e) { print('Error: $e'); } } ``` 3. 在Android项目中,创建一个类来处理来自Flutter应用程序的方法调用。例如,在Java代码中添加以下代码: ```java import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; public class MainActivity extends FlutterActivity { private static final String CHANNEL = "com.example.channelName"; @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); // 注册方法调用处理器 new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) .setMethodCallHandler(new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("methodName")) { // 处理来自Flutter的方法调用 String response = someNativeMethod(); result.success(response); } else { result.notImplemented(); } } }); } // 原生 Android 方法的实现 private String someNativeMethod() { // 实现自己的逻辑 return "Response from Android"; } } ``` 在上述代码中,我们首先定义了一个与Flutter应用程序通信的通道名称(CHANNEL),然后注册了一个方法调用处理器。当Flutter应用程序调用`methodName`方法时,处理器将调用`someNativeMethod`方法并返回响应。 4. 最后,您可以在Flutter应用程序中调用`callNativeMethod`方法,这将触发与Android的交互,并返回来自Android的响应。 请注意,上述代码只是示例,并且可以根据您的需求进行修改和扩展。此外,您还可以使用平台通道传递参数和接收回调,以实现更复杂的交互逻辑。 这是使用平台通道在FlutterAndroid之间进行基本交互的基本步骤。希望对您有所帮助!如果有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值