如何Hook NotificationManagerService 实现自己的特殊业务

package com.sf.myapplication;

import android.app.NotificationManager;
import android.content.Context;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

class SystemServiceHookUtil {


  public static void hookNMS(MainActivity context) {
    try {
      NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
      Method getService = NotificationManager.class.getDeclaredMethod("getService");
      getService.setAccessible(true);
      Class iNotiMngClz = Class.forName("android.app.INotificationManager");
      Object proxyNotiMng = Proxy
          .newProxyInstance(context.getClass().getClassLoader(), new Class[]{iNotiMngClz}, new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                  Log.d("invoke(). method:{}", method.getName());
                  return null;
                }
              });
      Field sServiceField = NotificationManager.class.getDeclaredField("sService");
      sServiceField.setAccessible(true);
      sServiceField.set(notificationManager, proxyNotiMng);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }
}

HOOK注意事项:

  • Hook 静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。

  • 考虑 Android API 的变化,注意做好兼容

    原文作者:linchangjian_
    原文地址: https://blog.csdn.net/linchangjian_/article/details/79501296
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞