sigck(2.Binder机制和远程服务调用机制)

来源:互联网 发布:音乐间谍类似软件 编辑:程序博客网 时间:2024/05/16 06:40

1.前景摘要

最近要实现Android中免注册Activity就可以运行的问题,那么结果是搞定了,就是可以不用在AndroidManifest.xml中声明这个Activity即可运行,主要是通过骗取系统,偷龙转凤技术的,这个知识点后面会详细讲解的,因为在研究了这个问题过程中遇到了很多知识点,当然最重要也是最根本的就是Android中的Binder机制和远程服务调用机制,而关于Binder机制的话,在Android中算是一个非常大的系统架构模块了,光这篇文章是肯定不能讲解到全部的,而且本人也不是非常的熟悉Binder机制,只是发表个人的理解,并且会用最简单的语言讲解最核心的知识,因为现在有很多知识都在介绍Binder机制,但是大部分说的都太抽象了大部分都看不懂。

二、具体需求

接下来几篇主要是介绍关于Android中的应用启动流程,通过Hook机制拦截Activity的启动流程,达到我们想要的功能,同时可以实现Activity无需在AndroidManifest.xml中声明即可运行的效果

三、Android中远程服务调用分析

我们如果做过多进程之间通信的话都了解远程服务的使用了,使用也是非常简单的,下面来看一下如何定义自己的远程服务:

1、定义一个AIDL文件

类似于定义接口类型,这个AIDL文件将在本地和远端都要使用到:
Demo.aidl

package cn.wjdiankong.hookdemo;interface Demo{    int sendData(String data);    String getData();}

2、定义远端服务

在远程服务中的onBind方法,实现AIDL接口的具体方法,并且返回Binder对象:

//远程服务public class DemoService extends Service{    @Override    public IBinder onBind(Intent intent){        //返回远端的Binder对象,并且实现类        return new Demo.Stub(){            @Override            public int sendData(String data) throws RemoteException{                return 0;            }            public String getData() throws RemoteException{                return "";            }        };    }}

3、本地创建连接对象

本地创建一个服务连接对象,实现ServiceConnection接口,在连接成功后,会得到一个远端传递过来的Binder对象,就是上面的远端服务onBind方法返回的,得到Binder对象之后在进行转化就可以得到AIDL对象,然后即可调用方法:

//连接远端服务的回调public class DemoConnection implements ServiceConnection{    @Override    public void onServiceConnected(ComponentName name,IBinder service){        //连接成功后,会传递远端的Binder对象,然后再转化成本地接口对象即可调用方法        Demo demo=Demo.Stub.asInterface(service);        try{            demo.sendData("");            demo.getData();        }catch (RemoteException e){            e.printStackTrace();        }    }    @override    public void onServiceDisconnected(ComponentName){        //断开连接    }}

4、连接服务

连接服务也是比较简单的,这时候把上面的连接对象传递进去即可

Intent intent=new Intent(this,DemoService.class);bindService(intent,new DemoConnection(),Context.BIND_AUTO_CREATE);

到这里我们就看到完成了本地端和远端的通信了,如果把DemoService远端服务定义在另外一个进程中,那么这里就可以实现多进程通信了。看到上面的步骤很简单,但是有一个核心的地方就是Demo.Stub类,这个类起着重要的作用,下面来分析一下他的实现,每次定义了AIDL接口文件之后,编译一下就会在gen目录中产生对应的java文件了:

这里写图片描述

阅读全文
0 0
原创粉丝点击