Android 客户端诊断

本文介绍如何在 Android 客户端中使用日志诊断服务。日志诊断在控制台下发任务时支持消息推送和数据同步双通道。

进行 Android 客户端诊断的步骤如下:

  1. 初始化诊断服务

  2. 写入诊断日志

  3. 在控制台拉取日志

前置条件

初始化诊断服务

诊断服务支持使用数据同步或消息推送通道拉取诊断日志,两种通道的初始方式不同。

使用消息推送通道

使用消息推送通道时,您需要在 App 启动后完成以下操作:

使用数据同步通道

使用数据同步通道时,您需要在 App 启动后调用以下方法,完成通道初始化。

// 设置 userId
MPLogger.setUserId(String userId);
// 初始化 Sync 通道,必须先设置 userId,否则会初始化失败
MPDiagnose.initSyncChannel(Context context);

写入诊断日志

客户端收到下发的诊断任务时,只有使用 mPaaS 的日志工具 MPLogger 写入的日志才会被上传,因此推荐您使用 MPLogger 代替 android.util.Log 写日志。MPLogger 提供和原生 Log 类似的日志级别方法:

void verbose(String tag, String msg);
void debug(String tag, String msg);
void info(String tag, String msg);
void warn(String tag, String msg);
void warn(String tag, Throwable t);
void warn(String tag, String msg, Throwable tr);
void error(String tag, String msg);
void error(String tag, Throwable t);
void error(String tag, String msg, Throwable t);
void print(String tag, String msg);
void print(String tag, Throwable t);

在通过 MPLogger 写入的日志中,debug 包会在 logcat 中显示;release 包不会在 logcat 中显示。诊断日志在设备上的存储目录为:

  • debug 包:/sdcard/[PackageName]/applog,当该目录无法写入时(例如应用 targetSdkVersion 大于等于 30),日志将写入 release 包的目录。

  • release 包:/data/data/[PackageName]/files/applog

在控制台拉取日志

您可以在控制台拉取使用 mPaaS 的日志工具打印的日志,从而快速便捷地分析 App 在指定机型或用户上出现的崩溃或异常问题。

步骤 1:创建日志拉取任务

  1. 进入 mPaaS 控制台,选择目标应用。

  2. 在左侧导航栏中,点击 移动分析 > 日志管理

  3. 拉取实时日志 标签页中,点击 添加 按钮。

  4. 填写任务信息。其中,用户 ID 为您的应用登录系统中用户的标识。通过 MPLogger.setUserId(String userId) 或消息推送上报用户 ID 的方法设置。

  5. 点击 确认 按钮,完成日志拉取任务创建。

步骤 2:触发日志拉取任务

  1. 在日志拉取任务列表中,找到刚刚创建的任务,选择 触发通道,然后点击 操作 列的 触发

  2. 稍等片刻刷新页面,若任务状态为:

    • 任务处理完成:点击 查看 按钮即可下载诊断日志。

    • 调用 Push/Sync 服务成功:表示已下发上传诊断日志的消息,但客户端还未收到或收到但未上传日志。 针对此情况,请确认您的 App 进程在系统中仍然存在;如果不存在请重启 App。如果重启后任务状态仍未变化,请参考下文进行初步排查。

问题排查

如果出现无法拉取到日志的问题,请根据所使用的诊断日志下发通道,按照对应的步骤进行排查。

使用消息推送通道

排查步骤如下:

  1. 进入 mPaaS 控制台 > 消息推送 页面,根据 userId 推送一条普通的消息到您的 App,确认消息推送通道畅通。

  2. 在消息推送通道畅通的情况下,先清空 logcat 日志,切换到 push 进程,然后在控制台诊断任务中再次点击 触发 按钮,观察 logcat 日志。

  3. 过滤 mPush14,观察是否收到诊断消息。若未收到,请确认推送通道是否已断开连接。 image.png

  4. 确认收到诊断消息后,可查找是否有以下日志,确认诊断消息是否被转发到 MonitorService。 若报错找不到ClientMonitorService,请使用 mPaaS 插件更新 SDK:

    • 10.1.32 基线请升级到 10.1.68,并更新组件到最新版本。

    • 10.1.60 或 10.1.68 基线请更新组件到最新版本。2

  5. 确认 MonitorService 启动后,过滤 AlipayLogUploader,查看本地是否存在诊断日志。如果出现以下日志,说明本地存在诊断日志可以上传。

    本地存在日志

    如果出现以下日志,说明不存在诊断日志。

    本地不存在日志

    若不存在诊断日志,请检查以下项目:

    • 控制台创建的拉取实时日志任务,选取的时间段不能少于 1 小时;在选取的时间段内 App 须运行且输出诊断日志。

    • App 声明并动态申请了以下权限:

      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. 确认本地存在诊断日志后,过滤 HttpUpload,查看日志上传是否成功,若 responseCode 为 200 则表示上传成功。 3

使用数据同步通道

排查步骤如下:

  1. 清空 logcat 日志,切换到主进程,初始化同步通道后,过滤 isConnected,观察同步通道建连是否成功。

  2. 在 mPaaS 控制台诊断任务中再次点击 触发 按钮,过滤 MPDiagnose,观察是否收到诊断消息,以及是否启动了MonitorService

    若未收到消息,请确认设置的 userId 和诊断任务中填写的 userId 是否一致;若报错找不到ClientMonitorService,请使用 mPaaS 插件更新 SDK:

    • 10.1.32 基线请升级到 10.1.68,并更新组件到最新版本。

    • 10.1.60 或 10.1.68 基线请更新组件到最新版本。

  3. 确认 MonitorService 启动后,切换到 push 进程,过滤 AlipayLogUploader,查看本地是否存在诊断日志。如果出现以下日志,说明本地存在诊断日志可以上传。如果出现以下日志,说明不存在诊断日志。

    请检查以下项目:

    • 控制台创建的拉取实时日志任务,选取的时间段不能少于 1 小时;在选取的时间段内 App 须运行且输出诊断日志。

    • App 声明并动态申请了以下权限:

      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  4. 确认本地存在诊断日志后,过滤 HttpUpload,查看日志上传是否成功,若 responseCode 为 200 则表示上传成功。