您好,登錄后才能下訂單哦!
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)行一系列分析等。
經(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頭文件后就可以正常編譯出插樁程序了。
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è)試插樁工具包的/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,客戶(hù)端若與服務(wù)端在同一主機(jī)則保持127.0.0.1,若在不同主機(jī)則寫(xiě)明客戶(hù)端ip。
本次選擇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),但原理又是相同,所以?xún)H對(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ù)。
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/為安卓源代碼路徑
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
插樁成功后在客戶(hù)端重新加載版本數(shù)據(jù):
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編譯該模塊。
本例是將安卓原生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è)試工具客戶(hù)端打開(kāi)示波器界面,建立測(cè)試用例并選擇測(cè)試用例后點(diǎn)擊 開(kāi)始 并對(duì)手機(jī)進(jìn)行相機(jī)功能的操作就可以在接收到動(dòng)態(tài)數(shù)據(jù)并示波器看到波形了。
示波器接收數(shù)據(jù)圖:
在對(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è)條件判斷是否滿(mǎn)足mcdc覆蓋如果滿(mǎn)足如上圖綠色表示條件滿(mǎn)足mcdc覆蓋,藍(lán)色表示不滿(mǎ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ù)制到客戶(hù)端本地,在版本上右鍵選擇修改源碼路徑,然后添加源碼路徑來(lái)關(guān)聯(liá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ù)顯示在圖像界面中。
控制流程圖基礎(chǔ)功能是展示函數(shù)的控制流程,即控制流程圖,用于表示函數(shù)的控制流程、顯示測(cè)試覆蓋率結(jié)果、實(shí)現(xiàn)半自動(dòng)高效率測(cè)試用例設(shè)計(jì),進(jìn)行邏輯流程查錯(cuò),以及源碼、測(cè)試用例和相關(guān)文檔之間的雙向自動(dòng)追溯等。
簡(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ǔ)句塊可定位到代碼具體行。
由于精準(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è)試用例。
在第一個(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)行插樁,再在客戶(hù)端使用選取回歸測(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)行回歸后就可以看出哪些用例需要重新跑哪些完全不用再跑。
該部分是執(zhí)行插樁程序進(jìn)行動(dòng)態(tài)數(shù)據(jù)接收時(shí)保存的最后五十個(gè)語(yǔ)句塊執(zhí)行的時(shí)序關(guān)系圖
它可以點(diǎn)擊每一步次序查看執(zhí)行塊的代碼
聚類(lèi)算法中個(gè)數(shù)的設(shè)置是需要手動(dòng)設(shè)置的,一般看顆粒度的粗細(xì)進(jìn)行設(shè)置。聚類(lèi)算法是通過(guò)測(cè)試用例的代碼相似程度得出結(jié)果的,所以可以幫助我們劃分出來(lái)有哪些測(cè)試用例的代碼相似程度比較高,
本次共設(shè)計(jì)7個(gè)測(cè)試用例,兩次拍照、兩次錄視頻、一次隨便側(cè)、一次打開(kāi)相機(jī)、一次打開(kāi)相機(jī)后閑置。
選擇分類(lèi)個(gè)數(shù)為5后,聚類(lèi)結(jié)果為:
切換為圖形模式為:
使用折線圖清晰的展現(xiàn)每天該版本覆蓋率的變化情況
左下角雷達(dá)圖展示了預(yù)期的各項(xiàng)覆蓋率與實(shí)際各項(xiàng)覆蓋看的差距
右下角對(duì)比了當(dāng)前版本與最新版本各項(xiàng)覆蓋率的差異
在一個(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)較高。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。