乐趣区

Flutter-Android-端集成-Bugly-的异常上报和升级功能

前提

Flutter 版本:1.17.0地址,别用最新版本或者比较老的版本。我之前使用 1.13.0 版本也会出现问题。
Dart版本:2.8.1使用 Flutter 中提供的版本
flutter_bugly package 地址


ok,在大版本相同的情况下。我能搞定的问题,你也没问题。
不多说了,打包这块真的是卡了好久 …

在 Bugly 官网注册

在官网注册一个 App,我这里只注册了 Android 渠道的。iOS 的不熟悉,所以以后再搞吧。
注册之后会拿到androidAppId,在初始化的时候填写即可。

集成上报功能

App 的线上问题收集有助于开发定位问题。而且还可以自定义上报功能,例如埋点数据上报。之前在开发 Android App 的时候集成过 Bugly。那么这里也就直接在Flutter App 中再集成一次。

Bugly提供了 flutter_bugly 包,我们直接使用即可。flutter_bugly package 地址

按照官方文档集成即可。
这里说一下注意事项。

  • 在项目配置中,如果支持全部的 SO 库架构,apk 的大小会增大两倍左右。但是不支持全部 SO 库架构,有可能会出现 flutter build apk失败的情况。
 defaultConfig {
        ndk {
            // 设置支持的 SO 库架构,apk 的大小会增大两倍左右
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }

如只支持 armeabi-v7a,打出来的apk 只有 5.6M 左右,下面是支持全部 so 库架构打出来的 apk 大小

  • 打包的时候根据不同的平台打不同的包
64-bit
flutter build apk --release --target-platform android-arm64

32-bit
flutter build apk --release --target-platform android-arm

问题

  • debug apk 包出现异常或者崩溃不会上报,所以只能打 release 包。我这边使用还会一分钟左右的延迟

集成升级功能

升级也是 App 必备的功能,这里为了快速验证升级效果,也是使用的 Bugly 提供的升级功能。

在官方文档中说明使用了 AndroidX 的话的自定义升级弹窗了。官方也给了一个示例,那么我们直接使用示例中的弹窗效果

实现

由于想快速实现升级功能,且考虑了每个手机必备浏览器,所以下载的操作直接使用浏览器来实现。

流程图大概如下:

实现的核心代码如下:

使用的也基本是 Bugly 提供的升级弹窗,跳转浏览器 使用的是【launchurl 库】


  void _checkUpdate(){if (Platform.isAndroid) {FlutterBugly.checkUpgrade();
      FlutterBugly.getUpgradeInfo().then((_info) {FlutterBugly.getUpgradeInfo().then((UpgradeInfo info) {if (info != null && info.id != null) {showUpdateDialog(info.versionName, info.newFeature, info.apkUrl);
          }else{ToastUtil.showBasicToast("暂未检测到新版本");
          }
        });
      });
    }
  }

  void showUpdateDialog(String versionName, String feature, String url) async {
    await showDialog(
      barrierDismissible: false,
      context: context,
      builder: (_) => _buildDialog(versionName,feature, url),
    );
  }

  Widget _buildDialog(String versionName, String feature, String url) {
    return new UpdateDialog(
      key:_dialogKey,
      version:versionName,
      feature:feature,
      onClickWhenDownload:(_msg) {
        //2. 提示不要重复下载
        print("--------- 提示不要重复下载 ---------${_msg}");
      },
      onClickWhenNotDownload:() {

        // 1. 直接使用浏览器下载
        _launchURL(url);
        // 2. 下个计划:本地下载
        // 下载 apk,完成后打开 apk 文件,建议使用 dio+open_file 插件
        print("--------- 下载 apk,完成后打开 apk 文件, 建议使用 dio+open_file 插件 ---------");
      },
    );
  }

  /// 跳转应用市场升级
  _launchURL(url) async {if (await canLaunch(url)) {await launch(url);
    } else {throw 'Could not launch $url';}
  }

问题

  • UpgradeInfo经常会返回null,多试几次。
  • 上传 bugly 的 apk 的版本号一定要大于本地 apk 的版本号才能升级。


源码

  • Flutter-WanAndroid
退出移动版