用 hook 做测试之 Binder 跨进程通信

本文介绍了Android平台中的Binder机制,它是实现跨进程通信的方式。通过一个简单的服务端和客户端应用示例,展示了如何使用AIDL进行Binder通信。文章详细解释了Binder的工作流程,包括Binder驱动在进程间通信中的作用,以及服务端和客户端如何持有Binder对象。最后,文章再次强调了Binder在自动化测试中的重要性。
摘要由CSDN通过智能技术生成

目录

引言

跨进程通信 demo

Binder

Demo again


引言

在 Android 平台中,Binder 是一种跨进程通信的方式,它可以让不同的进程之间共享数据和服务。但是,由于 Binder 是基于内存共享的,所以它的性能和安全性都有一定的限制。在测试中,我们需要一种方法来模拟 Binder 通信,以便快速发现和解决问题。

跨进程通信 demo

官网的例子在这:Android 接口定义语言 (AIDL)  |  Android 开发者  |  Android Developers

跨进程通信,所以至少有两个进程;通信,即 A 能调用 B 的方法,能成功 get/set

  1. 假如一个 app 只有一个进程的话,那就需要至少两个 app
  2. 假如只有一个 app,那这个 app 除了主进程之外,应该还有另外的进程。 这种情况其实很常见,例如,我们经常需要把自己写的 Service 运行在一个单独的进程,在 manifest 里用 process = “XXXProcess” 来标记它。这种方式通常作为一种 workaround(比如突破 android 6.0+ 的 doze 模式)

我们采用第一种,即两个 app 之间的通信,下面是两个 app 的项目结构:

app 是服务端,为了要声明它可以提供的服务,需要定义一个 aidl 的接口,这里的步骤就不赘述了,详见官网,完成后,声明的接口如下:

interface IAppServiceRemoteBinder {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);

    void setData(String data);
}

作为服务端,app 里面需要定义一个 Service 类,即app.MyService,代码如下:

package com.fenfenzhong.aboutaidl;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;

public class MyService extends Service {
    public MyService() {
    }

    private String data = "default";

    public void setData(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        System.out.println("service binded");
        return new  IAppServiceRemoteBinder.Stub() {
            @Override
            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

            }

            @Override
            public void setData(String data) throws RemoteException {
                MyService.this.setData(data);
            }
        };
    }

    @Override
    public boolean onUnbind(Intent intent)
    {
        System.out.println("service unbinded");
        return true;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        serviceRunning = true;
        System.out.p
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值