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

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文件了:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值