一、简介
在阅读本文档前,建议先初步预览一下 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">
...
<application
android: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 {
@Override
public void onCreate() {
super.onCreate();
// initialize crash sdk
// arg1: the application context
// arg2: your appId
// arg3: print crash stack into logcat or not
final boolean DEBUG = true;
CrashApi.createInstanceEx(getApplicationContext(), "啄木鸟申请的AppID", DEBUG);
}
}
国际版:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// initialize crash sdk
// arg1: the application context
// arg2: your appId
// arg3: print crash stack into logcat or not
// arg4: extended arguments
final 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。
五、高级功能
如有其他功能或需求,请通过以下方式 联系我们 。
(本文完)