/*
* Tencent is pleased to support the open source community by making Tinker available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.tencent.tinker.loader;
import android.content.Context;
import android.util.Log;
import com.tencent.tinker.loader.shareutil.SharePatchFileUtil;
import com.tencent.tinker.loader.shareutil.ShareTinkerInternals;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by zhangshaowen on 16/12/1.
*/
public class TinkerUncaughtHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "Tinker.UncaughtHandler";
private final File crashFile;
private final Context context;
private final Thread.UncaughtExceptionHandler ueh;
public TinkerUncaughtHandler(Context context) {
this.context = context;
ueh = Thread.getDefaultUncaughtExceptionHandler();
crashFile = SharePatchFileUtil.getPatchLastCrashFile(context);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Log.e(TAG, "catch exception when loading tinker:" + Log.getStackTraceString(ex));
ueh.uncaughtException(thread, ex);
if (crashFile != null) {
Thread.UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler();
//only catch real uncaught Exception
if (handler instanceof TinkerUncaughtHandler) {
File parentFile = crashFile.getParentFile();
if (!parentFile.exists() && !parentFile.mkdirs()) {
Log.e(TAG, "print crash file error: create directory fail!");
return;
}
PrintWriter pw = null;
try {
pw = new PrintWriter(new FileWriter(crashFile, false));
pw.println("process:" + ShareTinkerInternals.getProcessName(this.context));
pw.println(ShareTinkerInternals.getExceptionCauseString(ex));
} catch (IOException e) {
//ignore
Log.e(TAG, "print crash file error:" + Log.getStackTraceString(e));
} finally {
SharePatchFileUtil.closeQuietly(pw);
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
}
}