使用AccessibilityService执行自动化脚本需在7.0以上
1.分析目标页面
众所周知,分析android页面可以使用Android Studio中的Layout Inspector,但是仅限于自己编译出来的页面,对于没有源码的apk就无能为力了。
下面分享下不需要源码就能分析目标页面的方法
方法1 adb shell uiautomator dump 然后pull出来可以看到当前页面的node布局树
方法2 进入android SDK 找到tools/bin/uiautomatorviewer 运行可以查看到目标页面
2.Web页面无法获取到node怎么分析
可以通过以下方法获取到web页面的node,但是class都是View,只能通过contentDescription获取到描述来分析。也可以执行点击(如果不执行那就用父节点执行点击)
在AccessibilityService 的xml配置文件中设置flagRequestEnhancedWebAccessibility及 android:canRequestEnhancedWebAccessibility="true"
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/operation_desc"
android:accessibilityEventTypes="typeAllMask"
android:packageNames="cn.xuexi.android"
android:accessibilityFeedbackType="feedbackAllMask"
android:notificationTimeout="500"
android:accessibilityFlags="flagRequestEnhancedWebAccessibility|flagDefault"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:canRequestTouchExplorationMode="true"
android:canRequestEnhancedWebAccessibility="true"
android:canPerformGestures="true"
/>
在onServiceConnected的时候设置AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY的flag
@Override
protected void onServiceConnected() {
super.onServiceConnected();
getServiceInfo().flags |= AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;
}
注意:修改后卸载apk重新安装,如果还是获取不到那就卸载后重启重新安装apk。
3.onKeyEvent不起作用
xml配置里需要添加
android:accessibilityFlags="flagRequestFilterKeyEvents"
但是只能监听到物理按键,对华为等下面有虚拟home recent键的就检测不到了
4.检测home键以及Recent键
在service的onCreate中注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(receiver,filter);
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String reason = intent.getStringExtra("reason");
Log.d(TAG,"onReceive "+reason);
if("homekey".equals(reason)) {
Log.d(TAG,"user click homekey");
} else if("recentapps".equals(reason)) {
Log.d(TAG,"user click recentapps");
}
}
};