zoukankan      html  css  js  c++  java
  • 启动检测

    目的:检测启动阶段耗时

    应用启动时,会直接对ActivityThread类hook

    public class Hacker {
    private static final String TAG = "Matrix.Hacker";
    public static boolean isEnterAnimationComplete = false;
    public static long sApplicationCreateBeginTime = 0L;
    public static int sApplicationCreateBeginMethodIndex = 0;
    public static long sApplicationCreateEndTime = 0L;
    public static int sApplicationCreateEndMethodIndex = 0;
    public static int sApplicationCreateScene = -100;

    public static void hackSysHandlerCallback() {
    try {
    //这个类被加载的时间,认为是整个App的启动开始时间
    sApplicationCreateBeginTime = System.currentTimeMillis();
    sApplicationCreateBeginMethodIndex = MethodBeat.getCurIndex();
    Class<?> forName = Class.forName("android.app.ActivityThread");
    Field field = forName.getDeclaredField("sCurrentActivityThread");
    field.setAccessible(true);
    Object activityThreadValue = field.get(forName);
    Field mH = forName.getDeclaredField("mH");
    mH.setAccessible(true);
    Object handler = mH.get(activityThreadValue);
    Class<?> handlerClass = handler.getClass().getSuperclass();
    Field callbackField = handlerClass.getDeclaredField("mCallback");
    callbackField.setAccessible(true);
    Handler.Callback originalCallback = (Handler.Callback) callbackField.get(handler);
    HackCallback callback = new HackCallback(originalCallback);
    callbackField.set(handler, callback);
    MatrixLog.i(TAG, "hook system handler completed. start:%s", sApplicationCreateBeginTime);
    } catch (Exception e) {
    MatrixLog.e(TAG, "hook system handler err! %s", e.getCause().toString());
    }
    }

  • 相关阅读:
    对xml的操作使用的类XElement的使用
    在js和C#中split应用和去除字符串分组后的空值
    C# 预定义语言
    C# 中利用 Conditional 定义条件方法
    快速结束占用端口
    详解C++中命名空间的意义和用法
    Template、ItemsPanel、ItemContainerStyle、ItemTemplate
    C++入门(2)
    C++入门(1)
    VS中的配置管理器
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11295904.html
Copyright © 2011-2022 走看看