一、简介
在阅读本文档前,建议先初步预览一下 CrashSDK API 文档 的目录部分;在下面的接入步骤中,涉及到具体的 API 时,再去查看相关 API 的详细说明即可。
接入步骤可参考 CrashSDK 提供的 demo 或者 testshell 示例程序代码,点此下载最新的 CrashSDK 库文件及示例代码。
下面是下载得到的压缩包中主要目录及文件的简介:
crashsdk-x.x.x.x-release.zip├── demo/ 1. demo.apk Android Studio 工程的源码│ ├── app/│ │ ├── build.gradle│ │ ├── libs/│ │ │ ├── crashsdk.jar sdk java 库│ │ │ ├── armeabi/libcrashsdk.so arm v5 CPU 架构下的 sdk native 库│ │ │ ├── armeabi-v7a/libcrashsdk.so arm v7 CPU 架构下的 sdk native 库│ │ │ ├── arm64-v8a/libcrashsdk.so arm64 CPU 架构下的 sdk native 库│ │ │ ├── x86/libcrashsdk.so x86 CPU 架构下的 sdk native 库│ │ │ └── x86_64/libcrashsdk.so x86_64 CPU 架构下的 sdk native 库│ │ └── src/main/│ │ ├── AndroidManifest.xml│ │ └── java/com/uc/crashsdk/demo/ 接入示例源码│ └── build.gradle├── demo.apk 使用 demo 工程预编译的 demo.apk││├── testshell/ 2. testshell.apk Android Studio 工程的源码│ ├── app/│ │ ├── build.gradle│ │ ├── libs/│ │ │ ├── crashsdk.jar sdk java 库│ │ │ ├── armeabi/libcrashsdk.so arm v5 CPU 架构下的 sdk native 库│ │ │ ├── armeabi-v7a/libcrashsdk.so arm v7 CPU 架构下的 sdk native 库│ │ │ ├── arm64-v8a/libcrashsdk.so arm64 CPU 架构下的 sdk native 库│ │ │ ├── x86/libcrashsdk.so x86 CPU 架构下的 sdk native 库│ │ │ └── x86_64/libcrashsdk.so x86_64 CPU 架构下的 sdk native 库│ │ └── src/main/│ │ ├── AndroidManifest.xml│ │ ├── cpp/ native API 使用示例│ │ │ ├── include/crashsdk.h│ │ │ ├── jni/│ │ │ └── JNIRegisterTest.cpp│ │ └── java/com/uc/crashsdk/test/ 接入示例源码│ │ ├── MainActivity.java│ │ ├── MyApplication.java│ │ ├── SandboxService.java Isolated Service 示例│ │ ├── CrashWrapperSelector.java 通过改变 import 的 CrashWrapper 类,以选择下面不同的示例 Wrapper│ │ ├── logs_only/CrashWrapper.java 1. 仅生成 java 和 native 日志的示例│ │ ├── min_dependence/CrashWrapper.java 2. 最小依赖示例(仅需 import CrashApi 一个类)│ │ ├── native_api/CrashWrapper.java 3. native API 使用示例│ │ └── standard/CrashWrapper.java 4. 标准示例│ └── build.gradle└── 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
dependencies {compile 'com.ucweb.wpk:crashsdk:latest.release'}
仅集成SDK
dependencies {compile 'com.ucweb.wpk:crashsdk-java:latest.release'}
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 文件中加上如下权限申明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.uc.crashsdk.demo"><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.READ_LOGS" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><application ...>...</application></manifest>
4. 混淆配置
CrashSDK 代码已经混淆过,不需要再混淆。在打包混淆规则中,需要保留 com.uc.crashsdk 包名下所有的类名和方法名。如下,在 progaurd.cfg 文件中加入:
-keep class com.uc.crashsdk.** { *; }-keep interface com.uc.crashsdk.** { *; }
若你的项目代码没有做打包混淆,则也不必对 CrashSDK 进行混淆配置。
三、代码接入
1. 快速接入(推荐使用)
快速接入的方式需要使用 CrashApi.createInstanceEx 系列 API 之一初始化。
- 创建 MyApplication
若你的项目还没有添加 Application 类,则需要在 $PROJECT/app/src/main/AndroidManifest.xml 文件中增加自己的 Application 类,如 MyApplication:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.uc.crashsdk.demo">...<applicationandroid:icon="@mipmap/ic_launcher"...android:name="com.uc.crashsdk.demo.MyApplication"...android:theme="@style/AppTheme">...</application></manifest>
添加了如上的申明后,可根据 Android Studio 的提示,自动创建一个名为 MyApplication 的类添加到当前项目。
- 接入
在刚添加的 MyApplication.onCreate 函数中,增加初始化代码,如下:
国内版:
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// initialize crash sdk// arg1: the application context// arg2: your appId// arg3: print crash stack into logcat or notfinal boolean DEBUG = true;CrashApi.createInstanceEx(getApplicationContext(), "啄木鸟申请的AppID", DEBUG);}}
国际版:
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// initialize crash sdk// arg1: the application context// arg2: your appId// arg3: print crash stack into logcat or not// arg4: extended argumentsfinal boolean DEBUG = true;Bundle args = new Bundle();args.putBoolean("mIsInternational", true); //设置走国际集群CrashApi.createInstanceEx(getApplicationContext(), "啄木鸟申请的AppID", DEBUG, args);}}
其中:
第一个参数为当前 APP 运行时的 Application Context;
第二个参数为当前 APP 在啄木鸟系统上申请的 AppID;
如:
第三个参数为是否打印崩溃日志内容到 logcat,其将设置给自定义参数 CustomInfo.mPrintStackInfos。
在调用完 CrashApi.createInstanceEx 后,即完成了Java、Native 和 unexp 日志的初始化,并启用了崩溃统计、日志上传等功能。
至此,CrashSDK 接入完毕。
2. APP 正常退出
正常退出一般有两个场景:一个是 APP 自己有退出选项,点击选项后调用 Process.killProcess()) 或 System.exit()) 自杀退出;另一个是从系统的任务管理器中划掉,或切后台后被系统回收。
自杀退出前需要调用的代码:
public void onExit() {sCrashApi.onExit();}
四、客户端日志验证
崩溃日志将都生成在 context.getApplicationInfo().dataDir + CustomInfo.mCrashLogsFolderName 目录下。
另外:
如果有打开 CustomInfo.mPrintStackInfos,在 logcat 中也会有主要的崩溃信息的输出;
如果有打开 CustomInfo.mBackupLogs,日志也会被复制一份到 CustomInfo.mLogsBackupPathName 或者
/sdcard/+ CustomInfo.mCrashLogsFolderName。
注意:
本地开发时,若需要备份日志到 sdcard 下,可能需要手动在系统的权限设置中给你的 APP 加上 sdcard 的读写权限,不然日志会备份失败。
1. Java 崩溃验证
Java 崩溃需要在代码中制造一个异常,比如制造一个空指针:
private void crashInJava() {String nullStr = "1";if (nullStr.equals("1")) {nullStr = null;}nullStr.equals("");}
2. Native(C/C++) 崩溃验证
可在 native 代码中访问非法地址,或者调用 abort() 制造一个崩溃,如下:
#define CRASH() do { \*(int *)(uintptr_t) 0xbbadbeef = 0; \((void(*)())0)(); \} while (false);void doCrash() {CRASH();}
另外,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。
五、高级功能
如有其他功能或需求,请通过以下方式 联系我们 。
(本文完)
