一、简介

在阅读本文档前,建议先初步预览一下 CrashSDK API 文档目录部分;在下面的接入步骤中,涉及到具体的 API 时,再去查看相关 API 的详细说明即可。

接入步骤可参考 CrashSDK 提供的 demo 或者 testshell 示例程序代码,点此下载最新的 CrashSDK 库文件及示例代码。

下面是下载得到的压缩包中主要目录及文件的简介:

  1. crashsdk-x.x.x.x-release.zip
  2. ├── demo/ 1. demo.apk Android Studio 工程的源码
  3. ├── app/
  4. ├── build.gradle
  5. ├── libs/
  6. ├── crashsdk.jar sdk java
  7. ├── armeabi/libcrashsdk.so arm v5 CPU 架构下的 sdk native
  8. ├── armeabi-v7a/libcrashsdk.so arm v7 CPU 架构下的 sdk native
  9. ├── arm64-v8a/libcrashsdk.so arm64 CPU 架构下的 sdk native
  10. ├── x86/libcrashsdk.so x86 CPU 架构下的 sdk native
  11. └── x86_64/libcrashsdk.so x86_64 CPU 架构下的 sdk native
  12. └── src/main/
  13. ├── AndroidManifest.xml
  14. └── java/com/uc/crashsdk/demo/ 接入示例源码
  15. └── build.gradle
  16. ├── demo.apk 使用 demo 工程预编译的 demo.apk
  17. ├── testshell/ 2. testshell.apk Android Studio 工程的源码
  18. ├── app/
  19. ├── build.gradle
  20. ├── libs/
  21. ├── crashsdk.jar sdk java
  22. ├── armeabi/libcrashsdk.so arm v5 CPU 架构下的 sdk native
  23. ├── armeabi-v7a/libcrashsdk.so arm v7 CPU 架构下的 sdk native
  24. ├── arm64-v8a/libcrashsdk.so arm64 CPU 架构下的 sdk native
  25. ├── x86/libcrashsdk.so x86 CPU 架构下的 sdk native
  26. └── x86_64/libcrashsdk.so x86_64 CPU 架构下的 sdk native
  27. └── src/main/
  28. ├── AndroidManifest.xml
  29. ├── cpp/ native API 使用示例
  30. ├── include/crashsdk.h
  31. ├── jni/
  32. └── JNIRegisterTest.cpp
  33. └── java/com/uc/crashsdk/test/ 接入示例源码
  34. ├── MainActivity.java
  35. ├── MyApplication.java
  36. ├── SandboxService.java Isolated Service 示例
  37. ├── CrashWrapperSelector.java 通过改变 import CrashWrapper 类,以选择下面不同的示例 Wrapper
  38. ├── logs_only/CrashWrapper.java 1. 仅生成 java native 日志的示例
  39. ├── min_dependence/CrashWrapper.java 2. 最小依赖示例(仅需 import CrashApi 一个类)
  40. ├── native_api/CrashWrapper.java 3. native API 使用示例
  41. └── standard/CrashWrapper.java 4. 标准示例
  42. └── build.gradle
  43. └── testshell.apk 使用 testshell 工程预编译的 testshell.apk

具体的接入步骤见下文。

二、准备工作

1. 自动集成(推荐)

CrashSDK支持Maven中央仓库,如果您使用Gradle编译,我们强烈推荐您使用

  • SDK(Java)+NDK(C/C++):com.ucweb.wpk:crashsdk

  • SDK(Java):com.ucweb.wpk:crashsdk-java

集成SDK+NDK

  1. dependencies {
  2. compile 'com.ucweb.wpk:crashsdk:latest.release'
  3. }

仅集成SDK

  1. dependencies {
  2. compile 'com.ucweb.wpk:crashsdk-java:latest.release'
  3. }

2. 手工集成

  • 请您先下载章节一:简介中提供的SDK

  • 如果只生成 java 崩溃日志,只需要将 crashsdk-x.x.x.x-release/demo/app/libs/crashsdk.jar 文件复制到自己项目的 libs 目录下。

  • 如果要生成 Native(C/C++) 崩溃日志,除复制 crashsdk.jar 外,还需要将发布对应的 CPU 架构的SO库 (crashsdk-x.x.x.x-release/demo/app/libs/$arch/libcrashsdk.so) 复制到自己项目的 $PROJECT/app/libs/$arch/ 目录下,例如:

  • 如果当前编译的 apk 只给 arm 的机器使用,则可仅复制 libs/armeabi/libcrashsdk.so 或 libs/armeabi-v7a/libcrashsdk.so

  • 如果只给 x86 的机器使用,则可仅复制 libs/x86/libcrashsdk.so

  • 若想同时给 arm 和 x86 的机器使用,则两者需要都分别复制

3. 权限配置

请在 AndroidManifest.xml 文件中加上如下权限申明:

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.uc.crashsdk.demo">
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  4. <uses-permission android:name="android.permission.READ_LOGS" />
  5. <uses-permission android:name="android.permission.INTERNET" />
  6. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  7. <application ...>
  8. ...
  9. </application>
  10. </manifest>

4. 混淆配置

CrashSDK 代码已经混淆过,不需要再混淆。在打包混淆规则中,需要保留 com.uc.crashsdk 包名下所有的类名和方法名。如下,在 progaurd.cfg 文件中加入:

  1. -keep class com.uc.crashsdk.** { *; }
  2. -keep interface com.uc.crashsdk.** { *; }

若你的项目代码没有做打包混淆,则也不必对 CrashSDK 进行混淆配置。

三、代码接入

1. 快速接入(推荐使用)

快速接入的方式需要使用 CrashApi.createInstanceEx 系列 API 之一初始化。

  • 创建 MyApplication

若你的项目还没有添加 Application 类,则需要在 $PROJECT/app/src/main/AndroidManifest.xml 文件中增加自己的 Application 类,如 MyApplication

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.uc.crashsdk.demo">
  3. ...
  4. <application
  5. android:icon="@mipmap/ic_launcher"
  6. ...
  7. android:name="com.uc.crashsdk.demo.MyApplication"
  8. ...
  9. android:theme="@style/AppTheme">
  10. ...
  11. </application>
  12. </manifest>

添加了如上的申明后,可根据 Android Studio 的提示,自动创建一个名为 MyApplication 的类添加到当前项目。

  • 接入

在刚添加的 MyApplication.onCreate 函数中,增加初始化代码,如下:

国内版:

  1. public class MyApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. // initialize crash sdk
  6. // arg1: the application context
  7. // arg2: your appId
  8. // arg3: print crash stack into logcat or not
  9. final boolean DEBUG = true;
  10. CrashApi.createInstanceEx(getApplicationContext(), "啄木鸟申请的AppID", DEBUG);
  11. }
  12. }

国际版:

  1. public class MyApplication extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. // initialize crash sdk
  6. // arg1: the application context
  7. // arg2: your appId
  8. // arg3: print crash stack into logcat or not
  9. // arg4: extended arguments
  10. final boolean DEBUG = true;
  11. Bundle args = new Bundle();
  12. args.putBoolean("mIsInternational", true); //设置走国际集群
  13. CrashApi.createInstanceEx(getApplicationContext(), "啄木鸟申请的AppID", DEBUG, args);
  14. }
  15. }

其中:

  • 第一个参数为当前 APP 运行时的 Application Context;

  • 第二个参数为当前 APP 在啄木鸟系统上申请的 AppID;
    如:Android 快速接入 - 图1

  • 第三个参数为是否打印崩溃日志内容到 logcat,其将设置给自定义参数 CustomInfo.mPrintStackInfos

在调用完 CrashApi.createInstanceEx 后,即完成了Java、Native 和 unexp 日志的初始化,并启用了崩溃统计、日志上传等功能。

至此,CrashSDK 接入完毕。

2. APP 正常退出

正常退出一般有两个场景:一个是 APP 自己有退出选项,点击选项后调用 Process.killProcess()) 或 System.exit()) 自杀退出;另一个是从系统的任务管理器中划掉,或切后台后被系统回收。

  • 对于第一种场景,需要 APP 根据自己的实际情况,在自杀前调用 CrashApi.onExit 通知 CrashSDK;

  • 对于第二种场景,CrashSDK 内部能自动识别,接入者不用考虑该场景。

自杀退出前需要调用的代码:

  1. public void onExit() {
  2. sCrashApi.onExit();
  3. }

四、客户端日志验证

崩溃日志将都生成在 context.getApplicationInfo().dataDir + CustomInfo.mCrashLogsFolderName 目录下。
另外:

注意:

本地开发时,若需要备份日志到 sdcard 下,可能需要手动在系统的权限设置中给你的 APP 加上 sdcard 的读写权限,不然日志会备份失败。

1. Java 崩溃验证

Java 崩溃需要在代码中制造一个异常,比如制造一个空指针:

  1. private void crashInJava() {
  2. String nullStr = "1";
  3. if (nullStr.equals("1")) {
  4. nullStr = null;
  5. }
  6. nullStr.equals("");
  7. }

2. Native(C/C++) 崩溃验证

可在 native 代码中访问非法地址,或者调用 abort() 制造一个崩溃,如下:

  1. #define CRASH() do { \
  2. *(int *)(uintptr_t) 0xbbadbeef = 0; \
  3. ((void(*)())0)(); \
  4. } while (false);
  5. void doCrash() {
  6. CRASH();
  7. }

另外,native 崩溃可在有 root 的手机上,直接使用命令行 kill -11 <pid> 强制生成日志。

3. unexp 崩溃验证

使用有 root 的手机,当 APP 在前台时,使用命令 kill -9 <pid> 将 APP 杀死;再次启动 APP,在 CustomInfo.mUnexpDelayMillSeconds 秒(默认是 60 秒)后,便会生成 unexp 崩溃日志。

如果要模拟 ANR 导致的 unexp,可以先使用 kill -3 <pid> 发送 ANR 信号,再使用 kill -9 <pid> 强制杀死 APP。

五、高级功能

如有其他功能或需求,请通过以下方式 联系我们


(本文完)