Bugly 第三方质量跟踪平台 - litonghui/TechBlog GitHub Wiki

###(一) Android Crash 分类:

1,Java Crash : java 代码触发,jvm 虚拟机退出,系统弹框提醒用户(游戏,视频中)!Crash 工具能够捕获
2, Native Crash : C/C++ 代码触发,Linux 进程退出,无系统提醒!闪退,绝大多数Crash工具不能捕获,一般是_白屏_,然后退出

####为了让开发者迅速获取奔溃信息,腾讯开发第三方SDK(Bugly)Bugly iOSBugly Android ),迅速跟踪查找奔溃信息。 ###(二) 对于Bugly Android 可发可以参考Bugly Android 使用文档,总结一下自己在实现第三方SDK中遇到的问题

1,在添加权限和添加sdk之后可以实现追踪简单的奔溃日志,其中appId 是会根据不同的项目生产不同的id,开发者需要正确提供id,否则无法获得奔溃信息。
2,如果要更加详细统计奔溃奔溃,渠道号,需要添加如下代码:
private void crashReport(){
	Context appContext = this.getApplicationContext();
	String appId = "xxxxxxxx";
	boolean isDebug = true;// true 代表调试阶段
	UserStrategy strategy = new UserStrategy(getApplicationContext()); //App的策略Bean
	strategy.setAppChannel( "myChannel");     //设置渠道
	strategy.setAppVersion(getVersionName());      //App的版本
	strategy.setAppReportDelay(5000);  //设置SDK处理延时,满足重要的功能先使用,毫秒
	CrashReport.initCrashReport(appContext, appId, isDebug,strategy);
	
}
其中获取版本号,可通过如下方法:
/**
 * 获取版本号
 * @return
 */
public static String getVersionName(Context context){
	// 显示当下的版本信息
	String versionName=null;
    try {
        PackageManager pm = context.getPackageManager();
        String pkgName = context.getPackageName();
        versionName=String.valueOf(pm.getPackageInfo(
                pkgName, PackageManager.GET_UNINSTALLED_PACKAGES).versionName);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
       
    }
    return versionName;
}
其中获取渠道号,可通过如下方法:
   待定。。。

###(三) 查看Crash

1,通过在Apps 信息【需要注册登录】,查看
2,添加LogCat ,在Filter Name和by Log Tag 中添加CrashReport,查看Log

###(四)Bugly Android Java 符号表配置 ####在代码混淆之后,上报Crash可能是某些字符,比如a,j 他们是用来代替被混淆的类,如果不添加符号表,上报的信息不是很方便阅读

1,在工程中找到project.properties文件,去掉

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前面的#

2, 在工程中找到proguard-project.txt 文件,添加

-keep class * extends android.app.Activity{;} -keep class * extends android.app.Service{;} -keep public class com.tencent.bugly.crashreport.crash.jni.NativeCrashHandler{public ; native ;} -keep public interface com.tencent.bugly.crashreport.crash.jni.NativeExceptionHandler{;}

3,对APP进行签名,会产生proguard文件夹,copy文件夹下的mapping.txt文件
4,上次至设置-符号表【需要注册登录】,在重写上报的crash 中的字符会被替换

####3,添加Bugly上报用户时,调用方法:CrashReport.setUserId("sg");调用位置如下: strategy.setAppReportDelay(5000); //设置SDK处理延时,毫秒 CrashReport.initCrashReport(appContext, appId, isDebug,strategy); CrashReport.setUserId("sg"); ###(五) Bugly Android SO集成

1,下载.SO【需要注册登录】到本地
2,创建libs/armeable和libs/armeable-v7a 目录
3,把.os库分别拷贝到libs/armeabi、armeabi-v7a目录下
4,运行app,在发生Crash之后,可以在CrashReport 中查看信息(包括Native出错信息和Java调用出错信息)
关于NDK动态库,在Bugly中添加libBugly.os 可以捕获Native 异常,但是目前支持 armeabi、armeabi-v7a,简单解释一下armeabi、armeabi-v7a:
在Android工程中,在根目录下有一个libs 文件夹,此文件下包括了armeabi、armeabi-v7a两个夹,c代码编译成的本地库(.os)就会放在两个文件夹中,其中根据cpu的类型不同,会选择不同文件夹中的c库,armeable 是针对普通的或者旧的arm v5 cpu,armeable-v7a是针对有浮点运算或者高级扩展功能的arm v7 cpu。

###(六)Bugly Android SO 符号表配置 ####对用Native 上报信息查看,无法准确定位到c/c++代码具体哪一行,需要依赖Bugly Android SO 符号表具体定位。当然熟悉linux的同学可以通过address2line查找到具体出错的代码行号

在Android工程中,libs 和 obj 文件夹下都会有.SO文件,对于同名的.SO文件,大小相差很大,obj下的.SO大约是libs下的3到4倍,主要是应为它包含了debug信息,一般将libs下的.SO成为release SO(对外发布使用),将obj文件下成为debug SO(开发调试使用)
1,下载.SO符号表【需要注册登录】到本地
2,Bugly符号表工具需要在debug的SO中提取出函数的符号信息,进行堆栈还原。
❗❗❗切记要obj目录下的so文件,否则无法生成,还要注意的是目前bugly系统只支持上传一个so生成的符号表

####### java -jar buglySymbolAndroid_1.1.jar -i .\libBuglyNative.so -a armeabi #######解释:debugSoPath 为obj问价下debugSo路径, -a 为cpu类型

4,获取生成.zip符号表压缩包,上次至设置-符号表【需要注册登录】,在Crash上报之后查看Native上报错误信息

####### 解释:目前bugly系统一个版本号对应一个mapping文件和一个符号表文件

⚠️ **GitHub.com Fallback** ⚠️