# 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 &lt;pid&gt;</code> 强制生成日志。