Android P新版本出来以后,用uiautomatorViewer工具同步时,经常会报null root node returned by UiTestAutomationBridge.导致快照屏幕失败。
问题原因并不确认,网上绕了一圈,没查到个所以然,估摸着,这可能是谷歌的锅,毕竟人家盛产BUG,这,好吧,我啥都没说。
言归正传,这里提供一个方案来规避。
经过多次dump尝试,发现null root node returned by UiTestAutomationBridge.这个问题只是概率性问题,非必现,多尝试dump几次的话,便会成功,这就给了我们操作的空间。
思路清晰了,代码也就差不多到位了。基于UiautomatorViewer源码(二):持久化 和UiautomatorViewer源码(三):提升快照速度 代码上,在EasyScreenshotAction类中的内部类MyThread类中,添加了如下代码:
class MyThread extends Thread {
public String cmd="";
public MyThread(String cmdString) {
this.cmd=cmdString;
}
public void run() {
for (int i = 0; i <20; i++) {
String result="";
try {
cmd = "cmd /c "+cmd;
Process p =Runtime.getRuntime().exec(cmd);
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine())!= null){
System.out.println("SucessMsg_"+line);
result=result+line;
}
is = p.getErrorStream();
reader = new BufferedReader(new InputStreamReader(is));
while((line = reader.readLine())!= null){
System.out.println("ErrorrMsg_"+line);
result=result+line;
}
p.waitFor();
is.close();
reader.close();
p.destroy();
} catch (Exception e) {
e.printStackTrace();
}
if (result.contains(" null root")) {
System.out.println("Fail to dump UI hierarchy, try again , try time count:"+i);
continue;
}else {
System.out.println("Successful to dump UI hierarchy");
break;
}
}
}
}
这样,就解决了null root node returned by UiTestAutomationBridge的问题。如果有哪位大神有其他更好的解决方法的话,还望指教,小弟在此先行谢过。
总结:
Uiautomatorviewer源码和二次开发部分,写了四篇,到此算是暂告一段落了,后续如果有遇到新的问题,并且有了解决方案的话,仍然会更新,所以,可能还有五六七。。
Uiautomatorviewer这部分源码的开发,其实很早就做了的,只是一直没有发到博客上。所以可能源码的版本有点低,我也看过一些比较新的版本的源码,大体思路都是差不多的,但是代码风格好像不太一样了,个人怀疑,不同版本的代码应该不是同一个人or团队写的。这个工具写完之后,我自己一直在用,组内的其他同事也在用,大都在Android O 和Android P上陆陆续续遇到问题,又陆陆续续想法子解决。感觉已经够用,所以一直没有Update到最新的版本。(其实是感觉每次翻墙都有点麻烦。。)