背景
Android系统的UI测试框架有Uiautomator1.0和Uiautomator2.0,虽然Uiautomator1.0在Android11及以后的版本被放弃了,但是我们仍然可以通过反射FrameWork代码初的方式始化Uiautomator1.0服务,这样我们原有的测试用例就可以继续运行了。
今天分享一下Uiautomator1.0与server app跨进程通信的方案,我们一般情况下都使用socket进行通信,但是当server app没有运行时就很难及时处理,我们让server app实现ContentProvider来对外提供服务,即使server app没有运行,我们也能正常调用服务,系统会自动帮我们启动server app。
在应用(server app)内提供ContentProvider服务是很简单的,但是Uiautomator1.0和其他Shell进程是没有办法直接访问的,我们需要依赖反射技术进行调用。
实现
server app 创建ContentProvider服务
package com.xxxx.xxxx.ticker.server;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
/**
* @author walker
* @date 2021/1/29.
* @description 对外提供ContentProvider接口
*/
public class CommonProvider_tme extends ContentProvider {
@Override
public boolean onCreate() {
init();
return false;
}
private void init() {
}
;
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return 0;
}
/**
* @author walker
* @Date 2021/3/11
* @Description: 如果需要附加信息,用此字段存储
*/
public static final String RES_DATA = "data";
/**
* @author walker
* @Date 2021/3/11
* @Description: int类型的处理码
* 200 流程处理结束
* 404 指定的方法名错误
* 100 调用服务的认证信息错误
* 500 业务错误
* 501 处理异常
*/
public static final String RES_CODE = "code";
/**
* @author walker
* @Date 2021/3/11
* @Description: 处理结果,提示处理的异常信息等
*/
public static final String RES_INFO = "info";
/**
* @author walker
* @Date 2021/1/29
* @Description: 对外提供call方法