溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于Android模擬器的調(diào)研

發(fā)布時間:2020-09-09 00:30:35 來源:網(wǎng)絡(luò) 閱讀:1677 作者:gloryflames 欄目:移動開發(fā)

面對02機器上pcdroid異常情況頻發(fā),已經(jīng)影響到自動化測試的穩(wěn)定性,因此,花了四天時間對當(dāng)前的Android模擬器進行調(diào)研,試圖去尋找一款性能穩(wěn)定,支持多系統(tǒng)版本的模擬器,從而解決當(dāng)前自動化測試多系統(tǒng)、多異常的問題。


      (一)初步思考

       我一直相信,當(dāng)前我們所面臨的窘境對于一些頂級團隊來說,可能已經(jīng)有完美的解決方案。起初對于Android模擬器的思考,還僅限于Android官方與SDK一起提供的模擬器,不過根據(jù)之前經(jīng)驗來說,官方的模擬器能解決多版本系統(tǒng)的問題,但是由于Android官方的模擬器使用了仿真技術(shù),在x86系統(tǒng)上模擬ARM指令集,從而導(dǎo)致性能低下,根本無法進行自動化操作。因此,起初基于這個優(yōu)化的構(gòu)想,發(fā)現(xiàn)了Android官網(wǎng)提供了基于模擬器的x86鏡像,不過由于最近g o o g l e服務(wù)器被封,并且android的服務(wù)器也在被封范圍之列,因此暫時放棄了這種想法。不過令人興奮的是,隨后發(fā)現(xiàn)google團隊的幾名工程師設(shè)計了一款基于VirtualBox的x86 Android模擬器,并且聲稱在性能上有質(zhì)的飛越。


    (二)溝通

       在這里不得不提一下溝通帶來的收益,首先是跟團購的QA溝通,發(fā)現(xiàn)團購那邊是使用Supserjs進行前端測試,superjs是基于phantomjs設(shè)計的一款前端自動化框架,由于內(nèi)核為webkit,并且支持在linux部署,因此成為了前端解決自動化測試限制的一種方式,不過對于更精確的webapp測試來說,存在以下兩個問題:首先,無法模擬定位,對于LBS業(yè)務(wù)來說,與定位相關(guān)功能的驗證會受到影響。其次,雖然同基于webkit內(nèi)核,但是仍然不能解決多系統(tǒng)版本的問題。同時,如果自動化測試改為superjs,勢必會導(dǎo)致自動化框架及用例的調(diào)整,投入產(chǎn)出比低。并且,對于superjs的折中方案,是使用ghostDriver,從而利用phantomjs解決因為機器導(dǎo)致的測試瓶頸,但是同樣存在不精確的問題。

      第二個溝通的人是爽姐,在溝通過程中,爽姐提到了之前曾經(jīng)用過一款g o o g l e的Android模擬器——genymotion。穩(wěn)定性還ok,執(zhí)行速度快(后面baidu了下才知道,這款模擬器據(jù)說是當(dāng)前最快的Android模擬器,堪比真機),但是之前只應(yīng)用在手工測試階段,對于genymotion投入自動化環(huán)境,還需要進一步調(diào)研。

      第三個溝通的是一位Android地圖客戶端的rd,溝通了下Android-x86的可行性,最后感覺都很“靠譜”,也就帶著一種試一試的態(tài)度,進行探索。(參看:http://www.oschina.net/question/12_32695)


     (三)模擬器安裝

      根據(jù)當(dāng)前思考的方案,進行了分析,從當(dāng)前情況上來看,首要解決的問題是將Android-86和genymotion的環(huán)境安裝完成。對于genymotion的環(huán)境搭建比較順利,直接http://www.genymotion.com/進入官網(wǎng),下載個人版,然后注冊賬號,下載模擬器,OK環(huán)境搞定。速度的確是相當(dāng)之快,支持的功能也比較全面,不過由于是個人版,沒有對api的支持,因此對于后續(xù)自動化持續(xù)集成工作,帶來了很大的難度。


基于Android模擬器的調(diào)研


        接下來是Android-x86的安裝,第一個遇到的問題是Android-x86官網(wǎng)(http://www.android-x86.org/)無法訪問了,google被墻后帶來資源的匱乏。無奈,先看看能不能通過其他途徑找到鏡像文件,不行也只能購買×××服務(wù)翻 墻了!~

        功夫不負(fù)有心人,下到了Android-x86-4.4 和 Android-x86-4.3的兩個鏡像。搜了一篇安裝x86虛擬機的帖子(參考:http://www.cnblogs.com/gao241/archive/2013/03/11/2953669.html),按照這個步驟一步一步往下捋,結(jié)果在第一步卡住了,每次按照鏡像就會重啟,鏡像無法正確安裝,后來修改了安裝的命令,在命令后面添加了 idle=poll操作,解決了安裝的問題。


基于Android模擬器的調(diào)研


      初步測試了下,這兩個環(huán)境的性能相當(dāng)棒,從啟動速度上來說,Android-x86保持在將近120秒,genymotion在160秒遜色于x86,從響應(yīng)速度來說,genymotion較x86好一些。


     (四)連接到設(shè)備

      當(dāng)虛擬機都安裝ok,下一個解決的問題是怎么將模擬器與adb連接起來。由于虛擬機的特殊性,不能通過usb監(jiān)測的方式進行連接,只能通過adb connect IP:<Port>的方式進行連接。以這種方式進行連接,首先要保證虛擬機的IP跟當(dāng)前機器在一個網(wǎng)段,同時要獲取到當(dāng)前機器的IP。 對于Android-x86來說,最方便的莫過于Alt+F1的控制臺,通過netcfg的方式直接獲取到IP,而genymotion就沒有控制臺了,后來發(fā)現(xiàn)通過genymotion的virtualbox虛擬機在啟動階段會顯示當(dāng)前機器的IP,OK,IP已經(jīng)獲取到了,接下來就是connect。

      不過沒有這么順利,connect連接不上機器,網(wǎng)上找了N多方法嘗試,仍然無法解決??酂o對策,但是填到酬勤,正如德國化學(xué)家凱庫勒夢到一條收尾相接的蛇而突然明白了苯環(huán)的結(jié)構(gòu),eclipse的Device視圖是否能連接上虛擬機呢?

      嘗試了下,正常的方式當(dāng)然是不能,后來從網(wǎng)上找到了一種設(shè)置IP的方式,然后經(jīng)由device中的reset進行重啟,就可以connect到虛擬設(shè)備了。


基于Android模擬器的調(diào)研

  

   (五)腳本化準(zhǔn)備

      能夠連接到設(shè)備,下面就可以進行自動化測試了。按照webdriver、端口映射、run,自動化case成功在虛擬機上執(zhí)行。初步評測穩(wěn)定性還算可以,美中不足是不能模擬定位。由于整個測試操作已經(jīng)打通,接下來的工作是如何將當(dāng)前的工作腳本化。

      啟動虛擬機,直接使用VirtualBox提供的命令 startvm即可啟動(參考http://blog.sina.com.cn/s/blog_4c451e0e0100smar.html)。但是connect的時候,之前是使用eclipse連接的,現(xiàn)在需要以腳本的方式connect。為了解決這個問題,在這里了解了下eclipse插件,找到了與android相關(guān)的幾個插件。



基于Android模擬器的調(diào)研

    Device窗口歸屬于DDMS視圖,因此DDMS插件也成為了主要關(guān)注的對象。使用XJar反編譯之,發(fā)現(xiàn)了驚喜。



基于Android模擬器的調(diào)研

打開文件,順藤摸瓜

基于Android模擬器的調(diào)研

基于Android模擬器的調(diào)研

。。。。最終找到在ddmlib.jar目錄中存在AndroidDebugBridge.java,存在reset方法可以滿足當(dāng)前需求。


基于Android模擬器的調(diào)研

        于是,簡單驗證之。

基于Android模擬器的調(diào)研

     不過通過這種方式只能連接一個虛擬機,后面了解到,可以結(jié)合adb tcpip + connect的方式對后續(xù)虛擬機進行連接。連接問題基本解決。


      (六)模擬定位

       最后一個難點,如何模擬GPS定位。這個問題困惑了我將近2天的時間。從網(wǎng)上找到的解決方案是先通過telnet命令登錄到虛擬機,然后經(jīng)由“geo fix 經(jīng)度 維度”的方式設(shè)定。但是在實踐過程中發(fā)現(xiàn),telnet無法登錄到genymotion和x86虛擬機,geo fix也無從下手。

       第二個實施方案同樣想到了DDMS中的EmulatorControl窗口,既然eclipse能支持模擬定位,那么就照葫蘆畫瓢。



基于Android模擬器的調(diào)研

     同樣使用了EmulatorControlConsole插件,發(fā)現(xiàn)僅有DeviceMonitor的類才能使用模擬定位操作,而虛擬機被Android認(rèn)定為Device,因此也不具備了模擬定位功能。

      方案三是通過Android自帶的tools目錄下的Emulator -gps 來實現(xiàn)模擬定位操作,后來也是出現(xiàn)了與方案二相同的原因而放棄。(參考:http://api.apkbus.com/guide/developing/tools/emulator.html)


       通過上面三種思考,可以說通過現(xiàn)有工具去解決模擬定位問題很難再有突破,此時開始從Android內(nèi)核著手,試著去模仿和制造模擬定位功能。通過查資料了解到GPS在Android中實現(xiàn)是基于nmea標(biāo)準(zhǔn)(國家海事電子協(xié)會文件)(參考http://android.tgbus.com/Android/tutorial/201204/418964.shtml)并了解到nmea的數(shù)據(jù)格式(參考:http://blog.csdn.net/highdam/article/details/2646291)。于是開始查Android文件結(jié)構(gòu)相關(guān)的文檔,找到了幾個與gps定位相關(guān)的文件,不過一直沒有找到所說的nmea目錄,于是想到了pcdroid一直在用的gpstool工具,由于時間比較晚了,就放到上班后去解決。

       Android源碼目錄結(jié)構(gòu)文檔 http://www.cnblogs.com/yyangblog/archive/2011/03/02/1968880.html

       Android操作系統(tǒng)結(jié)構(gòu)文檔 http://skynet86.blog.163.com/blog/static/17958121520111701719908/

       Android目錄結(jié)構(gòu) http://blog.csdn.net/chizhaolin/article/details/5722598

       Android源碼所有生成目錄 http://www.cnblogs.com/scue/p/3738882.html

      周一上班,與白宇溝通了下pcdroid模擬定位的問題,得到最大的收獲是給了我一個pcdroid的api文檔(參考http://pcdroid.baidu.com/api.php),文檔里面提供了一種新的模擬定位方式 adb shell gps 經(jīng)度 維度。通過adb shell命令查看了pcdroid內(nèi)核的system/bin目錄,發(fā)現(xiàn)兩個比較特別的文件,gps和agps.sh



基于Android模擬器的調(diào)研

基于Android模擬器的調(diào)研

pull下來發(fā)現(xiàn)是經(jīng)由gps調(diào)用agps.sh,通過查詢sqlite數(shù)據(jù)庫中的數(shù)據(jù),對gps數(shù)據(jù)進行設(shè)置。


基于Android模擬器的調(diào)研

稍后查了下Android關(guān)于GPS的實現(xiàn):

      Android GPS分析 http://blog.csdn.net/xnwyd/article/details/7198728

      Android GPS驅(qū)動模塊開發(fā) http://blog.csdn.net/vv0_0vv/article/details/7998596 

      Android GPS架構(gòu)分析 http://www.eefocus.com/chongzi865458/blog/2012-03/232232_50018.html

發(fā)現(xiàn)com.android.location.provider.jar包是Framework層實現(xiàn)。不過由于時間問題,現(xiàn)階段已經(jīng)沒有時間對這個jar包進行深入研究。修改Android系統(tǒng)涉及到的坑可能還有很多,在此暫時放棄了對Android內(nèi)核修改的調(diào)研。

      在準(zhǔn)備放棄模擬定位的同時,一個靈感對當(dāng)前情況產(chǎn)生逆轉(zhuǎn)。既然genymotion模擬器可以通過自帶的工具進行g(shù)ps模擬定位,那么我設(shè)置完畢之后,經(jīng)由虛擬機啟動會不會仍然可以定位呢?嘗試了下,答案是可以。整體上的技術(shù)難點已經(jīng)初步解決,接下來就是修改自動化腳本,試水genymotion新框架了。

基于Android模擬器的調(diào)研

基于Android模擬器的調(diào)研


續(xù):后面發(fā)現(xiàn)可以通過setProp設(shè)定系統(tǒng)的定位參數(shù)來完成模擬定位(上面那個是轉(zhuǎn)化為python腳本的截圖),從而也完成了多系統(tǒng)模擬器的調(diào)研工作,投入生產(chǎn)過程中。由于效率較優(yōu),自動化的速度從1小時30分左右提升到1小時20分,同時模擬器導(dǎo)致的穩(wěn)定性問題也大大降低。


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI