• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      安卓應(yīng)用HTTP緩存缺陷的動(dòng)態(tài)檢測(cè)*

      2018-09-12 02:21:48楊嘉成趙文耘
      計(jì)算機(jī)與生活 2018年9期
      關(guān)鍵詞:安卓開(kāi)發(fā)者客戶端

      楊嘉成,彭 鑫,趙文耘

      1.復(fù)旦大學(xué) 軟件學(xué)院,上海 201203

      2.復(fù)旦大學(xué) 上海市數(shù)據(jù)科學(xué)重點(diǎn)實(shí)驗(yàn)室,上海 201203

      1 引言

      網(wǎng)絡(luò)通信能力在為移動(dòng)應(yīng)用帶來(lái)強(qiáng)大支持的同時(shí),也給移動(dòng)用戶帶來(lái)了一些潛在的問(wèn)題。首先,移動(dòng)應(yīng)用訪問(wèn)網(wǎng)絡(luò)的過(guò)程會(huì)消耗數(shù)據(jù)流量,造成了用戶的經(jīng)濟(jì)負(fù)擔(dān)。其次,移動(dòng)設(shè)備電池電量有限,而網(wǎng)絡(luò)通信是移動(dòng)應(yīng)用中消耗電量最多的操作之一。研究表明,移動(dòng)應(yīng)用在非空閑狀態(tài)下超過(guò)40%的電量消耗來(lái)自網(wǎng)絡(luò)通信,其中由超文本傳輸協(xié)議(hypertext transfer protocol,HTTP)操作所導(dǎo)致的電量消耗占近80%[1]。最后,移動(dòng)應(yīng)用在通過(guò)網(wǎng)絡(luò)獲取數(shù)據(jù)并進(jìn)行本地處理的過(guò)程中,網(wǎng)絡(luò)傳輸可能由于網(wǎng)絡(luò)狀況不佳或數(shù)據(jù)傳輸量大而成為應(yīng)用響應(yīng)的瓶頸,影響用戶體驗(yàn)。

      緩存作為一種經(jīng)典的技術(shù)手段,可以在移動(dòng)設(shè)備端有效地緩解上述問(wèn)題。安卓應(yīng)用中的網(wǎng)絡(luò)訪問(wèn)通常通過(guò)調(diào)用HTTP客戶端應(yīng)用編程接口(application programming interface,API)實(shí)現(xiàn),其中常見(jiàn)的HTTP客戶端包括HttpURLConnection、Apache HTTP Client和OkHttp等。但在這些HTTP客戶端中,有些客戶端本身缺乏緩存機(jī)制(如Apache HTTP Client),其他一些客戶端(如OkHttp)雖然有內(nèi)部的緩存支持,但仍存在以下問(wèn)題:(1)緩存需要開(kāi)發(fā)者在代碼中顯式地啟用,一些開(kāi)發(fā)者由于疏忽而沒(méi)有啟用;(2)HTTP客戶端API中的緩存處理抽象層次較高,無(wú)法針對(duì)特定應(yīng)用需求進(jìn)行優(yōu)化處理,導(dǎo)致緩存效果不佳[2]。

      由于上述原因,在實(shí)際開(kāi)發(fā)中應(yīng)用開(kāi)發(fā)者往往需要自行定義并實(shí)現(xiàn)自己的緩存處理策略,這可能導(dǎo)致兩方面的問(wèn)題:(1)未能充分利用緩存來(lái)優(yōu)化應(yīng)用性能;(2)過(guò)度使用緩存或不及時(shí)清理緩存內(nèi)容。后者會(huì)導(dǎo)致應(yīng)用緩存占用過(guò)多的存儲(chǔ)空間,以及緩存管理消耗較多的電量[3],因此也會(huì)影響移動(dòng)設(shè)備和應(yīng)用的整體性能。

      當(dāng)前已經(jīng)有一些研究工作關(guān)注于移動(dòng)應(yīng)用的緩存問(wèn)題,但這些工作主要關(guān)注于移動(dòng)端網(wǎng)絡(luò)瀏覽器的HTTP緩存表現(xiàn)[4-6]。有些研究針對(duì)應(yīng)用的HTTP緩存問(wèn)題進(jìn)行檢測(cè)[7],但策略比較簡(jiǎn)單且沒(méi)有考慮安卓應(yīng)用的特點(diǎn),因此無(wú)法發(fā)現(xiàn)其中所包含的深層問(wèn)題,比如應(yīng)用緩存占用的設(shè)備空間、應(yīng)用緩存的有效性等。為了實(shí)現(xiàn)細(xì)粒度的安卓應(yīng)用緩存缺陷檢測(cè),發(fā)現(xiàn)與特定安卓應(yīng)用特點(diǎn)相關(guān)的HTTP緩存問(wèn)題,本文提出并實(shí)現(xiàn)了一種基于動(dòng)態(tài)分析的安卓應(yīng)用HTTP緩存缺陷檢測(cè)方法。該方法可以針對(duì)安卓應(yīng)用的APK(安卓應(yīng)用安裝包,Android package)文件進(jìn)行插裝,使其具有在運(yùn)行時(shí)監(jiān)測(cè)并記錄與HTTP緩存相關(guān)的行為和數(shù)據(jù)的能力。該方法通過(guò)安卓應(yīng)用自動(dòng)化測(cè)試工具對(duì)插裝后的應(yīng)用進(jìn)行自動(dòng)運(yùn)行同時(shí)收集運(yùn)行日志,并基于日志分析發(fā)現(xiàn)應(yīng)用中的HTTP緩存缺陷并定位所在位置。

      為了驗(yàn)證該方法的有效性,利用基于該方法所實(shí)現(xiàn)的分析工具對(duì)當(dāng)前安卓應(yīng)用市場(chǎng)上的25個(gè)安卓應(yīng)用進(jìn)行了自動(dòng)化分析。分析結(jié)果表明,所提出的方法適用于當(dāng)前應(yīng)用市場(chǎng)上的大多數(shù)應(yīng)用。同時(shí),該方法能夠有效發(fā)現(xiàn)安卓應(yīng)用中存在的緩存缺失、緩存空間無(wú)限增長(zhǎng)和緩存冗余等問(wèn)題。針對(duì)所發(fā)現(xiàn)的這些問(wèn)題,本文還分析了出現(xiàn)這些問(wèn)題的原因以及解決的思路。

      2 背景

      安卓應(yīng)用通常是用Java語(yǔ)言編寫(xiě)的,打包成APK文件以供安裝使用。從應(yīng)用源代碼到打包好的APK文件,一般要經(jīng)過(guò)以下幾個(gè)階段的轉(zhuǎn)換:首先,應(yīng)用源代碼被編譯成Java類文件;然后,這些類文件被安卓軟件開(kāi)發(fā)工具包(software development kit,SDK)中的dx工具轉(zhuǎn)換為.dex文件,這種文件是可以運(yùn)行在安卓的Dalvik虛擬機(jī)上的可執(zhí)行字節(jié)碼;最后,這些.dex文件與聲明文件、相關(guān)的資源文件(如圖片、用戶界面布局文件)一起被打包成APK文件,添加簽名后就可以發(fā)布使用了。

      安卓官方提供了兩組HTTP客戶端API:Http-URLConnection和Apache HTTP Client。其中,前者是目前官方建議開(kāi)發(fā)者使用的HTTP客戶端API;后者在安卓API 22級(jí)之后已經(jīng)廢棄,但由于一些較早開(kāi)發(fā)的代碼中仍有使用,出于兼容性的考慮,安卓對(duì)這部分代碼保留了支持。此外,還有一些第三方HTTP客戶端,如OkHttp,可供安卓開(kāi)發(fā)者使用,這些HTTP客戶端一般也都是基于HttpURLConnection實(shí)現(xiàn)的。借助上述HTTP客戶端API,開(kāi)發(fā)者可以非常方便地編寫(xiě)代碼,獲取HTTP資源。但值得注意的是,這些HTTP客戶端本身要么缺少緩存機(jī)制接口供開(kāi)發(fā)者使用,要么雖然提供了緩存支持,但可能需要開(kāi)發(fā)者自行開(kāi)啟,并且緩存處理較為簡(jiǎn)單。

      安卓設(shè)備中包含兩個(gè)存儲(chǔ)文件的區(qū)域:內(nèi)部存儲(chǔ)和外部存儲(chǔ)。內(nèi)部存儲(chǔ)是設(shè)備內(nèi)部提供的非易失性內(nèi)存,外部存儲(chǔ)一般是移動(dòng)存儲(chǔ)介質(zhì),如安全數(shù)碼卡(secure digital memory card,SD)。通常來(lái)講,安卓設(shè)備的內(nèi)部存儲(chǔ)在應(yīng)用運(yùn)行時(shí)是始終可用的,各應(yīng)用的存儲(chǔ)空間相互隔離,應(yīng)用無(wú)法訪問(wèn)其他應(yīng)用在內(nèi)部存儲(chǔ)中保存的文件;在用戶卸載某個(gè)應(yīng)用后,系統(tǒng)將移除該應(yīng)用所保存的文件。而安卓設(shè)備的外部存儲(chǔ)并不始終可用,在外部存儲(chǔ)中保存的文件是全局可讀的;用戶卸載某個(gè)應(yīng)用時(shí),只有保存在某些特定路徑(通過(guò)Context類中的getExternalFilesDir方法獲得)下的文件才會(huì)被系統(tǒng)刪除,應(yīng)用保存在其他路徑下的文件并不會(huì)被刪除。安卓系統(tǒng)不會(huì)定期清理內(nèi)部存儲(chǔ)和外部存儲(chǔ)中緩存文件夾下的文件,只有在內(nèi)存不足時(shí)才會(huì)刪除內(nèi)部存儲(chǔ)中的緩存文件。

      3 方法和實(shí)現(xiàn)

      3.1 方法

      本文提出了一種基于動(dòng)態(tài)分析的安卓應(yīng)用緩存缺陷自動(dòng)檢測(cè)方法,該方法的概覽如圖1所示。

      Fig.1 Overview ofAndroidApp HTTP cache detection圖1 安卓應(yīng)用HTTP緩存檢測(cè)概覽

      首先,方法對(duì)安卓應(yīng)用的APK文件進(jìn)行插裝改造。這一過(guò)程會(huì)向原始安卓應(yīng)用中引入一個(gè)運(yùn)行時(shí)庫(kù),生成的插裝后的應(yīng)用具有在運(yùn)行時(shí)監(jiān)測(cè)并記錄與HTTP緩存相關(guān)的行為和數(shù)據(jù)的能力。這些數(shù)據(jù)包括:(1)HTTP響應(yīng)頭部信息(主要是緩存相關(guān)的信息,如失效時(shí)間、緩存控制和上次被修改時(shí)間)及具體內(nèi)容;(2)訪問(wèn)本地文件的絕對(duì)路徑;(3)文件訪問(wèn)時(shí)間;(4)緩存文件容量;(5)緩存文件訪問(wèn);(6)被刪除文件的絕對(duì)路徑。

      改造過(guò)程中引入原始應(yīng)用中的運(yùn)行時(shí)庫(kù)負(fù)責(zé)在應(yīng)用運(yùn)行時(shí)獲取上述數(shù)據(jù),該運(yùn)行時(shí)庫(kù)主要有三大職責(zé):(1)記錄應(yīng)用的文件訪問(wèn)和刪除操作的相關(guān)信息;(2)監(jiān)測(cè)應(yīng)用中的HTTP訪問(wèn),記錄HTTP響應(yīng)的頭部信息(統(tǒng)一資源定位符、過(guò)期時(shí)間、緩存控制和上次修改時(shí)間)以及響應(yīng)的具體內(nèi)容后,再將HTTP響應(yīng)內(nèi)容返回給應(yīng)用中原本的調(diào)用,從而不會(huì)對(duì)應(yīng)用的正常運(yùn)行產(chǎn)生影響;(3)應(yīng)用啟動(dòng)時(shí)的運(yùn)行時(shí)庫(kù)初始化處理,包括設(shè)置應(yīng)用包名,從文件系統(tǒng)中恢復(fù)該應(yīng)用在之前運(yùn)行時(shí)獲得的數(shù)據(jù)記錄等,以及在應(yīng)用退出時(shí)將內(nèi)存中的數(shù)據(jù)記錄持久化到設(shè)備文件系統(tǒng)中。

      接著,改造后的安卓應(yīng)用被安裝到安卓設(shè)備上以供運(yùn)行。在改造過(guò)的應(yīng)用被啟動(dòng)后,方法借助安卓自動(dòng)化測(cè)試工具(如Monkey、Robotium等),自動(dòng)化地向安卓設(shè)備發(fā)送用戶事件流。用戶事件包括點(diǎn)擊事件、觸屏事件、手勢(shì)操作和按鍵操作等。通過(guò)自動(dòng)生成的用戶事件流,模擬用戶使用應(yīng)用的過(guò)程,產(chǎn)生原始應(yīng)用邏輯中訪問(wèn)文件、獲取網(wǎng)絡(luò)資源的操作。

      在應(yīng)用運(yùn)行時(shí),被引入的運(yùn)行時(shí)庫(kù)會(huì)實(shí)時(shí)監(jiān)測(cè)并收集前述的與HTTP緩存相關(guān)的行為和數(shù)據(jù),進(jìn)行一定的處理整合后,生成運(yùn)行日志。日志內(nèi)容包括:(1)應(yīng)用中的HTTP請(qǐng)求的次數(shù);(2)導(dǎo)致不完善緩存發(fā)生的HTTP請(qǐng)求在代碼中的位置;(3)每個(gè)緩存文件的訪問(wèn)次數(shù)以及緩存文件總訪問(wèn)次數(shù);(4)應(yīng)用占用的設(shè)備內(nèi)部存儲(chǔ)和外部存儲(chǔ)空間的大小變化;(5)應(yīng)用運(yùn)行過(guò)程中刪除的文件的文件名,以及這些文件在刪除前的容量。

      運(yùn)行時(shí)庫(kù)通過(guò)在應(yīng)用中監(jiān)測(cè)HTTP響應(yīng)及其內(nèi)容來(lái)分析獲得上述日志中的第1、2部分內(nèi)容。圖2展示了運(yùn)行時(shí)庫(kù)對(duì)HTTP響應(yīng)進(jìn)行攔截并分析其內(nèi)容的過(guò)程。分析邏輯共分5個(gè)步驟:(1)當(dāng)在應(yīng)用中發(fā)生一次HTTP訪問(wèn)時(shí),運(yùn)行時(shí)庫(kù)會(huì)根據(jù)這次訪問(wèn)的網(wǎng)絡(luò)資源的統(tǒng)一資源定位符(uniform resource locator,URL)查詢?cè)诖酥皯?yīng)用是否訪問(wèn)過(guò)相同URL上的內(nèi)容;(2)如果訪問(wèn)過(guò),那么分析程序會(huì)接著查找數(shù)據(jù)記錄中最近的對(duì)應(yīng)于該URL的緩存控制信息和緩存過(guò)期時(shí)間信息,否則結(jié)束;(3)如果緩存并未過(guò)期,那么說(shuō)明應(yīng)用的HTTP緩存不完整,運(yùn)行時(shí)庫(kù)會(huì)將這次HTTP通信在程序代碼中的位置記錄到日志中;(4)如果緩存過(guò)期,運(yùn)行時(shí)庫(kù)會(huì)查找獲取數(shù)據(jù)記錄中最近的對(duì)應(yīng)于該URL的緩存內(nèi)容,并將獲得的緩存內(nèi)容與此次HTTP訪問(wèn)獲得的內(nèi)容進(jìn)行對(duì)比;(5)如果對(duì)比發(fā)現(xiàn)兩者內(nèi)容并無(wú)差別,那么說(shuō)明存在緩存控制設(shè)置過(guò)于保守的問(wèn)題,運(yùn)行時(shí)庫(kù)會(huì)將這次HTTP通信在程序代碼中的位置記錄到日志中,否則直接結(jié)束。整個(gè)過(guò)程不會(huì)干擾應(yīng)用獲取HTTP響應(yīng)的內(nèi)容,因此也不會(huì)影響應(yīng)用的正常運(yùn)行。

      最后,方法對(duì)運(yùn)行獲得的日志記錄進(jìn)行分析。分析的內(nèi)容主要包括:(1)應(yīng)用緩存的完整性(也就是說(shuō),是否存在從網(wǎng)絡(luò)中請(qǐng)求之前訪問(wèn)過(guò)并且還未過(guò)期的資源);(2)應(yīng)用緩存控制設(shè)置是否保守;(3)應(yīng)用的緩存對(duì)設(shè)備內(nèi)部和外部存儲(chǔ)的空間占用狀況;(4)冗余緩存文件(未被使用過(guò)的緩存文件)數(shù)量,以及這些文件占所有緩存文件的比例;(5)上次被訪問(wèn)時(shí)間在某一時(shí)刻之前的緩存文件的數(shù)量,以及這些文件占所有緩存文件的比例;(6)緩存文件平均訪問(wèn)次數(shù);(7)應(yīng)用對(duì)緩存空間占用的控制。對(duì)于(1)、(2)兩部分內(nèi)容,運(yùn)行時(shí)庫(kù)在運(yùn)行時(shí)已經(jīng)在日志中進(jìn)行了記錄;對(duì)其他五部分內(nèi)容,分析程序?qū)⒎謩e讀入分析所需的運(yùn)行日志中內(nèi)容,然后按要求輸出分析結(jié)果。需要注意的是,很多應(yīng)用為了程序健壯性的需要,會(huì)在運(yùn)行時(shí)生成一些臨時(shí)文件和備份文件(如.bkp文件)。分析程序會(huì)判斷被刪除文件的類型,剔除備份文件對(duì)分析結(jié)果的影響。

      Fig.2 Interception and analysis process of HTTP response圖2 HTTP響應(yīng)攔截分析過(guò)程

      3.2 實(shí)現(xiàn)

      本文實(shí)現(xiàn)了一個(gè)自動(dòng)化的安卓應(yīng)用代碼插裝工具,該工具的輸入是APK文件,文件中包含的Dalvik字節(jié)碼保留了應(yīng)用的程序結(jié)構(gòu)。插裝過(guò)程中,工具會(huì)自動(dòng)對(duì)Dalvik字節(jié)碼進(jìn)行分析和重寫(xiě),引入實(shí)現(xiàn)的運(yùn)行時(shí)庫(kù),使應(yīng)用具有3.1節(jié)中描述的運(yùn)行時(shí)HTTP緩存缺陷動(dòng)態(tài)監(jiān)測(cè)的能力。

      圖3是應(yīng)用程序改造的概覽。圖中白色部分代表原本的安卓應(yīng)用代碼,灰色部分是本文的自動(dòng)化改造工具所引入的代碼。dex2jar是一個(gè)可以實(shí)現(xiàn)安卓中的.dex文件和Java中的.class之間的相互轉(zhuǎn)換的工具。本文實(shí)現(xiàn)的工具借助dex2jar,對(duì)APK文件中的Dalvik字節(jié)碼進(jìn)行轉(zhuǎn)換后,對(duì)類文件進(jìn)行操作,引入運(yùn)行時(shí)庫(kù)。對(duì)每一個(gè)activity類,改造工具會(huì)向其生命周期函數(shù)(onCreate,onResume和onStop方法)中引入額外的代碼,以在進(jìn)入應(yīng)用時(shí)對(duì)緩存監(jiān)控進(jìn)行初始化,并在離開(kāi)應(yīng)用時(shí)結(jié)束緩存監(jiān)控,更新未持久化的數(shù)據(jù)記錄。這部分改造的方法與CollaDroid[8]中介紹的程序改造方法類似。

      工具隨后對(duì)應(yīng)用所有類文件中每個(gè)方法的每一條語(yǔ)句進(jìn)行遍歷,查找與文件操作相關(guān)的語(yǔ)句和與HTTP資源訪問(wèn)相關(guān)的語(yǔ)句。

      與文件操作相關(guān)的語(yǔ)句包括那些調(diào)用Java中的File類的構(gòu)造函數(shù)、FileInputStream類的構(gòu)造函數(shù)、FileReader類的構(gòu)造函數(shù)、RandomAccessFile類的構(gòu)造函數(shù),以及File類中的delete方法的語(yǔ)句。本文工具會(huì)在使用上述構(gòu)造函數(shù)的語(yǔ)句之前引入額外的代碼,調(diào)用運(yùn)行時(shí)庫(kù)中的方法,實(shí)現(xiàn)對(duì)緩存文件狀態(tài)的監(jiān)控。

      與HTTP資源訪問(wèn)相關(guān)的語(yǔ)句包括那些調(diào)用java.net.HttpURLConnection類中的getInputStream方法和調(diào)用org.apache.http.client.HttpClient接口中的execute方法的語(yǔ)句。調(diào)用上述兩種方法,程序會(huì)獲取網(wǎng)絡(luò)中特定URL上的資源。圖4展示了一個(gè)對(duì)調(diào)用getInputStream方法的代碼進(jìn)行改造的例子。請(qǐng)注意,這里為了方便理解,展示的是源代碼,應(yīng)用程序改造實(shí)際上是在Dalvik字節(jié)碼上進(jìn)行的。改造工具將使用運(yùn)行時(shí)庫(kù)中的方法來(lái)替換原始應(yīng)用中相關(guān)的方法調(diào)用,從而在不影響應(yīng)用正常使用的情況下實(shí)現(xiàn)對(duì)應(yīng)用中發(fā)生的HTTP訪問(wèn)的監(jiān)測(cè)。

      4 實(shí)驗(yàn)和分析

      4.1 實(shí)驗(yàn)設(shè)置

      Fig.3 Overview of program transformation圖3 應(yīng)用程序改造概覽

      Fig.4 Example of program transformation圖4 程序改造示例

      本文實(shí)現(xiàn)的APK改造工具是通過(guò)Java語(yǔ)言開(kāi)發(fā)的,可以運(yùn)行在任何安裝了Java運(yùn)行時(shí)環(huán)境的機(jī)器上。使用這一工具對(duì)原始的APK文件進(jìn)行改造,然后安裝在安卓設(shè)備上,并使用安卓SDK提供的Monkey測(cè)試工具模擬應(yīng)用運(yùn)行以獲取數(shù)據(jù)。實(shí)驗(yàn)中用到的安卓設(shè)備包括一臺(tái)三星Galaxy S4(Exynos 5410 CPU,Imagination PowerVR SGX544 MP3 GPU,2 GB RAM,16 GB內(nèi)存)和一臺(tái)紅米Note 4(聯(lián)發(fā)科Helio X20,Mali-T880 MP4 GPU,3 GB RAM,64 GB內(nèi)存)。

      4.2 適用性

      從安卓市場(chǎng)上下載了25款下載量較高,并且網(wǎng)絡(luò)通信比較頻繁的應(yīng)用(如新聞客戶端、在線音樂(lè)客戶端)的APK文件,并使用本文所實(shí)現(xiàn)的自動(dòng)化改造工具對(duì)這些APK文件進(jìn)行自動(dòng)化改造。實(shí)驗(yàn)發(fā)現(xiàn),改造單個(gè)APK文件的耗時(shí)一般不超過(guò)30 s,并且改造過(guò)程本身都可以順利完成,生成可以安裝到安卓設(shè)備上的可用APK文件。改造后的APK文件中.dex文件的大小比改造前增加了0.4%到2.1%,平均增加了1.3%。由于APK文件中還會(huì)包含許多資源文件(如圖片、布局文件等),.dex文件容量一般占不到APK中所有文件總?cè)萘康囊话?,因此改造?duì)APK文件大小的影響是微不足道的。

      隨后在設(shè)備上運(yùn)行這些改造過(guò)的應(yīng)用,發(fā)現(xiàn)其中有6款應(yīng)用無(wú)法正常運(yùn)行。這些無(wú)法正常運(yùn)行的應(yīng)用通常表現(xiàn)為閃退,進(jìn)入應(yīng)用后長(zhǎng)時(shí)間停留在初始界面沒(méi)有響應(yīng),應(yīng)用提示當(dāng)前應(yīng)用不是官方版本后強(qiáng)制退出等。通過(guò)分析控制臺(tái)日志信息等方式,這些應(yīng)用之所以無(wú)法運(yùn)行,是因?yàn)閼?yīng)用開(kāi)發(fā)者在應(yīng)用內(nèi)設(shè)置了一些自我保護(hù)機(jī)制,使得被第三方修改過(guò)的應(yīng)用無(wú)法正常運(yùn)行。

      實(shí)驗(yàn)所使用的應(yīng)用類型多種多樣,包括新聞、音樂(lè)、購(gòu)物等,與一些關(guān)注于移動(dòng)瀏覽器應(yīng)用緩存檢測(cè)的工作[4-6,9]相比,本文所提出的方法具有更廣泛的適用性。

      在改造過(guò)程中發(fā)現(xiàn)有一些應(yīng)用使用Apache HTTP客戶端來(lái)訪問(wèn)HTTP資源,目前的安卓官方開(kāi)發(fā)文檔中已經(jīng)建議開(kāi)發(fā)者不要再使用這種方式。對(duì)應(yīng)用所使用的具體HTTP客戶端的檢測(cè)是先前的緩存檢測(cè)工作[7]所無(wú)法做到的,這也是本文方法的優(yōu)勢(shì)之一。根據(jù)方法調(diào)用所在的類所處的包的名稱,發(fā)現(xiàn)其中大多數(shù)調(diào)用是在應(yīng)用使用的一些第三方庫(kù)中,只有兩款應(yīng)用是在自己開(kāi)發(fā)的代碼中使用了Apache HTTP客戶端。

      實(shí)驗(yàn)結(jié)果表明,本文實(shí)現(xiàn)的工具可以對(duì)現(xiàn)成的安卓應(yīng)用進(jìn)行自動(dòng)化的改造,并且這種改造適用于安卓市場(chǎng)上的很大一部分應(yīng)用。

      4.3 緩存檢測(cè)結(jié)果及分析

      對(duì)改造成功并可以在安卓設(shè)備上正常運(yùn)行的19款應(yīng)用進(jìn)行了運(yùn)行檢測(cè)。為了自動(dòng)化地生成用戶事件流,使用了安卓SDK提供的Monkey工具,該工具可以向安卓模擬器或真實(shí)設(shè)備中發(fā)送偽隨機(jī)用戶事件流,模擬用戶的觸屏、點(diǎn)擊、手勢(shì)和按鍵等操作。借助Monkey提供的命令,將每段用戶事件流中的用戶事件數(shù)量控制在500個(gè),用戶事件包含觸屏、位移、按鍵事件,事件將只發(fā)生在當(dāng)前應(yīng)用中,不會(huì)跳出到其他應(yīng)用。為了給應(yīng)用一定的響應(yīng)時(shí)間,將用戶事件輸入間隔設(shè)置為1 s。對(duì)每個(gè)改造后的應(yīng)用,每天分別運(yùn)行兩次,這兩次運(yùn)行中間的時(shí)間間隔大于5 h,共運(yùn)行3天(為保證結(jié)果的可靠性,實(shí)驗(yàn)開(kāi)始時(shí)應(yīng)用都是全新安裝的),得到的數(shù)據(jù)及分析結(jié)果如圖5所示。

      Fig.5 Result ofAndroidApp HTTP cache detection圖5 安卓應(yīng)用HTTP緩存檢測(cè)結(jié)果

      在本文測(cè)試的19款應(yīng)用中,有6款應(yīng)用的HTTP緩存不完整,存在從網(wǎng)絡(luò)中重復(fù)獲取相同未過(guò)期資源的情況,這意味著數(shù)據(jù)流量和電池電量的不必要消耗;同時(shí),有7款應(yīng)用存在HTTP頭緩存控制設(shè)置過(guò)于保守的情況,也就是說(shuō),雖然某些資源根據(jù)HTTP頭中的緩存控制信息已經(jīng)過(guò)期,但實(shí)際上這些資源內(nèi)容并未發(fā)生變化,這主要源于服務(wù)器端設(shè)置得過(guò)于保守。需要注意的是,當(dāng)應(yīng)用發(fā)生一次HTTP請(qǐng)求時(shí),如果運(yùn)行時(shí)庫(kù)發(fā)現(xiàn)HTTP緩存不完整,就不會(huì)再檢查緩存設(shè)置是否保守,因此實(shí)際當(dāng)中緩存設(shè)置保守的問(wèn)題可能要比實(shí)驗(yàn)結(jié)果中展示得要嚴(yán)重一些。Zhang等人的工作[7]中所使用的應(yīng)用HTTP緩存檢測(cè)方法是在一個(gè)較短的間隔內(nèi)點(diǎn)擊兩次應(yīng)用的某個(gè)界面元素,比較兩次點(diǎn)擊產(chǎn)生的HTTP響應(yīng)內(nèi)容。這種方法只能簡(jiǎn)單地檢測(cè)出應(yīng)用的緩存是否完整,但沒(méi)有考慮響應(yīng)內(nèi)容的過(guò)期時(shí)間、內(nèi)容變化等因素,也就無(wú)法像本文所提出的方法一樣檢測(cè)更多更深入的應(yīng)用緩存問(wèn)題,如緩存控制設(shè)置、緩存的有效性等。

      圖5還展示了應(yīng)用對(duì)安卓設(shè)備內(nèi)部存儲(chǔ)、外部存儲(chǔ)的使用情況,以及對(duì)緩存總?cè)萘康目刂啤膱D中可以看到,有8款應(yīng)用并沒(méi)有使用設(shè)備的外部存儲(chǔ),這些應(yīng)用中不乏新聞客戶端、在線音樂(lè)應(yīng)用。雖然安卓官方文檔中并沒(méi)有明確提出開(kāi)發(fā)者對(duì)設(shè)備內(nèi)、外部存儲(chǔ)的使用建議,但通常來(lái)講,安卓設(shè)備的內(nèi)部存儲(chǔ)空間較外部存儲(chǔ)空間更小,完全將緩存文件存儲(chǔ)在內(nèi)部設(shè)備上,特別是當(dāng)緩存文件中可能包含比較多的圖片、音頻等容量比較大的資源時(shí),可能給設(shè)備內(nèi)部存儲(chǔ)空間帶來(lái)比較大的壓力,造成在設(shè)備外部存儲(chǔ)還剩余比較多空間時(shí),內(nèi)部存儲(chǔ)空間已經(jīng)告急的情況。同時(shí),在實(shí)驗(yàn)檢測(cè)的共19款應(yīng)用中,發(fā)現(xiàn)只有2款應(yīng)用對(duì)緩存文件的存儲(chǔ)空間占用進(jìn)行了控制,絕大多數(shù)應(yīng)用的緩存空間在實(shí)驗(yàn)過(guò)程中都是無(wú)限制增長(zhǎng)的。實(shí)驗(yàn)結(jié)束后應(yīng)用產(chǎn)生的緩存文件大小一般在幾十兆甚至上百兆,雖然有可能存在應(yīng)用中緩存空間控制的閾限較高的情況,但考慮到目前測(cè)試設(shè)備的容量和移動(dòng)設(shè)備上安裝的應(yīng)用數(shù)量(2016年,美國(guó)每臺(tái)移動(dòng)設(shè)備平均安裝約89個(gè)應(yīng)用[10]),本文實(shí)驗(yàn)得到的結(jié)果還是具有說(shuō)服力的。

      還對(duì)應(yīng)用中未被使用的緩存文件數(shù)量占比進(jìn)行了統(tǒng)計(jì),統(tǒng)計(jì)結(jié)果如圖6所示。從圖中可以看出,有超過(guò)一半的應(yīng)用,它們的緩存文件中有超過(guò)40%是未被使用的。由于本文的實(shí)驗(yàn)進(jìn)行了3天,每天運(yùn)行每個(gè)應(yīng)用兩次,因此這些未被使用的緩存文件在未來(lái)被應(yīng)用使用的幾率也比較小,可以認(rèn)為,這些緩存內(nèi)容實(shí)際上對(duì)應(yīng)用來(lái)說(shuō)已經(jīng)是冗余的,基本不會(huì)給應(yīng)用的性能帶來(lái)什么實(shí)質(zhì)性的幫助,反而造成設(shè)備存儲(chǔ)空間的浪費(fèi)。

      Fig.6 Proportion of unused cache files圖6 應(yīng)用未使用的緩存文件數(shù)量占比

      在實(shí)驗(yàn)檢測(cè)的19款應(yīng)用中,有16款應(yīng)用的緩存命中數(shù)與緩存文件數(shù)的比率在3以內(nèi),也就是說(shuō),平均每個(gè)緩存文件被訪問(wèn)的次數(shù)不到3次,由于其中大部分緩存文件沒(méi)有被訪問(wèn)或只被訪問(wèn)過(guò)一次,這意味著緩存的使用集中在很小一部分文件中。

      此外,應(yīng)用中還有一部分緩存文件是長(zhǎng)時(shí)間未被再次訪問(wèn)的,將“長(zhǎng)時(shí)間”定義為應(yīng)用最近兩次運(yùn)行(因?yàn)閷?shí)驗(yàn)設(shè)置的運(yùn)行間隔已經(jīng)比較長(zhǎng))。請(qǐng)注意,這部分緩存文件是被使用過(guò)的。結(jié)合未被使用的緩存文件數(shù)量,在實(shí)驗(yàn)結(jié)束后,這兩類緩存文件數(shù)量占緩存文件總數(shù)量的比例一般在60%以上,如果去掉實(shí)驗(yàn)中應(yīng)用最后兩次運(yùn)行過(guò)程中新增加的緩存文件,這一比例會(huì)更高。這一結(jié)果表明,應(yīng)用中絕大部分緩存文件并不需要長(zhǎng)期保留,應(yīng)用完全可以清理這類緩存,而不會(huì)對(duì)應(yīng)用性能造成太大的影響。

      與現(xiàn)有的一些安卓應(yīng)用HTTP緩存檢測(cè)工作[4-7,9]相比,本文所提出的方法不僅可以檢測(cè)應(yīng)用“有沒(méi)有緩存”,而且可以通過(guò)監(jiān)控應(yīng)用對(duì)緩存文件的使用和管理狀況,檢測(cè)應(yīng)用的緩存“好不好”,即有沒(méi)有真正起到緩存應(yīng)有的效果,有沒(méi)有因?yàn)榫彺娑绊懥嗽O(shè)備的整體使用。特別是第二點(diǎn),是現(xiàn)有的相關(guān)工作所忽視或是無(wú)法做到的。

      5 討論

      第4章的實(shí)驗(yàn)結(jié)果表明,在目前安卓市場(chǎng)上的應(yīng)用中,應(yīng)用的HTTP緩存使用存在如下問(wèn)題:(1)部分應(yīng)用的HTTP緩存并不完整,會(huì)重復(fù)獲取網(wǎng)絡(luò)中相同的資源內(nèi)容,造成移動(dòng)數(shù)據(jù)流量的浪費(fèi);同時(shí),更多的網(wǎng)絡(luò)請(qǐng)求意味著更多的電量消耗,在移動(dòng)設(shè)備電池電量仍比較緊張的今天,這也是移動(dòng)設(shè)備使用者不愿意看到的。(2)一些應(yīng)用雖然對(duì)運(yùn)行過(guò)程中獲取的HTTP資源進(jìn)行了緩存,但往往忽略了對(duì)緩存的管理,沒(méi)有對(duì)緩存文件的空間占用進(jìn)行控制,導(dǎo)致緩存空間無(wú)限制增長(zhǎng),影響設(shè)備的整體使用。(3)應(yīng)用運(yùn)行過(guò)程中產(chǎn)生的緩存文件中,有很大一部分是冗余的、無(wú)意義的,它們?cè)谏珊蟛](méi)有被應(yīng)用所使用,無(wú)法起到開(kāi)發(fā)者期望的效果;同時(shí),一些緩存文件雖然被使用過(guò),但在應(yīng)用隨后的運(yùn)行過(guò)程中不再被訪問(wèn),這些緩存文件實(shí)際上也已經(jīng)是冗余的。

      基于以上分析,針對(duì)安卓應(yīng)用HTTP緩存,向開(kāi)發(fā)者提出以下幾點(diǎn)建議:

      (1)開(kāi)發(fā)應(yīng)用時(shí)應(yīng)注意開(kāi)啟HTTP客戶端API中提供的緩存,這是最基本的緩存處理,對(duì)開(kāi)發(fā)者的編程負(fù)擔(dān)很小,而且比較有效。

      (2)開(kāi)發(fā)者應(yīng)該根據(jù)所開(kāi)發(fā)應(yīng)用的特點(diǎn)及具體情況,設(shè)計(jì)實(shí)現(xiàn)更為合適、靈活的緩存處理策略,以獲得更好的緩存效果。例如對(duì)于在線音樂(lè)客戶端,用戶常聽(tīng)的歌曲很適合緩存在本地,可以在很大程度上減少運(yùn)行時(shí)消耗的流量,但用戶使用類似“隨便聽(tīng)聽(tīng)”的功能隨機(jī)播放在線曲庫(kù)中的歌曲時(shí),緩存這類歌曲對(duì)于減少流量消耗的意義并不大,因?yàn)橛脩艨赡懿粫?huì)重復(fù)聽(tīng)這些歌曲。

      (3)如果應(yīng)用運(yùn)行時(shí)使用的HTTP資源也是由應(yīng)用的開(kāi)發(fā)者部署在服務(wù)器上的,那么開(kāi)發(fā)者應(yīng)該謹(jǐn)慎對(duì)待資源緩存控制的設(shè)置,一方面要保證客戶端不會(huì)展示過(guò)期的內(nèi)容,另一方面又要把失效時(shí)間設(shè)置得盡可能久,以減少不必要的重復(fù)訪問(wèn)。

      (4)應(yīng)用在運(yùn)行時(shí)應(yīng)該及時(shí)清理那些長(zhǎng)時(shí)間未使用的緩存內(nèi)容,減少緩存對(duì)設(shè)備存儲(chǔ)空間的占用。雖然現(xiàn)在很多應(yīng)用內(nèi)置了供用戶使用的清理緩存功能,但由于一臺(tái)移動(dòng)設(shè)備上應(yīng)用數(shù)量往往有幾十個(gè)甚至上百個(gè),手動(dòng)清理緩存對(duì)用戶來(lái)說(shuō)仍是一件比較繁瑣的事情。應(yīng)用應(yīng)當(dāng)把存儲(chǔ)空間優(yōu)先分配給那些使用頻率較高的緩存內(nèi)容,及時(shí)清理那些使用頻率低或者長(zhǎng)時(shí)間沒(méi)有被使用的緩存內(nèi)容,這樣既可以保證應(yīng)用的流暢運(yùn)行,發(fā)揮緩存應(yīng)有的效果,又可以保證良好的用戶使用體驗(yàn)。

      6 局限和未來(lái)工作

      本文提出的方法及具體實(shí)現(xiàn)還存在一些局限,主要有以下幾方面:

      (1)由于不同的應(yīng)用有各自的內(nèi)部處理邏輯,對(duì)于緩存“命中”定義的粒度比較粗,只能定義到文件級(jí)別,因此應(yīng)用存儲(chǔ)緩存的方式和訪問(wèn)方式都可能會(huì)對(duì)分析結(jié)果產(chǎn)生影響。例如,應(yīng)用如果將緩存集中存儲(chǔ)在少數(shù)幾個(gè)文件當(dāng)中,那么這幾個(gè)文件被訪問(wèn)的次數(shù)可能會(huì)比較多。此外,在應(yīng)用運(yùn)行時(shí),可能會(huì)有一些保存在內(nèi)存中的緩存內(nèi)容,這些緩存內(nèi)容的具體形式因應(yīng)用而異,無(wú)法記錄關(guān)于這類緩存的確切信息,如果應(yīng)用不訪問(wèn)文件,而是直接獲取存儲(chǔ)在內(nèi)存當(dāng)中的緩存,那么可能會(huì)對(duì)檢測(cè)的結(jié)果造成影響。不過(guò)由于設(shè)備內(nèi)存容量相對(duì)設(shè)備總體存儲(chǔ)容量比較有限,這類緩存的總?cè)萘恳话惚容^小,對(duì)檢測(cè)結(jié)果的影響相對(duì)有限。未來(lái)可以加入對(duì)應(yīng)用代碼結(jié)構(gòu)的分析,找出應(yīng)用存儲(chǔ)HTTP緩存的數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)方式,以便在運(yùn)行時(shí)獲得更加準(zhǔn)確的檢測(cè)結(jié)果。

      (2)本文實(shí)驗(yàn)中的自動(dòng)化測(cè)試工具使用的是安卓SDK提供的Monkey,該工具生成的用戶事件流的隨機(jī)性比較大,可控性相對(duì)較??;而在一個(gè)移動(dòng)應(yīng)用中,不同的業(yè)務(wù)邏輯的使用頻率也不盡相同,比如在微博客戶端中,用戶可能更常刷新微博而不是發(fā)送私信,Monkey產(chǎn)生的隨機(jī)用戶事件流也許不能很好地模擬這一點(diǎn),并可能對(duì)最終檢測(cè)結(jié)果造成一定的影響。在未來(lái)的工作中,將嘗試結(jié)合一些能產(chǎn)生更加可控的用戶事件流的自動(dòng)化測(cè)試工具來(lái)進(jìn)行檢測(cè)。

      (3)應(yīng)用內(nèi)容的更新頻率和應(yīng)用的使用頻率也可能對(duì)檢測(cè)結(jié)果造成影響。如果應(yīng)用中的內(nèi)容的更新頻率很高(比如一些新聞客戶端)而使用頻率較低,檢測(cè)得到的緩存命中次數(shù)可能相對(duì)較少。在本文實(shí)驗(yàn)中,每天檢測(cè)兩次,兩次檢測(cè)時(shí)間間隔大于5 h,檢測(cè)3天,可以大致模擬普通用戶使用應(yīng)用的一般頻率,但由于無(wú)法完全了解每個(gè)應(yīng)用的內(nèi)容更新頻率,因此實(shí)驗(yàn)的結(jié)果可能受到一些影響。

      7 相關(guān)工作

      有許多與安卓應(yīng)用的HTTP緩存相關(guān)的工作。Zhang等人[7]對(duì)安卓應(yīng)用的網(wǎng)絡(luò)緩存狀況進(jìn)行了調(diào)研,并且實(shí)現(xiàn)了一個(gè)系統(tǒng)級(jí)的應(yīng)用網(wǎng)絡(luò)緩存服務(wù)。這一工作進(jìn)行的調(diào)研是通過(guò)代理服務(wù)器攔截應(yīng)用的網(wǎng)絡(luò)請(qǐng)求來(lái)實(shí)現(xiàn)的,只能實(shí)現(xiàn)對(duì)應(yīng)用網(wǎng)絡(luò)緩存的完整性的檢測(cè),無(wú)法對(duì)本文所描述的更深層次的、與應(yīng)用相關(guān)的緩存問(wèn)題進(jìn)行檢測(cè)。為了優(yōu)化移動(dòng)應(yīng)用中的HTTP請(qǐng)求調(diào)用,減少HTTP請(qǐng)求對(duì)電池電量的消耗,Li等人[11]提出了一種通過(guò)靜態(tài)分析自動(dòng)檢測(cè)安卓應(yīng)用中的HTTP請(qǐng)求并在運(yùn)行時(shí)將多個(gè)請(qǐng)求捆綁發(fā)送的方法,可以有效減少電量消耗,并且不會(huì)引入過(guò)多額外開(kāi)銷。

      還有一些與移動(dòng)端網(wǎng)絡(luò)瀏覽器的緩存相關(guān)的研究工作。其中一部分工作[12-13]將移動(dòng)設(shè)備與個(gè)人電腦上的網(wǎng)絡(luò)訪問(wèn)行為的差異進(jìn)行了比較,指出了這些差異可能對(duì)移動(dòng)端的網(wǎng)絡(luò)瀏覽器緩存產(chǎn)生的影響。還有一些工作[4,9]對(duì)移動(dòng)端網(wǎng)絡(luò)瀏覽器的緩存表現(xiàn)進(jìn)行了研究和分析,雖然這些研究針對(duì)的是瀏覽器應(yīng)用,但其中發(fā)現(xiàn)的諸如冗余傳輸、誤緩存等問(wèn)題在一些其他類型的移動(dòng)應(yīng)用中也同樣存在。Liu等人[5-6]針對(duì)這些問(wèn)題設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于代理的緩存優(yōu)化系統(tǒng),供移動(dòng)端網(wǎng)絡(luò)瀏覽器和服務(wù)器使用,可以節(jié)約網(wǎng)頁(yè)加載時(shí)間,減少網(wǎng)絡(luò)數(shù)據(jù)傳輸量。本文在上述基礎(chǔ)上更進(jìn)一步地研究了一般化的移動(dòng)應(yīng)用中存在的緩存問(wèn)題,以及應(yīng)用緩存的使用效率和空間占用情況。

      一些現(xiàn)有工作對(duì)緩存策略進(jìn)行了研究。Ihm等人[14]研究發(fā)現(xiàn),基于內(nèi)容的緩存策略相比基于對(duì)象的緩存策略,可以獲得更高的緩存命中率。Kim等人[15]對(duì)現(xiàn)有緩存策略在移動(dòng)設(shè)備閃存上的適用性進(jìn)行了調(diào)查研究,并針對(duì)移動(dòng)設(shè)備閃存容量較小、性能有限的特點(diǎn),設(shè)計(jì)了一種考慮閃存中寫(xiě)操作的空間鄰接性的緩存策略。Chavan等人[16]提出了一種新的移動(dòng)設(shè)備數(shù)據(jù)庫(kù)緩存替換策略,該策略考慮了客戶端運(yùn)動(dòng)的時(shí)間和空間屬性,以及獲取數(shù)據(jù)的模式。在移動(dòng)設(shè)備上,該策略的緩存表現(xiàn)相較傳統(tǒng)的最近最少使用策略有了較大提升。

      8 總結(jié)

      本文提出了一種基于動(dòng)態(tài)分析的安卓應(yīng)用緩存缺陷自動(dòng)檢測(cè)方法,該方法可以在運(yùn)行時(shí)監(jiān)測(cè)應(yīng)用的HTTP通信和對(duì)緩存文件的使用,從而檢測(cè)分析應(yīng)用中存在的HTTP緩存問(wèn)題。依據(jù)這一方法,實(shí)現(xiàn)了一個(gè)運(yùn)行時(shí)庫(kù)和一款安卓應(yīng)用自動(dòng)化改造工具,并使用25款安卓市場(chǎng)上的應(yīng)用進(jìn)行了實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,本文提出的方法適用于很大一部分安卓應(yīng)用,并能夠有效發(fā)現(xiàn)安卓應(yīng)用中存在的緩存缺失、緩存空間無(wú)限增長(zhǎng)和緩存冗余等問(wèn)題。本文還對(duì)發(fā)現(xiàn)的緩存問(wèn)題進(jìn)行了討論,為開(kāi)發(fā)者指出了解決這些問(wèn)題的思路和方法。

      猜你喜歡
      安卓開(kāi)發(fā)者客戶端
      文物表情包
      縣級(jí)臺(tái)在突發(fā)事件報(bào)道中如何應(yīng)用手機(jī)客戶端
      孵化垂直頻道:新聞客戶端新策略
      基于Vanconnect的智能家居瘦客戶端的設(shè)計(jì)與實(shí)現(xiàn)
      一種基于安卓系統(tǒng)的手機(jī)側(cè)抓包分析方法
      16%游戲開(kāi)發(fā)者看好VR
      CHIP新電腦(2016年3期)2016-03-10 13:06:42
      iOS開(kāi)發(fā)者調(diào)查
      電腦迷(2015年8期)2015-05-30 12:27:10
      iOS開(kāi)發(fā)者調(diào)查
      電腦迷(2015年4期)2015-05-30 05:24:09
      安卓L未至安卓M來(lái)了!安卓首泄漏M系統(tǒng)
      客戶端空間數(shù)據(jù)緩存策略
      浙江省| 儋州市| 天祝| 诸城市| 威信县| 娱乐| 焦作市| 田东县| 平顶山市| 墨脱县| 盖州市| 邛崃市| 巴彦县| 拉萨市| 朝阳县| 天等县| 三江| 虹口区| 昌宁县| 社会| 小金县| 安龙县| 边坝县| 乌兰浩特市| 十堰市| 鞍山市| 蓝山县| 祁阳县| 嵊泗县| 偏关县| 抚顺市| 绥芬河市| 静安区| 军事| 宜兰县| 嘉荫县| 荔浦县| 康马县| 博白县| 宜良县| 龙山县|