目录
前言:
白盒测试是一种软件测试方法,它侧重于测试代码的内部结构和逻辑,而不是测试代码的外部行为。在 Android 平台上,Binder 是一种用于跨进程通信的 IPC(Inter-Process Communication)技术。通过使用 hook 技术,可以在 Binder 通信过程中进行白盒测试,以验证代码的正确性。
跨进程通信 demo
官网的例子在这:Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers
跨进程通信,所以至少有两个进程;通信,即 A 能调用 B 的方法,能成功 get/set
- 假如一个 app 只有一个进程的话,那就需要至少两个 app
- 假如只有一个 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 = tru