標籤:實用 root 核心技術 最新 檢查 建立 基於 更新 not
第一講分享了下安卓自己主動化一些概況和一些自己主動化架構現狀和技術可以解決什麼樣的問題。
這次課就深入到android世界裡面。遨遊、翱翔。深入瞭解自己主動化測試核心技術。
搞過編程開發的同學聽到instrumentation這個東西一定不陌生。在android架構裡面分四層(最以下是硬體驅動相關抽象層。不是筆者討論的內容約制),往上面一點是協議棧。也不是討論的核心,都和c語言相關。一直到第三層架構層(framework)。
細分有二:
A. android的改良虛擬機器dalvik和Runtime(java執行時環境)。這個我還要略微解釋下(懂的人請跳過),Google把java虛擬機器(pc上面的虛擬機器)進行改良,進行記憶體等最佳化,取消了遠程登入等功能。發展成為自己的虛擬機器。這樣做優點是把每一個獨立的進程進行虛擬機器封裝,從而進程崩潰不會影響system進程。保證了安卓系統穩定性。
B. Runtime是一個和外部程式的介面(有些地方叫協議)把非常多豐富的c++庫、3D和2D動畫、媒體庫、字型庫、sqilite等優良的特性引入到上層。
當一個android系統啟動的時候,載入完成守護進程和一些驅動等等步驟會調用init方法:Android的init進程為SIGCHLD綁定了訊號處理函數sigchld_handler()。並建立了一個socket用於接收該函數中發送的socket訊息。sigchld_handler()函數僅僅是簡單的派送一個訊息到該socket。
看得頭暈的同學請無視他們。
你僅僅要記住,c側的架構層載入完成,將要調用一個java層最根上的父類。就是Zygote。英文名字是孵化、受精卵,大意是生孩子。全部的進程都由它產生,它和系統服務結合共同產生ActivityManagerService、WindowsManagerService和DialogservicesManager等,由zygote控制它們和線程binder對象進行通訊,共同產生android四大組件(activity、broadcast、services、contentprovide)。在zygote建立process(線程)對象同一時候。我們最終看到幕後蠢蠢欲動的instrumentation。
饒了一大圈的蓋世太保最終出現了。它可以在全部組件的初始化之前產生,全部它可以監視全部組件資訊、狀態、變化、消亡等,當然,在監控之前。它會拿到這些組件的那個上下文引用(context),控制應用程式的多個生命週期。發送UI事件給應用程式;在運行期間檢查程式狀態。
這就是自己主動化最核心的技術—設計模式之監聽者模式。
在作業系統中。應用程式組件是控制項的父類。由instrumentation監控和擷取資訊。然後由instrumentationTestRunner來控制指令碼才進行一次自己主動化測試,你能夠在adb shell裡面執行這個指令碼,或者用eclipse+junit方法來執行指令碼。都是能夠的。
這裡的Instrumentation類。它可以監視應用程式跟系統的互動。Instrumentation對象會在應用的其它全部組件被執行個體化之前執行個體化。須要調用instrumentation類必須繼承android.app.instrumentation才幹使用它。
因為android的核心不是app,是activity。
這和ios蘋果大相徑庭。蘋果是delegate託付和發送訊息機製為主的MVC模型(視圖、控制器和模型)具體蘋果ios自己主動化測試文檔會在第9講以後問世。儘管android也有訊息,可是安卓的訊息通常是傳遞索引值對(key-_value),在安卓裡面叫bundle對象。是一種被泛型的字典。這裡順便提下後起之秀winphone 8。它的機制更詭異,是一種墓碑化休眠儲存機制(這個winphone自己主動化和單元測試會在第15講以後給大傢具體剖析)。正由於有了它,winphone為了達到它最好的使用者體驗,雖然是多線程,可是同一時間僅僅能有一個進行啟用狀態,正由於如此,它單核的機器效能和效率遠遠蓋過android和蘋果。所以說。做了三十年的作業系統的微軟水平真不是蓋的。使用者體驗等等都優越蘋果和android,雖然非常少人使用。
好,廢話少說,切入正題。
Instrumentation會去androidmanifest.XML找裡面注冊的activity、service等一些組件資訊,當然還會包含布局檔案layout裡面xml的組件和控制項在gen目錄裡面產生的R.java的id搜集而且儲存下來,這些id都以0x的16進位的int。能夠說是控制項的身份證資訊。你要是認為麻煩,能夠用hierarchyviewer去查看,順便提一下,用這個工具必須得root手機,當然筆者是不提倡把一個好的user版本號碼手機隨便刷成root,這裡要給買來的普通使用者手機正正名,root是開啟管理員su許可權,讓終端使用者有最高許可權去操作手機,不論什麼東西都有利有弊。弊端是你同一時候給了應用程式相相應的許可權:比方其它應用程式能夠跨進程訪問(這在android世界裡面是破壞了Google的整套設計規則),搞android開發的知道,進程之間不能隨便訪問和建立通訊。除非你開啟AIDL綁定的服務介面或者你在編譯手機的時候偷偷的把app簽名做成系統層級的簽名。
除此以外。在一般使用者權限做了非常多限制,大大的保證了你機器穩定性和安全性。可是你要root的話。非常多東西就不可控了。表現出來的現象是你手機莫名其妙重新啟動、死機、無響應。或者你操作不當誤刪除了實用的模組,比方打電話不小心卸載,你就僅僅能去又一次刷過機器,所以說,普通使用者還是不要隨便刷機,由於Google壓根就不限制你安裝應用程式,不像蘋果非得越獄才幹任意安裝應用。
當然你用自己主動化測試的時候也得在manifest申明。例如以
第一個紅箭頭這個帶.的ResultActivity前面省略了命名空間(android叫包名),由於就一個包。當然在真正測試demo裡面。大家還是要建立一個包名+test,測試完成刪除就好;
第二個uses-library,由於現有的基於控制項的instrumentation和興許給大家介紹的Robtium架構,是封裝了instrumentation的。都不能單獨進行測試,必須配合junit4(junit3已經廢棄。雖然能用,可是進階功能和annotation等須要junit4,這是一個中繼資料。也就是解釋資料的資料,不明確的同學能夠網上搜尋下,不是這次的重點。
(這個具體使用會在第5篇以後具體介紹))架構一起進行測試,所以這條語句就是為了匯入junit包。讓結果執行在junit架構裡面。
第三個紅箭頭就是蓋世太保,有了它我們就能夠隨時調用和給你見到布局檔案的菜單進行操作了,都不須要開許可權,當然你得統一簽名,由於測試源碼我們有,這步省略。(後面第7章會教大家不用源碼的方法),你能夠點擊,斷言,back等都是能夠的。
到此為止,自己主動化核心技術之中的一個---基於控制項的精髓就在此。以後大家別見市面上有多少種android自己主動化工具吹噓:能夠遠端控制、能夠滑鼠控制手機、能夠自己主動錄製指令碼。
是,可是不是他們本事高強。事實上都是調用了Google封裝instrumentation。所以厲害的還是Google。並非做自己主動化工具的人,不相信的同學能夠關注我興許的講座。我也隨便整合一個所謂的架構來執行自己主動化指令碼,做測試工作中的項目,到時候請大家拍磚。
^_^(除了第二種自己主動化核心技術---ORC和元素識別,會在第7篇以後給大家揭秘)
這次技術分享就到這裡,第三講主要給大家分享自己主動化測試鼻祖Monkey 的原理和靈活使用它的一些進階法則,靈活執行它能夠對測試起到非常大的協助。
金陽光自己主動化資料+視頻:
1.官網:http://www.goldensunshine.cc/
2.關注我新浪微博:金陽光woody
3.百度搜:金陽光 測試,找到金陽光老師視頻
4.很多其它最新視頻在qq群:212260449更新
5.資料csdn部落格:http://blog.csdn.net/haorenmin2008
6.金陽光公眾帳號:搜尋金陽光自己主動化
【金陽光測試】基於控制項核心技術探討---Android自己主動化系列(2)---2013年5月