老李推薦:第8章2節《MonkeyRunner源碼剖析》MonkeyRunner啟動運行過程-解析處理命令行參數 2...

我們這一節會先去分析下monkeyrunner是如何對參數進行處理的,我們跳轉到MonkeyRunnerOptions這個類里面的processOptions這個方法:

93?? public static MonkeyRunnerOptions processOptions(String[] args)

?94?? {

?95???? int index = 0;

?96

?97???? String hostname = DEFAULT_MONKEY_SERVER_ADDRESS;

?98???? File scriptFile = null;

?99???? int port = DEFAULT_MONKEY_PORT;

100???? String backend = "adb";

101???? Level logLevel = Level.SEVERE;

102

103???? ImmutableList.Builder<File> pluginListBuilder = ImmutableList.builder();

104???? ImmutableList.Builder<String> argumentBuilder = ImmutableList.builder();

105???? while (index < args.length) {

106?????? String argument = args[(index++)];

107

108?????? if ("-s".equals(argument)) {

109???????? if (index == args.length) {

110?????????? printUsage("Missing Server after -s");

111?????????? return null;

112???????? }

113???????? hostname = args[(index++)];

114?????? }

115?????? else if ("-p".equals(argument))

116?????? {

117???????? if (index == args.length) {

118?????????? printUsage("Missing Server port after -p");

119?????????? return null;

120???????? }

121???????? port = Integer.parseInt(args[(index++)]);

122?????? }

123?????? else if ("-v".equals(argument))

124?????? {

125???????? if (index == args.length) {

126?????????? printUsage("Missing Log Level after -v");

127?????????? return null;

128???????? }

129

130???????? logLevel = Level.parse(args[(index++)]);

131?????? } else if ("-be".equals(argument))

132?????? {

133???????? if (index == args.length) {

134?????????? printUsage("Missing backend name after -be");

135?????????? return null;

136???????? }

137???????? backend = args[(index++)];

138?????? } else if ("-plugin".equals(argument))

139?????? {

140???????? if (index == args.length) {

141?????????? printUsage("Missing plugin path after -plugin");

142?????????? return null;

143???????? }

144???????? File plugin = new File(args[(index++)]);

145???????? if (!plugin.exists()) {

146?????????? printUsage("Plugin file doesn't exist");

147?????????? return null;

148???????? }

149

150???????? if (!plugin.canRead()) {

151?????????? printUsage("Can't read plugin file");

152?????????? return null;

153???????? }

154

155???????? pluginListBuilder.add(plugin);

156?????? } else if (!"-u".equals(argument))

157?????? {

158???????? if ((argument.startsWith("-")) && (scriptFile == null))

159???????? {

160

161

162?????????? printUsage("Unrecognized argument: " + argument + ".");

163?????????? return null;

164???????? }

165???????? if (scriptFile == null)

166???????? {

167

168?????????? scriptFile = new File(argument);

169?????????? if (!scriptFile.exists()) {

170???????????? printUsage("Can't open specified script file");

171???????????? return null;

172?????????? }

173?????????? if (!scriptFile.canRead()) {

174???????????? printUsage("Can't open specified script file");

175???????????? return null;

176???????? ??}

177???????? } else {

178?????????? argumentBuilder.add(argument);

179???????? }

180?????? }

181???? }

182

183???? return new MonkeyRunnerOptions(hostname,

port,

scriptFile,

backend,

logLevel,

pluginListBuilder.build(),

argumentBuilder.build());

184?? }

185 }

代碼8-2-2 MonkeyRunnerOptions? - processOptions

?

這里首先請看99-101行的幾個變量初始化,如果用戶在命令行中沒有指定對應的參數,那么這些默認參數就會被使用,我們且看下這些默認值分別是什么:

  • hostname:對應‘-s'參數,默認值是'127.0.0.1',也就是本機,將會forward給目標設備運行的monkey,所以加上下面的轉發port等同于目標機器在listen的monkey服務
  • port :對應‘-p'參數,默認值是'12345',也就是monkey默認監聽端口
  • backend :對應'-be'參數,默認值是‘adb‘,其實往后看代碼我們會發現它也只是支持’adb‘而已。這里需要注意的是這是一個隱藏參數,命令行的help沒有顯示該參數
  • logLevel :對應‘-v'參數,默認值'SEVERE',也就是說只打印嚴重的log

代碼往下就是對用戶輸入的參數的解析并保存了,這里要注意幾個隱藏的參數:

  • -u :乍一看以為這是一個什么特別的參數,從156-178行可以看到這個參數處理的意義是:當用戶輸入'-u'的時候不會作任何處理,但當用戶輸入的是由‘-’開始的但又不是monkeyrunner聲稱支持的那幾個參數的時候,就會根據不同的情況給用戶報錯。所以這段代碼的意思其實就是在用戶輸入了不支持的參數的時候根據不同的情況給用戶提示而已
  • -be :backend,如前所述,只支持‘adb'
  • -plugin :這里需要一個背景知識,在google官網有說明,用戶可以通過遵循一定的規范去編寫插件來擴展monkeyrunner的功能,比如在monkeydevice里面按下這個動作是需要通過MonkeyDevice.DOWN這個參數來傳給press這個方法的,如果你覺得這樣子不好,你希望增加個pressDown這樣的方法,里面默認就是用MonkeyDevice.DOWN來驅動MonkeyDevice的press方法,而用戶只需要給出坐標點就可以了,那么你就可以遵循google描述的規范去編寫一個這方面的插件,到時使用的時候就可以通過python方式直接import進來使用了。本書并不會把MonkeyRunner插件進行重點介紹。

在解析出所有的參數之后,processOptions方法最后根據這些參數來初始化MonkeyRunnerOptions類。我們進入到該構造函數看下它究竟做了什么事情:

38?? private MonkeyRunnerOptions(String hostname, int port, File scriptFile, String backend, Level logLevel, Collection<File> plugins, Collection<String> arguments)

?39?? {

?40???? this.hostname = hostname;

?41???? this.port = port;

?42???? this.scriptFile = scriptFile;

?43???? this.backend = backend;

?44???? this.logLevel = logLevel;

?45???? this.plugins = plugins;

?46???? this.arguments = arguments;

?47?? }

代碼8-2-3 MonkeyRunnerOptions - 構造函數

?

所做的事情非常簡單,就是把解析出來的所有參數保存到MonkeyRunnerOptions類的實例里面,今后需要的時候就進去拿就好了。

轉載于:https://www.cnblogs.com/poptest/p/5086377.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC CPropertySheet 多頁面切換 實例

為了能實現在同一個頁面實現多個頁面的切換效果。CPropertySheet要與CPropertyPage一起使用。 首先 新建一個MFC工程--MFC AppWizard(exe), 取名Pagesheet, 選擇Dialog based, 然后Finish. 2. 在對話框資源中插入兩個對話框IDD_DIALOG1、IDD_DIALOG2&#xff0c;作為…

ReactiveCocoa簡單介紹

ReactiveCocoa 的簡單介紹 http://www.jianshu.com/p/87ef6720a096

游戲提高性能 游戲降幀處理

什么是降幀&為什么降幀 一般情況下我們為了提高整個游戲的體驗&#xff0c;所以我們一般會將游戲的幀數&#xff08;每秒鐘刷新多少次&#xff09;設置的比較高。一般情況下&#xff0c;我們的游戲所有的代碼都是一幀執行一次。為了讓每一幀都變成真的關鍵數據幀。不過&…

delphi 更改DBGrid 顏色技巧

1、根據條件更改某一單元格的顏色 [delphi] view plaincopy procedure TMainFrm.First_DGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if DM.FirstListStatus.AsString生產 then begin …

mfc中UpdateData的用法

http://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到對應的變量。(外部輸入值交給內部變量)即&#xff1a;控件的值—>變量。UpdateData(FALSE)—— 拷貝變量值到控件顯示。(變量的最終運算結果值交給外部輸出顯示)即&#xff1a;…

動畫類的層次結構

CASpringAnimation類是CAABasicAnimation的子類 CAPropertyAnimation &#xff1a;是CAAnimation的子類&#xff0c;它支持動畫地顯示圖層的keyPath&#xff0c;一般不直接使用。 iOS9.0之后新增CASpringAnimation類&#xff0c;它實現彈簧效果的動畫&#xff0c;是CABasicAnim…

[原]小命令大作用:modprobe

調整網絡為綁定模式&#xff0c;但啟動時候會報錯&#xff0c;此時執行命令 modprobe bonding 可以解決問題。 之前在磁盤方面遇到問題也是通過modprobe命令解決的&#xff0c;又遇到這個命令&#xff0c;似曾相識。于是看下該命令&#xff1a; Linux命令&#xff1a;modprobe …

sql語句優化之not in

多表關聯想查a表中除去b表的可用not exists 效率比not in 更高 優化后的語句用時0.421秒 select john.*, (case when round((case john.sumcount when 0 then 0 else mycount * 100 / sumcount end), 2) > 100 then 100 else round((case john.sumcount when 0 then 0 else …

setup2go制作安裝程序

QT程序設計完畢時&#xff0c;我們就要發布自己的程序&#xff0c;發布程序有兩種方法&#xff1a;一是靜態編譯&#xff0c;二是制作程序安裝包。 靜態編譯好麻煩&#xff0c;我從來沒有成功過&#xff0c;所以我用了動態編譯方法&#xff0c;設計完成時&#xff0c;用release…

gson-2.2.api簡單

使用gson的tojson和fromjson實現對象和json的轉換 Gson gson new Gson(); // Or use new GsonBuilder().create(); MyType target new MyType(); String json gson.toJson(target); // serializes target to Json MyType target2 gson.fromJson(json, MyType.c…

用戶需求、己、競爭對手的關系

圖一 圖二 圖三 如第一圖所示&#xff1a;現在在市面上的產品基本上都可以歸納為這一方面&#xff0c; 如“用戶需求”是網上購物的需求&#xff0c;以“己”是京東為例子&#xff0c;“己”的…

SharePoint 入門介紹

from&#xff1a;http://www.cnblogs.com/jianyus/archive/2013/01/11/2856963.html 前言&#xff1a;接觸SharePoint兩年有余&#xff0c;從一開始的小白&#xff0c;變成現在的菜鳥&#xff0c;一路走來&#xff0c;學到很多&#xff0c;現在&#xff0c;想把自己知道的東西&…

AJAX-服務器響應

服務器響應 如需獲得來自服務器的響應&#xff0c;請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。 屬性 描述 responseText 獲得字符串形式的響應數據。 responseXML 獲得 XML 形式的響應數據。 responseText 屬性 如果來自服務器的響應并非 XML&#xff0c…

c#下不同命名空間的引用(一個project使用另外一個project的名稱空間)

http://bbs.csdn.net/topics/300089064 兩個命名空間在同一個項目中時&#xff0c;沒有任何問題。 若兩個命名空間不在同一個項目中&#xff0c;則變成兩個程序集之間的互相引用。 程序集之間的引用無所謂循環不循環的問題。 但如果兩個程序集要互相引用&#xff0c;并且兩個…

數據結構比較型排序算法分析及選擇

比較型算法分為五類&#xff1a; 1、插入排序&#xff1a;直接插入排序、折半插入排序、希爾排序&#xff1b; 2、選擇排序&#xff1a;直接選擇排序、堆排序&#xff1b; 3、交換排序&#xff1a;快速排序、冒泡排序&#xff1b; 4、歸并排序&#xff1b; 5、基數排序&#xf…

onreadystatechange 事件

onreadystatechange 事件 當請求被發送到服務器時&#xff0c;我們需要執行一些基于響應的任務。 每當 readyState 改變時&#xff0c;就會觸發 onreadystatechange 事件。 readyState 屬性存有 XMLHttpRequest 的狀態信息。 下面是 XMLHttpRequest 對象的三個重要的屬性&#…

Frequent Pattern 挖掘之二(FP Growth算法)(轉)

FP樹構造 FP Growth算法利用了巧妙的數據結構&#xff0c;大大降低了Aproir挖掘算法的代價&#xff0c;他不需要不斷得生成候選項目隊列和不斷得掃描整個數據庫進行比對。為了達到這樣的效果&#xff0c;它采用了一種簡潔的數據結構&#xff0c;叫做frequent-pattern tree(頻繁…

C# 兩個類之間傳遞數據

1、通過全局變量 2、通過構造函數傳遞參數 3、通過委托實現通過委托例子&#xff1a;WebForm1 向Class1傳遞參數值&#xff1a; // namespace WebApplication2{public partial class WebForm1 : System.Web.UI.Page{//step1.聲明一個委托public delegate void DoSomethingEvent…

可行性研究課后題

題目: 為方便儲戶&#xff0c;某銀行擬開發計算機儲蓄管理系統。儲戶填寫的存款單或取款單由銀行柜臺業務員鍵入系統&#xff0c;如果是存款&#xff0c;系統記錄存款人姓名、住址、存款類型、存款日期、利息等信息&#xff0c;并印出存款單給儲戶;如果是取款&#xff0c;系統進…

jQuery語法

jQuery不是W3C標準&#xff01; jQuery使用CSS選擇器來選取元素。 jQuery語法 一、jury語法是為HTML元素的選取編制的&#xff0c;可以對元素執行某些操作。 基礎語法是&#xff1a;$(selector).action() .美元符號定義jQuery .選擇符&#xff08;selector&#xff09;“查…