# Android SDK接入指南
# 1. 第一步: 库文件引入
Crash SDK 支持两种库文件引入方式:
- 自动集成
如果您使用Gradle编译APK,我们 强烈推荐 你使用自动集成方式
- 手动集成
需要较多手动配置,且不便升级,仅适合对于SDK版本有指定要求的用户
# 1.1 自动集成 方式说明(强烈推荐)
CrashSDK支持Maven中央仓库(仓库地址迁往《SDK下载》页获取)。为了满足不同的客户需求,我们提供了不同的集成方案。
# 同时集成Java SDK+NDK
android {
defaultConfig {
ndk {
// 设置支持的SO库架构,不设置时默认支持全部架构
abiFilters 'armeabi' //, 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}
dependencies {
// Gradle 3.0以后请使用implementation
// 其中latest.release指的是最新的Crash SDK版本号,我们建议您指定明确的版本号
compile 'com.ucweb.wpk:crashsdk:latest.release'
}
# 仅集成Java SDK
dependencies {
compile 'com.ucweb.wpk:crashsdk-java:latest.release' //Gradle 3.0以后请使用implementation
}
集成后可以直接进行下一步【权限验证】。
# 1.2 手工集成 方式说明
- 前往《SDK下载》页下载CrashSDK
- 如果只生成 java 崩溃日志,只需要将 <code>crashsdk-x.x.x.x-release/demo/app/libs/crashsdk.jar</code> 文件复制到自己项目的 libs 目录下。
- 如果要生成 Native(C/C++) 崩溃日志,除复制 crashsdk.jar 外,还需要将发布对应的 CPU 架构的SO库 (<code>crashsdk-x.x.x.x-release/demo/app/libs/$arch/libcrashsdk.so</code>) 复制到自己项目的 <code>$PROJECT/app/libs/$arch/</code> 目录下,例如:
- 如果当前编译的 apk 只给 arm 的机器使用,则可仅复制 libs/armeabi/libcrashsdk.so 或 libs/armeabi-v7a/libcrashsdk.so
- 如果只给 x86 的机器使用,则可仅复制 libs/x86/libcrashsdk.so
- 若想同时给 arm 和 x86 的机器使用,则两者需要都分别复制
# 2. 第二步: 权限配置
请在 <code>AndroidManifest.xml</code> 文件中加上如下权限申明。
# 3. 第三步: 混淆配置
若你的项目代码没有做打包混淆,可跳过该章节。
CrashSDK 代码已经混淆过,不需要再混淆。
APP构建混淆时,需保留 <code>com.uc.crashsdk</code> 包名下所有的类名和方法名,请在 progaurd.cfg 文件添加以下配置。
-keep class com.uc.crashsdk.** { *; }
-keep interface com.uc.crashsdk.** { *; }
# 4. 第四步: 代码接入
快速接入的方式需要使用 CrashApi.createInstanceEx API 初始化。
- 创建 MyApplication
若你的项目还没有添加 <code>Application</code> 类,则需要在 <code>$PROJECT/app/src/main/AndroidManifest.xml</code> 文件中增加自己的 <code>Application</code> 类,如 <code>MyApplication</code>。
添加了如上的申明后,可根据 Android Studio 的提示,自动创建一个名为 <code>MyApplication</code> 的类添加到当前项目。
- 接入
在刚添加的 <code>MyApplication.onCreate</code> 方法中,增加初始化代码,如下。
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);
}
}
本地开发验证时,建议使用以下代码。
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();
// 打开控制台logcat日志,便于观察日志
args.putBoolean("mDebug", DEBUG);
CrashApi.createInstanceEx(getApplicationContext(), "岳鹰申请的AppID", DEBUG, args);
}
}
其中:
- 第一个参数为当前 APP 运行时的 Application Context;
- 第二个参数为当前 APP 在岳鹰平台上申请的 AppID,如下;
- 第三个参数为是否打印崩溃日志内容到 logcat;
- 第四个参数为扩展参数,可设置应用版本参数。如果是海外发布的 APP,需要将 mIsInternational 设置为 true。
在调用完 CrashApi.createInstanceEx 后,即完成了Java、Native 日志的初始化,并启用了崩溃统计、日志上传等功能。
至此,CrashSDK 接入完毕,可进入下一步进行崩溃验证。
# 5. 第五步: 客户端日志验证
APP崩溃之后,CrashSDK会实时上报崩溃日志;接入SDK时打开 CustomInfo.mPrintStackInfos ,在 logcat 中会输出主要的崩溃信息,过滤TAG 等于 crashsdk 可以快速查看到日志信息。
注意
- 发布时,请关闭 CustomInfo.mPrintStackInfos 配置项
至此,CrashSDK 已经接入完成并能在平台上查看到对应的数据了。
如果您的工程启用了代码混淆功能或者包含native代码,建议按照文档进行符号表上传。
# 附1:各崩溃验证的模拟方式
# Java 崩溃验证
Java 崩溃需要在代码中制造一个异常,比如制造一个空指针。
private void crashInJava() {
String nullStr = "1";
if (nullStr.equals("1")) {
nullStr = null;
}
nullStr.equals("");
}
# Native(C/C++) 崩溃验证
可在 native 代码中访问非法地址,或者调用 <code>abort()</code> 制造一个崩溃,如下。
#define CRASH() do { \
*(int *)(uintptr_t) 0xbbadbeef = 0; \
((void(*)())0)(); \
} while (false);
void doCrash() {
CRASH();
}
另外,native 崩溃可在有 root 的手机上,直接使用命令行 <code>kill -11 <pid></code> 强制生成日志。