package com.ym.testproject.utils.ymcrash.hook;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.os.Handler;
import android.os.Looper;
import com.ym.testproject.utils.ymcrash.handler.ExceptionDispatcher;
public class AndroidHookHandler implements AndroidHookListener {
private volatile boolean isHooked;
private ExceptionDispatcher mExceptionDispatcher;
private Handler.Callback mOriginCallback;
public AndroidHookHandler(ExceptionDispatcher exceptionDispatcher) {
mExceptionDispatcher = exceptionDispatcher;
}
@Override
public void onHook() {
if (isHooked()) {
return;
}
try {
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
currentActivityThreadMethod.setAccessible(true);
Object currentActivityThread = currentActivityThreadMethod.invoke(null);
Field mHField = activityThreadClass.getDeclaredField("mH");
mHField.setAccessible(true);
Handler handler = (Handler) mHField.get(currentActivityThread);
Field callbackField = Handler.class.getDeclaredField("mCallback");
callbackField.setAccessible(true);
mOriginCallback = (Handler.Callback) callbackField.get(handler);
Handler.Callback fakeCallback = msg -> {
try {
if (mOriginCallback != null) {
if (!mOriginCallback.handleMessage(msg))
handler.handleMessage(msg);
} else {
handler.handleMessage(msg);
}
} catch (Throwable e) {
mExceptionDispatcher.uncaughtExceptionHappened(Looper.getMainLooper().getThread(), e);
}
return true;
};
callbackField.set(handler, fakeCallback);
synchronized (this) {
isHooked = true;
}
} catch (Throwable ignored) {
ignored.printStackTrace();
synchronized (this) {
isHooked = false;
}
}
}
@Override
public void unHook() {
if (!isHooked()) {
return;
}
try {
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
currentActivityThreadMethod.setAccessible(true);
Object currentActivityThread = currentActivityThreadMethod.invoke(null);
Field mHandlerField = activityThreadClass.getDeclaredField("mH");
mHandlerField.setAccessible(true);
Handler handler = (Handler) mHandlerField.get(currentActivityThread);
Field callbackField = Handler.class.getDeclaredField("mCallback");
callbackField.setAccessible(true);
callbackField.set(handler, mOriginCallback);
synchronized (this) {
isHooked = false;
}
} catch (Throwable ignored) {
ignored.printStackTrace();
synchronized (this) {
isHooked = true;
}
}
}
@Override
public boolean isHooked() {
return isHooked;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Android应用的Crash闪退捕获
共10个文件
java:10个
需积分: 5 0 下载量 127 浏览量
2022-11-02
03:23:58
上传
评论
收藏 7KB ZIP 举报
温馨提示
自定义一个Android应用的Crash异常捕获器
资源详情
资源评论
资源推荐
收起资源包目录
ymcrash.zip (10个子文件)
ymcrash
handler
ExceptionDispatcher.java 2KB
IExceptionHandler.java 727B
exception
ExemptCaughtException.java 288B
hook
AndroidHookThreadLoop.java 3KB
InstrumentationProxy.java 2KB
AndroidHookInstrumentation.java 3KB
AndroidHookListener.java 147B
SafeMode.java 319B
AndroidHookHandler.java 3KB
AndroidCrash.java 3KB
共 10 条
- 1
安静的男孩
- 粉丝: 987
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于 Java的班级管理系统课程设计
- 深入探索Suno AI:教程、元标签与案例分析.pdf
- 超市会员积分管理系统主要用于实现了企业管理数据统计等
- 基于 Java的班级管理系统
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0