android程序员hook技术之入门篇( 三 )

  • Proxy.newProxyInstance的使用 Proxy.newProxyInstance的3个参数依次分别是:本地的类加载器; 代理类的对象所继承的接口(用Class数组表示,支持多个接口) 代理类的实际逻辑,封装在new出来的 InvocationHandler内 到这里,最后一步,也完成了.
  • 六. 效果展示
    先给出Demo:GithubDemo当我点击这个 hello World:

    android程序员hook技术之入门篇

    文章插图
     

    弹出一个 Toast,并且:在日志中可以看到

    android程序员hook技术之入门篇

    文章插图
     
     同时我并没有改动 setOnClickListener的代码,我只是在它的后面,加了一行 HookSetOnClickListenerHelper.hook(this,v);
    1. v.setOnClickListener(new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. Toast.makeText(MainActivity.this, "别点啦,再点我咬你了...", Toast.LENGTH_SHORT).show();
    5. }
    6. });
    7. HookSetOnClickListenerHelper.hook(this, v);//这个hook的作用,是 用我们自己创建的点击事件代理对象,替换掉之前的点击事件 。
    </pre>
    ok,目的达成 v.setOnClickListener已经被 hook.
    前方有坑,高能提示:我曾经尝试,是不是可以将上面两段代码换个顺序.结果证明,换了之后,hook就不管用了,原因是,hook方法的作用,是将v已有的点击事件,替换成我们代理的点击事件 。所以,在v还没有点击事件的时候进行hook,是没用的
    结语
    Hook的水很深,这个只是一个入门级的案例,我写这个,目的是说明hook技术的套路,不管我们要hook源码的哪一段逻辑,都逃不过 hook通用思路 这“三板斧”,套路掌握了,就有能力学习更难的Hook技术.Hook的学习,需要我们大量地阅读源码,要对SDK有较为深入的了解,再也不是浮于表面,只会对SDK的api进行调用,而是真正地干涉“造物主谷歌”的既定规则. 学习难度很大,但是收益也不小,高级开发和初中级开发的薪资差距巨大,职场竞争力也不可同日而语.
    你的赞和关注是我继续创作的动力~

    【android程序员hook技术之入门篇】


    推荐阅读