版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zsp_android_com/article/details/82149489
资料
准备
gradle(module)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
// 配自动上传符号表插件
// 快准定位用户Crash代码位
// 通符号表解析和还原Crash程序堆栈
classpath 'com.tencent.bugly:symtabfileuploader:1.3.9'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
1.3.9为Bugly插件版本号,更插件仅改版本号并Rebuild即可。
gradle(app)
apply plugin: 'com.android.application'
// 配符号表用Bugly插件
apply plugin: 'bugly'
bugly {
appId = '1ce500da0b'
appKey = '225a3f5f-99f2-4025-88b6-7845372b7d3e'
}
android {
compileSdkVersion 27
defaultConfig {
...
ndk {
// 支持SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
...
}
...
dependencies {
...
implementation 'com.tencent.bugly:crashreport:2.6.6.1'
implementation 'com.tencent.bugly:nativecrashreport:3.0'
}
appId、appKey必填,除此还可设其它属性
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
appId | String | null | App ID |
appKey | String | null | App Key |
execute | boolean | true | 插件开关 |
upload | boolean | true | 上传开关 |
debug | boolean | false | 调试模式开关 |
appPackage | String | null | App包名 |
appVersion | String | null | App版本 |
appChannel | String | null | App渠道 |
uploadMapping | boolean | true | Mapping文件上传开关 |
uploadSymbol | boolean | true | Symbol文件上传开关 |
outputDir | String | <项目路径>/bugly | 符号表文件输出路径 |
添abiFilter后:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
则项目根目录gradle.properties添:
android.useDeprecatedNdk=true
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
上传google play store需屏或移READ_PHONE_STATE(否或被下架)
无READ_LOGS亦可
初始化
一
建不于异步线程初始Bugly(保运营数据准确性)。获APP ID并复制以下代码至Application之onCreate(),Bugly自检环境并配:
CrashReport.initCrashReport(getApplicationContext(), "注册申请APPID", false);
第三参SDK调试模式开关(建测试true、发布false),调试模式行为特性:
- 输出详细Bugly SDK之Log
- 立即上报每条Crash
- 自定日志于Logcat输出
二
App用多进程且各进程都初始Bugly(Application类onCreate()初始Bugly)则每进程Bugly都数据上报致资源浪费。节省流量、内存等资源,建初始时控上报进程,仅主进程上报数据。判主进程(进程名为包名)否并初始Bugly时增一上报进程策略配置。
String packageName = this.getPackageName();
// 当前进程名
String processName = AppUtils.getProcessName(android.os.Process.myPid());
// 是否为上报进程
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this);
strategy.setUploadProcess(processName == null || processName.equals(packageName));
// 初始延迟(启2s后联网同步数据,特别需求改该时间)
strategy.setAppReportDelay(20000);
CrashReport.initCrashReport(this, "xxx", true, strategy);
获进程名有多实现法,推荐
package util;
import android.text.TextUtils;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* Created on 2018/8/28.
*
* @desc AppUtils
*/
public class AppUtils {
/**
* 进程号对应进程名
*
* @param pid 进程号
* @return 进程名
*/
public static String getProcessName(int pid) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
String processName = reader.readLine();
if (!TextUtils.isEmpty(processName)) {
processName = processName.trim();
}
return processName;
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
return null;
}
}
测试
造一Crash(建议通按键触发)体验Bugly。初始Bugly后调Bugly测Java Crash接口,延迟通10s内(测试成功后注/删)。
CrashReport.testJavaCrash();
注意
- 同用
自定捕获异常类
与Bugly时需初始Bugly前初始自定捕获异常类
,否Bugly不上报。 - 项目含Native工程或用代码混淆,建配符号表文件,具参符号表配置。
疑问
该应用版未配符号表文件,堆栈源代码类名、行号等信息或无法正常显,去配置。