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