由于本人小白一个,所以在项目中会经常出现程序崩溃的情况,要是在调试的时候出现还好,可以直接看报错的信息,但是有时候不在调试的情况下,或者给别人测试的情况下,出现崩溃但又不知道其原因,这对程序的维护就增加的很多困难,所以我在项目中使用了ACRA的崩溃反馈框架,可以说贼好用~~.
ACRA的使用很简单: 1.在Application中设置模式及初始化 2.创建CrashSenderFactory,MyKeyStoreFactory类,用于触发崩溃后调用
manifest中添加设置 App的类名可以自定义的
<application android:name=".App" </application> @ReportsCrashes( //设置模式,SILENT:不提示,直接进行处理;;NOTIFICATION:在通知栏中显示提示;;TOAST:使用toast显示提示;;DIALOG:使用一个对话框来提示 mode = ReportingInteractionMode.TOAST, 这里需要在res资源的string.xml中定义好提示的文字(Toast模式下) resToastText = R.string.app_error, // 更换默认的发送器 reportSenderFactoryClasses = {xxx.CrashSenderFactory.class} //xxx为包名 ) //必须在一个继承Application且在manifest中声明的类中设置、初始化 public class App extends Application{ @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); ACRA.init(this); } }CrashSenderFactory类是用来替换默认的发送器的(需要继承ReportSenderFactory ),在程序崩溃的时候会触发这个类的create方法,并返回ReportSender (内部为对崩溃信息的处理)
public class CrashSenderFactory implements ReportSenderFactory { /** * @param context Application context. * @param config Configuration to use when sending reports. * @return Fully configured instance of the relevant ReportSender. */ @NonNull @Override public ReportSender create(@NonNull Context context, @NonNull ACRAConfiguration config) { return new MyKeyStoreFactory(); } }MyKeyStoreFactory 中的send方法是对崩溃信息的处理,在这里可以将崩溃信息发到服务器或保存在本地
public class MyKeyStoreFactory implements ReportSender { /** * Send crash report data. * <p> * Method will be called from the {@link SenderService}. * * @param context Android Context in which to send the crash report. * @param errorContent Stores key/value pairs for each report field. * A report field is identified by a {@link ReportField} enum value. * @throws ReportSenderException If anything goes fatally wrong during the handling of crash * data, you can (should) throw a {@link ReportSenderException} * with a custom message. */ @Override public void send(@NonNull Context context, @NonNull CrashReportData errorContent) throws ReportSenderException { //errorContent内包含了崩溃的信息及此设备的信息 String content =errorContent.getProperty(ReportField.BUILD)+"\n" +errorContent.getProperty(ReportField.DUMPSYS_MEMINFO)+"\n" +errorContent.getProperty(ReportField.STACK_TRACE)+"\n"; Log.e("---err---","崩溃信息:"+content); } }errorContent中的崩溃信息标识在ReportField类中有注释,这里就不把源码粘贴出来了,直接将一些常用的拿出来,方便大家使用(具体的可以到源码中看)
PP_VERSION_CODE:应用程序的版本号;; APP_VERSION_NAME:应用程序版本名;; ANDROID_VERSION:使用的安卓版本;; BUILD:Android构建细节;; BRAND:Device brand (manufacturer or carrier),设备品牌(制造商或运营商);; DUMPSYS_MEMINFO:应用程序进程的内存状态的细节;; DUMPSYS_MEMINFO:堆栈跟踪的信息;;
以上是本人项目中接触到的对程序崩溃信息收集的方法.