android 通过反射机制打印主线程消息队列中的消息

步骤

1:通过Hook得到ActivityThread对应的Handler

public static Handler hookActivityThreadHandler() {//获取主线程Handler
    if (null == mHandler) {
        try {
            Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
            Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
            Object activityThread = currentActivityThreadMethod.invoke(null);
            Field mH = activityThreadClass.getDeclaredField("mH");
            mH.setAccessible(true);
            mHandler = (Handler) mH.get(activityThread);
            return mHandler;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    } else {
        return mHandler;
    }
}

2:获取该Looper对应的消息队列

public static MessageQueue hookMainMessageQueue(Handler handler) {//获取主线程messageQuque
    if (null == handler) {
        return null;
    }
    if (null == mQueue) {
        try {
            Class<?> handlerClass = Class.forName("android.os.Handler");
            Field mQueueFiele = handlerClass.getDeclaredField("mQueue");
            mQueueFiele.setAccessible(true);
            mQueue = (MessageQueue) mQueueFiele.get(handler);
            return mQueue;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    } else {
        return mQueue;
    }
}

3:遍历该队列所有消息并打印

public static void PrintAllMessage(){
    MessageQueue queue = hookMainMessageQueue(hookActivityThreadHandler());
    if(queue==null)return ;

    Message message=null;
    if(hookMainMessageQueue(hookActivityThreadHandler())!=null){
        try{
            Class<?>messageQueueClass=Class.forName("android.os.MessageQueue");
            Field mMessageField=messageQueueClass.getDeclaredField("mMessages");
            mMessageField.setAccessible(true);
            message=(Message) mMessageField.get(queue);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    synchronized (queue){
        Message p =message;
        while(p!=null){
            Log.i("messageInfo",p.toString());
            p=getNextMessage(p);
        }
    }
}

4:获取当前message中的下一个消息

private static Message getNextMessage(Message msg){
    Message nextMessage;
    try {
        Class<?> messageClass = Class.forName("android.os.Message");
        Field mNextField = messageClass.getDeclaredField("next");
        mNextField.setAccessible(true);
        nextMessage = (Message) mNextField.get(msg);
        return nextMessage;
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

完整代码

类的全部代码

package com.example.webview;

import android.os.Handler;
import android.os.Message;
import android.os.MessageQueue;
import android.util.Log;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class hookMessageQueue {

    private static Handler mHandler;
    private static MessageQueue mQueue;

    public static Handler hookActivityThreadHandler() {//获取主线程Handler
        if (null == mHandler) {
            try {
                Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
                Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread");
                Object activityThread = currentActivityThreadMethod.invoke(null);
                Field mH = activityThreadClass.getDeclaredField("mH");
                mH.setAccessible(true);
                mHandler = (Handler) mH.get(activityThread);
                return mHandler;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return mHandler;
        }
    }
    public static MessageQueue hookMainMessageQueue(Handler handler) {//通过Handler获取主线程messageQuque
        if (null == handler) {
            return null;
        }
        if (null == mQueue) {
            try {
                Class<?> handlerClass = Class.forName("android.os.Handler");
                Field mQueueFiele = handlerClass.getDeclaredField("mQueue");
                mQueueFiele.setAccessible(true);
                mQueue = (MessageQueue) mQueueFiele.get(handler);
                return mQueue;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return mQueue;
        }
    }

    public static void PrintAllMessage(){
        MessageQueue queue = hookMainMessageQueue(hookActivityThreadHandler());
        if(queue==null)return ;

        Message message=null;
        if(hookMainMessageQueue(hookActivityThreadHandler())!=null){
            try{
                Class<?>messageQueueClass=Class.forName("android.os.MessageQueue");
                Field mMessageField=messageQueueClass.getDeclaredField("mMessages");
                mMessageField.setAccessible(true);
                message=(Message) mMessageField.get(queue);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        synchronized (queue){
            Message p =message;
            while(p!=null){
                Log.i("messageInfo",p.toString());
                p=getNextMessage(p);
            }
        }
    }
    private static Message getNextMessage(Message msg){
        Message nextMessage;
        try {
            Class<?> messageClass = Class.forName("android.os.Message");
            Field mNextField = messageClass.getDeclaredField("next");
            mNextField.setAccessible(true);
            nextMessage = (Message) mNextField.get(msg);
            return nextMessage;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值