星云精準(zhǔn)測(cè)試對(duì)安卓底層驅(qū)動(dòng)代碼的測(cè)試案例分析

      網(wǎng)友投稿 702 2022-05-30

      Android原生底層驅(qū)動(dòng)應(yīng)用面極廣,但一直沒(méi)有很好的辦法進(jìn)行質(zhì)量追蹤。本文借助星云精準(zhǔn)測(cè)試的高可靠性的測(cè)試技術(shù)手段,針對(duì)Android原生底層驅(qū)動(dòng)進(jìn)行分析、插樁、編譯、采集數(shù)據(jù)、數(shù)據(jù)分析等,逐步講解精準(zhǔn)測(cè)試是如何實(shí)現(xiàn)android原生底層驅(qū)動(dòng)的對(duì)接。

      在本文中,我們可以清晰地查看到如何進(jìn)行技術(shù)對(duì)接的每一步,比如如何使用星云精準(zhǔn)測(cè)試進(jìn)行代碼插樁、實(shí)現(xiàn)測(cè)試用例與采集底層驅(qū)動(dòng)運(yùn)行代碼的數(shù)據(jù)追溯、對(duì)最終采集的數(shù)據(jù)進(jìn)行一系列分析等。

      星云精準(zhǔn)測(cè)試對(duì)安卓底層驅(qū)動(dòng)代碼的測(cè)試案例分析

      一、安卓源碼精準(zhǔn)測(cè)試流程概述

      經(jīng)分析android源碼的編譯主要依靠Android.bp為紐帶連接起來(lái);在編譯時(shí),只需要在想要編譯的模塊目錄下執(zhí)行mm命令即可自動(dòng)的根據(jù)當(dāng)前目錄下的Android.bp文件對(duì)其所包含的模塊進(jìn)行編譯。

      主要流程大致為:先將ZOA通信庫(kù)源碼復(fù)制進(jìn)去并加入某一層次的Android.bp中,再通過(guò)對(duì)包含所有Android.bp編譯信息的ninja文件的解析可以得到Shell認(rèn)可的插樁json文件,Shell通過(guò)json文件對(duì)對(duì)應(yīng)目錄的代碼進(jìn)行插樁,插樁完成后,把對(duì)ZOA通信庫(kù)的引用加入該模塊的Android.bp中再放入ZoaInstru.h頭文件后就可以正常編譯出插樁程序了。

      二、對(duì)安卓源碼進(jìn)行精準(zhǔn)測(cè)試的準(zhǔn)備工具

      1.安卓原生8.1.0系統(tǒng)源碼,放于/data/source2/目錄下

      2.shell.tar.gz插樁工具包放于/data/目錄下

      3.ZOAMQLib通信庫(kù)源碼放于/data/source2/ frameworks/av/目錄下

      4.谷歌官方裝有原生8.1.0系統(tǒng)手機(jī)一部

      本例是對(duì)/data/source2/ frameworks/av/camera模塊進(jìn)行插樁編譯,首先source build/envsetup.sh配置環(huán)境變量,再lunch后輸入2選擇aosp_arm64-eng,再mm編譯模塊

      三、精準(zhǔn)測(cè)試插樁工具部署

      在存放精準(zhǔn)測(cè)試插樁工具包的/data/目錄下執(zhí)行命令

      tar -zxvf shell.tar.gz

      將精準(zhǔn)測(cè)試插樁工具包解壓

      cd /data/shell/bin

      進(jìn)入shell包bin目錄下打開(kāi)并修改Server.cfg的[SERVER]字段的ip為星云精準(zhǔn)測(cè)試服務(wù)端ip,對(duì)[LOCAL]字段的ip,客戶端若與服務(wù)端在同一主機(jī)則保持127.0.0.1,若在不同主機(jī)則寫(xiě)明客戶端ip。

      四、ZOA通信庫(kù)加入安卓體系

      本次選擇av模塊進(jìn)行精準(zhǔn)測(cè)試的插樁編譯驗(yàn)證模塊,在對(duì)av模塊進(jìn)行深入了解后,解析出其Android,bp的連接其結(jié)構(gòu)大致如此,每一個(gè)最終節(jié)點(diǎn)就代表會(huì)生成一個(gè)動(dòng)態(tài)庫(kù)或者靜態(tài)庫(kù)。

      av大致結(jié)構(gòu)與ZOA通信庫(kù)加入安卓體系示意圖:

      注:由于第二層mediadrm模塊庫(kù)目錄過(guò)多不便展開(kāi),但原理又是相同,所以僅對(duì)該模塊展示骨架信息;綠色部分代表會(huì)產(chǎn)生一個(gè)庫(kù)文件,mediadrm只是骨架結(jié)構(gòu)所以未標(biāo)識(shí)。

      本次是將寫(xiě)好對(duì)應(yīng)的Android.bp文件的ZOA通信庫(kù)源代碼目錄整個(gè)復(fù)制到av目錄下,并在av目錄下的Android.bp文件中加入ZOA通信庫(kù)的目錄。

      cd /data/source2/frameworks/av/

      進(jìn)入av模塊

      vi Android.bp

      打開(kāi)av模塊的Android.bp文件,并將ZOAMQLib目錄加入其中

      ZOA通信庫(kù)加入av模塊的Android.bp圖示:

      然后在ZOAMQLib目錄下直接執(zhí)行mm命令,編譯出安卓體系下的ZOA通信庫(kù)。

      五、插樁編譯流程

      1.生成json文件

      android源碼在進(jìn)行編譯時(shí)他會(huì)將所有的Android.bp中的信息提取出來(lái)并添加一些編譯信息來(lái)生成一個(gè)build.ninja文件。該文件中含有編譯的模塊、源代碼和編譯參數(shù)等信息。

      通過(guò)android自帶的ninja工具可以將該build.ninja文件轉(zhuǎn)化為包含源代碼路徑、源代碼名字和編譯參數(shù)信息的json文件;再通過(guò)工具可以將要插樁模塊的部分提取出來(lái)生成該模塊的插樁json文件

      生成json文件的命令:

      /data/source2/prebuilts/build-tools/linux-x86/bin/ninja -t compdb g.cc.cc? > compile_commands.json

      其中/data/source2/為安卓源代碼路徑

      2.插樁代碼

      shell編譯器可以通過(guò)該json文件對(duì)該模塊進(jìn)行插樁或還原操作。

      插樁代碼命令 shell的路徑/shell -p json文件的路徑/ compile_commands.json

      還原代碼命令 shell的路徑/shell -r json文件的路徑/ compile_commands.json

      本次插樁與還原命令:

      /data/shell/bin/shell -p /data/source2/compile_commands.json

      /data/shell/bin/shell -r /data/source2/compile_commands.json

      插樁成功后在客戶端重新加載版本數(shù)據(jù):

      3.編譯鏈接

      cd /data/source2/frameworks/av/camera進(jìn)入camera目錄下

      vi Android.bp

      打開(kāi)camera模塊的Android.bp文件并在shared_libs中加入ZOA通信庫(kù)的名字

      camera的Android.bp加入ZOA通信庫(kù)鏈接圖示:

      cp /data/shell/include/ZoaInstru.h /data/source2/frameworks/av/camera/include/

      將ZOA的頭文件加入被? 插樁的camera的頭文件夾中

      然后就可以按照正常的編譯流程來(lái)進(jìn)行編譯,執(zhí)行mm編譯該模塊。

      六、測(cè)試方式

      本例是將安卓原生8.1.0代碼進(jìn)行插樁后,放入谷歌官方8.1.0系統(tǒng)并獲得root權(quán)限的手機(jī)中進(jìn)行測(cè)試

      本次插樁的是av模塊的camera部分,所以我們將

      camera模塊庫(kù):

      /data/source2/out/soong/.intermediates/frameworks/av/camera/libcamera_client/android_arm64_armv8-a_shared_core/libcamera_client.so

      ZOA通信庫(kù):

      /data/source2/out/soong/.intermediates/frameworks/av/ZOAMQLib/libZOAMQLib/android_arm64_armv8-a_shared_core /libZOAMQLib.so

      這兩個(gè)庫(kù)放進(jìn)手機(jī)的/system/lib64/目錄中開(kāi)機(jī)進(jìn)行相機(jī)測(cè)試。

      測(cè)試概念圖:

      將被測(cè)手機(jī)開(kāi)機(jī)后用usb線連接到電腦上,采用adb端口映射的方法將程序運(yùn)行時(shí)產(chǎn)生的動(dòng)態(tài)數(shù)據(jù)傳輸?shù)叫窃凭珳?zhǔn)測(cè)試工具上,再通過(guò)示波器進(jìn)行波形展示。

      數(shù)據(jù)傳輸圖:

      在星云精準(zhǔn)測(cè)試工具客戶端打開(kāi)示波器界面,建立測(cè)試用例并選擇測(cè)試用例后點(diǎn)擊 開(kāi)始 并對(duì)手機(jī)進(jìn)行相機(jī)功能的操作就可以在接收到動(dòng)態(tài)數(shù)據(jù)并示波器看到波形了。

      示波器接收數(shù)據(jù)圖:

      七、精準(zhǔn)測(cè)試-基礎(chǔ)功能

      1.覆蓋率

      在對(duì)測(cè)試用例錄制完成后就可以在主界面看到覆蓋率等相關(guān)信息。

      在函數(shù)列表中隨便點(diǎn)開(kāi)一個(gè)函數(shù)就可以查看該函數(shù)的各項(xiàng)覆蓋率。

      1.SCO覆蓋率

      SCO覆蓋率即為語(yǔ)句塊覆蓋率,在函數(shù)內(nèi)順序執(zhí)行遇見(jiàn)if、for、while等就算為一個(gè)語(yǔ)句塊。

      SC0覆蓋率圖示:

      2.MCDC覆蓋率

      MCDC 修訂條件判定覆蓋,精準(zhǔn)測(cè)試中對(duì)mcdc做了量化展示,分別統(tǒng)計(jì)單一條件個(gè)數(shù),針對(duì)每一個(gè)條件判斷是否滿足mcdc覆蓋如果滿足如上圖綠色表示條件滿足mcdc覆蓋,藍(lán)色表示不滿足。并對(duì)MCDC做了詳細(xì)信息的展示(選擇MCDC覆蓋,點(diǎn)擊判定,顯示MCDC的詳細(xì)信息)

      MCDC覆蓋率圖示:

      注:

      1.覆蓋率信息一共有七種,分別為SCO語(yǔ)句塊覆率、True、Flase、Both等條件覆蓋率、Branch條件分支覆蓋率、CDC條件判定覆蓋率、MCDC修正條件判定。

      2.精準(zhǔn)測(cè)試默認(rèn)是不關(guān)聯(lián)源碼的,如需要關(guān)聯(lián)源代碼使用,請(qǐng)將源碼復(fù)制到客戶端本地,在版本上右鍵選擇修改源碼路徑,然后添加源碼路徑來(lái)關(guān)聯(lián)源碼。

      2.函數(shù)調(diào)用關(guān)系圖

      函數(shù)調(diào)用圖,只有函數(shù)調(diào)用的關(guān)系,能夠比較清楚地看清函數(shù)調(diào)用的層次關(guān)系。當(dāng)點(diǎn)擊其中的某個(gè)函數(shù)時(shí),能顯示以該函數(shù)為中心,調(diào)用該函數(shù)的上三層和下三層調(diào)用(可點(diǎn)擊設(shè)置層級(jí)進(jìn)行層級(jí)的調(diào)整)。

      當(dāng)接收過(guò)動(dòng)態(tài)數(shù)據(jù)后還能將各項(xiàng)數(shù)據(jù)顯示在圖像界面中。

      3.程序控制流程圖

      控制流程圖基礎(chǔ)功能是展示函數(shù)的控制流程,即控制流程圖,用于表示函數(shù)的控制流程、顯示測(cè)試覆蓋率結(jié)果、實(shí)現(xiàn)半自動(dòng)高效率測(cè)試用例設(shè)計(jì),進(jìn)行邏輯流程查錯(cuò),以及源碼、測(cè)試用例和相關(guān)文檔之間的雙向自動(dòng)追溯等。

      4.簡(jiǎn)易控制流程圖

      簡(jiǎn)易控制流程圖功能,以語(yǔ)句塊的形式清晰的展示函數(shù)內(nèi)部的控制邏輯,界面上可以直觀的看出控制流各節(jié)點(diǎn)的測(cè)試覆蓋情況,在展示中,簡(jiǎn)易控制流程圖還可以通過(guò)顏色對(duì)每個(gè)程序塊進(jìn)行覆蓋率標(biāo)識(shí),在縮略圖中整個(gè)模塊的覆蓋率非常直觀。(背景色為綠色表示有測(cè)試用例覆蓋到該塊)關(guān)聯(lián)源碼后點(diǎn)擊語(yǔ)句塊可定位到代碼具體行。

      5.雙向追溯

      由于精準(zhǔn)測(cè)試的測(cè)試用例與執(zhí)行過(guò)的函數(shù)綁定,可以在測(cè)試臺(tái)通過(guò)選擇不同的測(cè)試用例來(lái)正向追溯找到它執(zhí)行過(guò)的函數(shù);或者通過(guò)選擇不同的函數(shù)或代碼來(lái)反向追溯找到執(zhí)行過(guò)它的測(cè)試用例。

      正向追溯圖示:

      該正向追溯是通過(guò)在左上側(cè)選擇測(cè)試用例來(lái)在下方展示該測(cè)試用例運(yùn)行過(guò)的函數(shù)

      反向追溯圖示:

      反向追溯既可以通過(guò)左下角的函數(shù)來(lái)追溯運(yùn)行過(guò)該函數(shù)的測(cè)試用例,還可以通過(guò)選擇代碼塊來(lái)追溯運(yùn)行過(guò)該塊的測(cè)試用例。

      八、精準(zhǔn)測(cè)試-高級(jí)分析功能

      1.智能回歸測(cè)試用例選取

      在第一個(gè)版本測(cè)試完成后對(duì)第二個(gè)版本進(jìn)行插樁后就在星云精準(zhǔn)測(cè)試工具生成了第二個(gè)工程版本。此時(shí)我們要做的不是立馬對(duì)新版本進(jìn)行測(cè)試,而是使用我們星云精準(zhǔn)測(cè)試的回歸功能對(duì)新插樁的版本進(jìn)行回歸,它會(huì)根據(jù)版本之間代碼的變化的來(lái)分析出與該函數(shù)相關(guān)的測(cè)試用例,然后根據(jù)測(cè)試用例內(nèi)函數(shù)改變的多少進(jìn)行回歸優(yōu)先級(jí)的排序,智能的推薦出需要重新跑的測(cè)試用例,以及顯示出不需要跑的測(cè)試用例。

      智能回歸示例:

      cd /data/source2/frameworks/av/camera進(jìn)入到camera目錄下

      vi ICamera.cpp打開(kāi)該源碼進(jìn)行修改

      在getParameters函數(shù)中加入if(1==1);條件

      然后對(duì)camera模塊進(jìn)行插樁,再在客戶端使用選取回歸測(cè)試用例功能進(jìn)行回歸

      由于getParameters函數(shù)內(nèi)新增條件發(fā)生變化,所以運(yùn)行過(guò)該函數(shù)的測(cè)試用例的回歸計(jì)數(shù)就加一,然后該測(cè)試用例就被推薦出來(lái)需要重新去跑一遍。

      回歸圖示:

      對(duì)精準(zhǔn)測(cè)試而言,其是采用在測(cè)試階段,將測(cè)試用例和它所執(zhí)行過(guò)的函數(shù)綁定的方法。在版本迭代時(shí)會(huì)將上一個(gè)版本的測(cè)試用例繼承下來(lái),通過(guò)回歸跟上個(gè)版本進(jìn)行比較,哪個(gè)函數(shù)有了變化,那么與其相關(guān)的測(cè)試用例的功能都可能會(huì)發(fā)生變化,所以在回歸時(shí)會(huì)推薦出要重新測(cè)試的測(cè)試用例;而當(dāng)一個(gè)測(cè)試用例里面關(guān)聯(lián)的所有函數(shù)都沒(méi)發(fā)生變化時(shí)他的功能也不會(huì)發(fā)生變化,那么此時(shí)再去測(cè)試一遍該用例是沒(méi)有意義的事情。所以,在新版本插樁完畢后和以前的進(jìn)行回歸后就可以看出哪些用例需要重新跑哪些完全不用再跑。

      2.最后執(zhí)行時(shí)序

      該部分是執(zhí)行插樁程序進(jìn)行動(dòng)態(tài)數(shù)據(jù)接收時(shí)保存的最后五十個(gè)語(yǔ)句塊執(zhí)行的時(shí)序關(guān)系圖

      它可以點(diǎn)擊每一步次序查看執(zhí)行塊的代碼

      3.聚類分析

      聚類算法中個(gè)數(shù)的設(shè)置是需要手動(dòng)設(shè)置的,一般看顆粒度的粗細(xì)進(jìn)行設(shè)置。聚類算法是通過(guò)測(cè)試用例的代碼相似程度得出結(jié)果的,所以可以幫助我們劃分出來(lái)有哪些測(cè)試用例的代碼相似程度比較高,

      本次共設(shè)計(jì)7個(gè)測(cè)試用例,兩次拍照、兩次錄視頻、一次隨便側(cè)、一次打開(kāi)相機(jī)、一次打開(kāi)相機(jī)后閑置。

      選擇分類個(gè)數(shù)為5后,聚類結(jié)果為:

      切換為圖形模式為:

      10、Web報(bào)表

      1.覆蓋率按日增長(zhǎng)曲線圖

      使用折線圖清晰的展現(xiàn)每天該版本覆蓋率的變化情況

      左下角雷達(dá)圖展示了預(yù)期的各項(xiàng)覆蓋率與實(shí)際各項(xiàng)覆蓋看的差距

      右下角對(duì)比了當(dāng)前版本與最新版本各項(xiàng)覆蓋率的差異

      2.測(cè)試漏洞的智能分析

      在一個(gè)程序中,往往有成百上千的函數(shù),這些函數(shù)有的是關(guān)聯(lián)整個(gè)程序核心、有的則是開(kāi)發(fā)人員棄而不用,但一直保留遲遲不肯刪除的,針對(duì)這些大量的函數(shù),“精準(zhǔn)測(cè)試”采用通過(guò)靜態(tài)、動(dòng)態(tài)指標(biāo)的綜合分析,在大量的程序函數(shù)中,通過(guò)計(jì)算直接篩選潛在的高危的測(cè)試漏洞,通過(guò)報(bào)表給予展示。

      當(dāng)一個(gè)函數(shù)復(fù)雜度很高但覆蓋率卻很低的時(shí)候其出現(xiàn)風(fēng)險(xiǎn)的概率就可能比較高

      當(dāng)函數(shù)扇入扇出越大時(shí),意味著其關(guān)聯(lián)函數(shù)越多,結(jié)合其覆蓋率信息也可能是風(fēng)險(xiǎn)較高。

      軟件開(kāi)發(fā) Android

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:谷歌OKR指導(dǎo)手冊(cè) (譯)
      下一篇:Excel表格中將條件格式匯總有什么技巧
      相關(guān)文章
      亚洲爆乳无码专区www| 亚洲高清无码在线观看| 国产亚洲精品AA片在线观看不加载| 亚洲中文字幕久久久一区| 亚洲人成网站在线观看播放动漫| 亚洲综合久久成人69| 91天堂素人精品系列全集亚洲| 亚洲精品无码不卡| 亚洲五月六月丁香激情| 亚洲成a人片在线观看中文动漫| 亚洲AV无码久久精品蜜桃| 久久久久亚洲精品成人网小说| 亚洲av伊人久久综合密臀性色| 久久久久亚洲精品无码系列| 亚洲欧洲日韩不卡| 亚洲国产成人精品无码一区二区| 亚洲最大黄色网址| 亚洲一卡2卡4卡5卡6卡在线99| 亚洲AV一二三区成人影片| 中国亚洲呦女专区| 在线观看亚洲视频| 亚洲综合激情另类专区| 亚洲中文字幕无码永久在线| 亚洲国产精品一区二区久久hs| 久久精品国产亚洲沈樵| 亚洲精品国产成人99久久| 亚洲精品无码久久久久久久| 日韩亚洲国产综合高清| 亚洲av无码专区在线观看亚| 亚洲午夜激情视频| 亚洲精品成人片在线播放 | 久久丫精品国产亚洲av| 亚洲电影在线播放| 亚洲乱码一区二区三区国产精品| 亚洲色成人WWW永久在线观看| 朝桐光亚洲专区在线中文字幕 | 国产a v无码专区亚洲av| 亚洲欧洲国产精品香蕉网| 亚洲色四在线视频观看| 亚洲伊人久久大香线蕉啊| 亚洲大尺度无码无码专线一区|