实现UncaughtExceptionHandler来实现获取应用全局的crash信息

先阅读这篇文章
https://blog.csdn.net/wozuihaole/article/details/70224920
三个类我贴出来

package com.example.testuncaughtexceptionhandler;

import android.content.Context;
import android.os.Process;
import android.util.Log;

/**
 * Created by v_wangxuegang on 2018/5/7.
 */

public class CrashHandler implements Thread.UncaughtExceptionHandler {
    private Context context;
    private static class Holdler {
        private static CrashHandler crashHandler = new CrashHandler();
    }

    public static CrashHandler getInstance() {
        return Holdler.crashHandler;
    }
    public void init(Context context){
        Thread.UncaughtExceptionHandler uncaughtExceptionHandler=Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
        context=context.getApplicationContext();
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
      MyApplication.clearActivity();
      Log.i("zhang_xin111",e.getMessage());
        Process.killProcess(Process.myPid());
    }
}
package com.example.testuncaughtexceptionhandler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyApplication.addActivity(this);
    }

    public void aaa(View view) {

        int a=1/0;
    }
}
package com.example.testuncaughtexceptionhandler;

import android.app.Activity;
import android.app.Application;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by v_wangxuegang on 2018/5/7.
 */

public class MyApplication extends Application {
    private static List<Activity> activities = new ArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        activities = new ArrayList<>();
        CrashHandler.getInstance().init(this);
    }

    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    public static void clearActivity() {
        for (Activity activity : activities) {
            activity.finish();
            ;
        }
    }
}

下面的代码是某著名公司崩溃日志输出到本地和上传服务器的代码,可以参考
日志回传的内容这里写图片描述

package com.baidu.map.location.lib.utils;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;

import com.baidu.map.location.lib.http.HttpClient;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * crash日志
 * Created by guozhenqian on 18/3/23.
 */

public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    private static final String URL = "http://10.101.93.81:8182/infopass/mecp";

    private static volatile boolean mCrashing = false;
    private Context mContext;
    // 用来存储设备信息和异常信息
    private HashMap<String, String> infos = new HashMap<>();
    private File file;
    private BufferedReader bufferedReader;
    private FileReader fileReader;

    public UncaughtExceptionHandler() {
    }

    private static class Holer {
        private static UncaughtExceptionHandler instance = new UncaughtExceptionHandler();
    }

    public static UncaughtExceptionHandler getInstance() {
        return Holer.instance;
    }

    public void init(Context context) {
        mContext = context;
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        if (mCrashing) {
            return;
        }
        mCrashing = true;
        if (!handleException(throwable)) {
            Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, throwable);
        }

        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(1);
    }

    private boolean handleException(Throwable throwable) {
        if (throwable == null) {
            return false;
        }
        collectDeviceInfo();
        saveCatchInfo(throwable);
        return true;
    }

    private void saveCatchInfo(final Throwable ex) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                for (Map.Entry<String, String> entry : infos.entrySet()) {
                    String key = entry.getKey();
                    String value = entry.getValue();
                    sb.append(key + "=" + value + "\n");
                }
                Writer writer = new StringWriter();
                PrintWriter printWriter = new PrintWriter(writer);
                ex.printStackTrace(printWriter);
                Throwable cause = ex.getCause();
                while (cause != null) {
                    cause.printStackTrace(printWriter);
                    cause = cause.getCause();
                }
                printWriter.close();
                String result = writer.toString();
                sb.append(result);
                try {
                    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
                    String time = formatter.format(new Date());
                    String fileName = "crash-" + time + ".log";
                    String fileDir = SysOSAPI.getInstance().getSdPath() + File.separator + "log";
                    file = new File(fileDir + fileName);
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    FileOutputStream fos = new FileOutputStream(file);
                    fos.write(sb.toString().getBytes());
                    fos.close();
                    // 发送给服务端的时机
                } catch (Exception e) {
                    NLog.d("an error occured while writing file..." + e);
                }
            }
        }).start();
    }

    private void collectDeviceInfo() {
        // 手机型号信息
        infos.clear();
        Field[] fields = Build.class.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                infos.put(field.getName(), field.get(null).toString());
            } catch (Exception e) {
                NLog.d("an error occured when collect crash info" + e.toString());
            }
        }

        // 安装包的信息
        try {
            PackageManager pm = mContext.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), 0);
            if (pi != null) {
                String versionName = pi.versionName == null ? "null" : pi.versionName;
                String versionCode = pi.versionCode + "";
                infos.put("versionName", versionName);
                infos.put("versionCode", versionCode);
            }
        } catch (PackageManager.NameNotFoundException e) {
            NLog.d("an error occured when collect package info" + e.toString());
        }
    }

    // 上传到服务器
    public void upLoadAndDelete() {
        if (!file.exists()) {
            return;
        }
        String content = null;
        try {
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                content = content + str;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("content", content);
        HttpClient.getInstane().asyncPost(UncaughtExceptionHandler.URL, "reportCrashLog", hashMap, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                file.delete();
            }
        });
    }
}
  /**
     * 异步Post请求
     *
     * @param url
     * @param parameters
     *
     * @return
     */
    public void asyncPost(String url, String method, HashMap<String, String> parameters, Callback callback) {
        try {
            JSONObject params = new JSONObject();
            Iterator iter = parameters.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
                String key = (String) entry.getKey();
                String val = (String) entry.getValue();
                params.put(key, val);
            }

            JSONObject serverId = new JSONObject();
            serverId.put("method", method);
            // 构建嵌套的json数据
            JSONObject obj = new JSONObject();
            obj.put("serverId", serverId);
            obj.put("param", params);
            // StringEntity stringEntity = new StringEntity(MessageUtil.encrypt(obj.toString()), "UTF-8");
            NLog.d(obj.toString());
            RequestBody requestBody = RequestBody
                    .create(MediaType.parse(CONTENT_TYPE), Utils.encrypt(obj.toString()));
            Request request = new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .build();
            okHttpClient.newCall(request).enqueue(callback);
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

猜你喜欢

转载自blog.csdn.net/qczg_wxg/article/details/80226892