拦截安卓app跳转浏览器打开某个网址的请求 hook

参考自:

https://blog.csdn.net/sunyao19940708/article/details/80021252?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

直接加到application中,oncreate中()调用

private void hook() {
        try {
            // 还原 gDefault() 成员
            Class activityManagerNative = Class.forName("android.app.ActivityManagerNative");
            // 获取到成员变量
            Field gDefault = activityManagerNative.getDeclaredField("gDefault");
            gDefault.setAccessible(true);
            // 获取类成员变量,直接传空,因为是静态变量,所以获取到的是系统值,
            // 得到Singleton 静态类,
            Object defaultValue = gDefault.get(null);
            //mInstance对象
            Class<?> singletonClass=Class.forName("android.util.Singleton");
            Field mInstance = singletonClass.getDeclaredField("mInstance");
            mInstance.setAccessible(true);
            // 获取到成员变量
            Object iActivityManagerObject = mInstance.get(defaultValue);

            // 实现该接口
            Class iActivityManagerIntercept = Class.forName("android.app.IActivityManager");
            StartActivity startActivity = new StartActivity(iActivityManagerObject);
            /**
             * ClassLoader loader  当前的类加载器
             * Class<?>[] interfaces  返回的类将会实现的接口
             * InvocationHandler h 实现了InvocationHandler 接口的代理类,以便实现系统分发出来的方法,实现拦截操作
             */
            Object oldIActivityManager = Proxy.newProxyInstance(
                    Thread.currentThread().getContextClassLoader(),
                    new Class[]{iActivityManagerIntercept},
                    startActivity
            );
            // 将我们获取到的值设置进去
            mInstance.set(defaultValue, oldIActivityManager);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

新建startActyivity类

package com.mouxiugas.xian;

import android.content.Intent;
import android.util.Log;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @user XUNUA
 * @email xunua@outlook.com
 * @creat time 2020/7/22 10:00
 */
class StartActivity implements InvocationHandler {
    private Object iActivityManager;

    public StartActivity(Object iActivityManager) {
        this.iActivityManager = iActivityManager;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if ("startActivity".equals(method.getName())) {
            final Intent intent = (Intent) args[2];
            if (intent != null) {
                if ("android.intent.action.VIEW".equals(intent.getAction())){
                    final String s = intent.getData().toString();
                    Log.d("Ellison", "---------startActivity----------"+ s);
                    //这里判断s是不是我们要拦截跳转的url
                    if (s.equals("https://hydrozoa.felisworks.com/")|| s.equals("http://silversecond.com/")|| s.equals("https://hydrozoa.felisworks.com/")){
                    //是的话,那么就使这两个参数 iActivityManager   args为空  这样就不会执行跳转
                    //也可以去掉if语句,那样的话就是拦截所有的打开浏览器请求
                        iActivityManager=null;args=null;
                    }
                }
            }
        }
        return method.invoke(iActivityManager, args);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值