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到最新的版本。(其實是感覺每次翻牆都有點麻煩。。)