国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

2018-09-12 02:21楊嘉成趙文耘
計(jì)算機(jī)與生活 2018年9期
關(guān)鍵詞:安卓開發(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)用帶來強(qiáng)大支持的同時(shí),也給移動(dòng)用戶帶來了一些潛在的問題。首先,移動(dòng)應(yīng)用訪問網(wǎng)絡(luò)的過程會(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)下超過40%的電量消耗來自網(wǎng)絡(luò)通信,其中由超文本傳輸協(xié)議(hypertext transfer protocol,HTTP)操作所導(dǎo)致的電量消耗占近80%[1]。最后,移動(dòng)應(yīng)用在通過網(wǎng)絡(luò)獲取數(shù)據(jù)并進(jìn)行本地處理的過程中,網(wǎng)絡(luò)傳輸可能由于網(wǎng)絡(luò)狀況不佳或數(shù)據(jù)傳輸量大而成為應(yīng)用響應(yīng)的瓶頸,影響用戶體驗(yàn)。

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

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

當(dāng)前已經(jīng)有一些研究工作關(guān)注于移動(dòng)應(yīng)用的緩存問題,但這些工作主要關(guān)注于移動(dòng)端網(wǎng)絡(luò)瀏覽器的HTTP緩存表現(xiàn)[4-6]。有些研究針對(duì)應(yīng)用的HTTP緩存問題進(jìn)行檢測[7],但策略比較簡單且沒有考慮安卓應(yīng)用的特點(diǎn),因此無法發(fā)現(xiàn)其中所包含的深層問題,比如應(yīng)用緩存占用的設(shè)備空間、應(yīng)用緩存的有效性等。為了實(shí)現(xiàn)細(xì)粒度的安卓應(yīng)用緩存缺陷檢測,發(fā)現(xiàn)與特定安卓應(yīng)用特點(diǎn)相關(guān)的HTTP緩存問題,本文提出并實(shí)現(xiàn)了一種基于動(dòng)態(tài)分析的安卓應(yīng)用HTTP緩存缺陷檢測方法。該方法可以針對(duì)安卓應(yīng)用的APK(安卓應(yīng)用安裝包,Android package)文件進(jìn)行插裝,使其具有在運(yùn)行時(shí)監(jiān)測并記錄與HTTP緩存相關(guān)的行為和數(shù)據(jù)的能力。該方法通過安卓應(yīng)用自動(dòng)化測試工具對(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)用市場上的25個(gè)安卓應(yīng)用進(jìn)行了自動(dòng)化分析。分析結(jié)果表明,所提出的方法適用于當(dāng)前應(yīng)用市場上的大多數(shù)應(yīng)用。同時(shí),該方法能夠有效發(fā)現(xiàn)安卓應(yīng)用中存在的緩存缺失、緩存空間無限增長和緩存冗余等問題。針對(duì)所發(fā)現(xiàn)的這些問題,本文還分析了出現(xiàn)這些問題的原因以及解決的思路。

2 背景

安卓應(yīng)用通常是用Java語言編寫的,打包成APK文件以供安裝使用。從應(yīng)用源代碼到打包好的APK文件,一般要經(jīng)過以下幾個(gè)階段的轉(zhuǎn)換:首先,應(yīng)用源代碼被編譯成Java類文件;然后,這些類文件被安卓軟件開發(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。其中,前者是目前官方建議開發(fā)者使用的HTTP客戶端API;后者在安卓API 22級(jí)之后已經(jīng)廢棄,但由于一些較早開發(fā)的代碼中仍有使用,出于兼容性的考慮,安卓對(duì)這部分代碼保留了支持。此外,還有一些第三方HTTP客戶端,如OkHttp,可供安卓開發(fā)者使用,這些HTTP客戶端一般也都是基于HttpURLConnection實(shí)現(xiàn)的。借助上述HTTP客戶端API,開發(fā)者可以非常方便地編寫代碼,獲取HTTP資源。但值得注意的是,這些HTTP客戶端本身要么缺少緩存機(jī)制接口供開發(fā)者使用,要么雖然提供了緩存支持,但可能需要開發(fā)者自行開啟,并且緩存處理較為簡單。

安卓設(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)。通常來講,安卓設(shè)備的內(nèi)部存儲(chǔ)在應(yīng)用運(yùn)行時(shí)是始終可用的,各應(yīng)用的存儲(chǔ)空間相互隔離,應(yīng)用無法訪問其他應(yīng)用在內(nèi)部存儲(chǔ)中保存的文件;在用戶卸載某個(gè)應(yīng)用后,系統(tǒng)將移除該應(yīng)用所保存的文件。而安卓設(shè)備的外部存儲(chǔ)并不始終可用,在外部存儲(chǔ)中保存的文件是全局可讀的;用戶卸載某個(gè)應(yīng)用時(shí),只有保存在某些特定路徑(通過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)檢測方法,該方法的概覽如圖1所示。

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

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

改造過程中引入原始應(yīng)用中的運(yùn)行時(shí)庫負(fù)責(zé)在應(yīng)用運(yùn)行時(shí)獲取上述數(shù)據(jù),該運(yùn)行時(shí)庫主要有三大職責(zé):(1)記錄應(yīng)用的文件訪問和刪除操作的相關(guān)信息;(2)監(jiān)測應(yīng)用中的HTTP訪問,記錄HTTP響應(yīng)的頭部信息(統(tǒng)一資源定位符、過期時(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í)庫初始化處理,包括設(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)行。在改造過的應(yīng)用被啟動(dòng)后,方法借助安卓自動(dòng)化測試工具(如Monkey、Robotium等),自動(dòng)化地向安卓設(shè)備發(fā)送用戶事件流。用戶事件包括點(diǎn)擊事件、觸屏事件、手勢操作和按鍵操作等。通過自動(dòng)生成的用戶事件流,模擬用戶使用應(yīng)用的過程,產(chǎn)生原始應(yīng)用邏輯中訪問文件、獲取網(wǎng)絡(luò)資源的操作。

在應(yīng)用運(yùn)行時(shí),被引入的運(yùn)行時(shí)庫會(huì)實(shí)時(shí)監(jiān)測并收集前述的與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è)緩存文件的訪問次數(shù)以及緩存文件總訪問次數(shù);(4)應(yīng)用占用的設(shè)備內(nèi)部存儲(chǔ)和外部存儲(chǔ)空間的大小變化;(5)應(yīng)用運(yùn)行過程中刪除的文件的文件名,以及這些文件在刪除前的容量。

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

最后,方法對(duì)運(yùn)行獲得的日志記錄進(jìn)行分析。分析的內(nèi)容主要包括:(1)應(yīng)用緩存的完整性(也就是說,是否存在從網(wǎng)絡(luò)中請(qǐng)求之前訪問過并且還未過期的資源);(2)應(yīng)用緩存控制設(shè)置是否保守;(3)應(yīng)用的緩存對(duì)設(shè)備內(nèi)部和外部存儲(chǔ)的空間占用狀況;(4)冗余緩存文件(未被使用過的緩存文件)數(shù)量,以及這些文件占所有緩存文件的比例;(5)上次被訪問時(shí)間在某一時(shí)刻之前的緩存文件的數(shù)量,以及這些文件占所有緩存文件的比例;(6)緩存文件平均訪問次數(shù);(7)應(yīng)用對(duì)緩存空間占用的控制。對(duì)于(1)、(2)兩部分內(nèi)容,運(yùn)行時(shí)庫在運(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)攔截分析過程

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

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

圖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í)庫。對(duì)每一個(gè)activity類,改造工具會(huì)向其生命周期函數(shù)(onCreate,onResume和onStop方法)中引入額外的代碼,以在進(jìn)入應(yīng)用時(shí)對(duì)緩存監(jiān)控進(jìn)行初始化,并在離開應(yīng)用時(shí)結(jié)束緩存監(jiān)控,更新未持久化的數(shù)據(jù)記錄。這部分改造的方法與CollaDroid[8]中介紹的程序改造方法類似。

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

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

與HTTP資源訪問相關(guān)的語句包括那些調(diào)用java.net.HttpURLConnection類中的getInputStream方法和調(diào)用org.apache.http.client.HttpClient接口中的execute方法的語句。調(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í)庫中的方法來替換原始應(yīng)用中相關(guān)的方法調(diào)用,從而在不影響應(yīng)用正常使用的情況下實(shí)現(xiàn)對(duì)應(yīng)用中發(fā)生的HTTP訪問的監(jiān)測。

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改造工具是通過Java語言開發(fā)的,可以運(yùn)行在任何安裝了Java運(yùn)行時(shí)環(huán)境的機(jī)器上。使用這一工具對(duì)原始的APK文件進(jìn)行改造,然后安裝在安卓設(shè)備上,并使用安卓SDK提供的Monkey測試工具模擬應(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 適用性

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

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

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

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

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

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

對(duì)改造成功并可以在安卓設(shè)備上正常運(yùn)行的19款應(yīng)用進(jìn)行了運(yùn)行檢測。為了自動(dòng)化地生成用戶事件流,使用了安卓SDK提供的Monkey工具,該工具可以向安卓模擬器或真實(shí)設(shè)備中發(fā)送偽隨機(jī)用戶事件流,模擬用戶的觸屏、點(diǎn)擊、手勢和按鍵等操作。借助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)開始時(shí)應(yīng)用都是全新安裝的),得到的數(shù)據(jù)及分析結(jié)果如圖5所示。

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

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

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

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

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

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

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

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

5 討論

第4章的實(shí)驗(yàn)結(jié)果表明,在目前安卓市場上的應(yīng)用中,應(yīng)用的HTTP緩存使用存在如下問題:(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)行過程中獲取的HTTP資源進(jìn)行了緩存,但往往忽略了對(duì)緩存的管理,沒有對(duì)緩存文件的空間占用進(jìn)行控制,導(dǎo)致緩存空間無限制增長,影響設(shè)備的整體使用。(3)應(yīng)用運(yùn)行過程中產(chǎn)生的緩存文件中,有很大一部分是冗余的、無意義的,它們?cè)谏珊蟛]有被應(yīng)用所使用,無法起到開發(fā)者期望的效果;同時(shí),一些緩存文件雖然被使用過,但在應(yīng)用隨后的運(yùn)行過程中不再被訪問,這些緩存文件實(shí)際上也已經(jīng)是冗余的。

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

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

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

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

(4)應(yīng)用在運(yùn)行時(shí)應(yīng)該及時(shí)清理那些長時(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ì)用戶來說仍是一件比較繁瑣的事情。應(yīng)用應(yīng)當(dāng)把存儲(chǔ)空間優(yōu)先分配給那些使用頻率較高的緩存內(nèi)容,及時(shí)清理那些使用頻率低或者長時(shí)間沒有被使用的緩存內(nèi)容,這樣既可以保證應(yīng)用的流暢運(yùn)行,發(fā)揮緩存應(yīng)有的效果,又可以保證良好的用戶使用體驗(yàn)。

6 局限和未來工作

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

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

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

(3)應(yīng)用內(nèi)容的更新頻率和應(yīng)用的使用頻率也可能對(duì)檢測結(jié)果造成影響。如果應(yīng)用中的內(nèi)容的更新頻率很高(比如一些新聞客戶端)而使用頻率較低,檢測得到的緩存命中次數(shù)可能相對(duì)較少。在本文實(shí)驗(yàn)中,每天檢測兩次,兩次檢測時(shí)間間隔大于5 h,檢測3天,可以大致模擬普通用戶使用應(yīng)用的一般頻率,但由于無法完全了解每個(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)研是通過代理服務(wù)器攔截應(yīng)用的網(wǎng)絡(luò)請(qǐng)求來實(shí)現(xiàn)的,只能實(shí)現(xiàn)對(duì)應(yīng)用網(wǎng)絡(luò)緩存的完整性的檢測,無法對(duì)本文所描述的更深層次的、與應(yīng)用相關(guān)的緩存問題進(jìn)行檢測。為了優(yōu)化移動(dòng)應(yīng)用中的HTTP請(qǐng)求調(diào)用,減少HTTP請(qǐng)求對(duì)電池電量的消耗,Li等人[11]提出了一種通過靜態(tài)分析自動(dòng)檢測安卓應(yīng)用中的HTTP請(qǐng)求并在運(yùn)行時(shí)將多個(gè)請(qǐng)求捆綁發(fā)送的方法,可以有效減少電量消耗,并且不會(huì)引入過多額外開銷。

還有一些與移動(dòng)端網(wǎng)絡(luò)瀏覽器的緩存相關(guān)的研究工作。其中一部分工作[12-13]將移動(dòng)設(shè)備與個(gè)人電腦上的網(wǎng)絡(luò)訪問行為的差異進(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)的諸如冗余傳輸、誤緩存等問題在一些其他類型的移動(dòng)應(yīng)用中也同樣存在。Liu等人[5-6]針對(duì)這些問題設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于代理的緩存優(yōu)化系統(tǒng),供移動(dòng)端網(wǎng)絡(luò)瀏覽器和服務(wù)器使用,可以節(jié)約網(wǎng)頁加載時(shí)間,減少網(wǎng)絡(luò)數(shù)據(jù)傳輸量。本文在上述基礎(chǔ)上更進(jìn)一步地研究了一般化的移動(dòng)應(yīng)用中存在的緩存問題,以及應(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ì)了一種考慮閃存中寫操作的空間鄰接性的緩存策略。Chavan等人[16]提出了一種新的移動(dòng)設(shè)備數(shù)據(jù)庫緩存替換策略,該策略考慮了客戶端運(yùn)動(dòng)的時(shí)間和空間屬性,以及獲取數(shù)據(jù)的模式。在移動(dòng)設(shè)備上,該策略的緩存表現(xiàn)相較傳統(tǒng)的最近最少使用策略有了較大提升。

8 總結(jié)

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

猜你喜歡
安卓開發(fā)者客戶端
你的手機(jī)安裝了多少個(gè)客戶端
“人民網(wǎng)+客戶端”推出數(shù)據(jù)新聞
——穩(wěn)就業(yè)、惠民生,“數(shù)”讀十年成績單
iPhone不卡的秘密曝光:安卓也能享受
文物表情包
安卓系統(tǒng)或成智能汽車標(biāo)配
“85后”高學(xué)歷男性成為APP開發(fā)新生主力軍
16%游戲開發(fā)者看好VR
新華社推出新版客戶端 打造移動(dòng)互聯(lián)新聞旗艦
安卓機(jī)器人
台东县| 蛟河市| 固阳县| 乌审旗| 咸阳市| 合川市| 丹寨县| 邓州市| 永平县| 石门县| 临猗县| 舞钢市| 城口县| 安泽县| 治县。| 凤冈县| 抚远县| 连云港市| 繁昌县| 兴安盟| 和龙市| 秦安县| 蒲城县| 迁西县| 泽库县| 永兴县| 抚顺县| 桃园市| 罗甸县| 双鸭山市| 长子县| 潮安县| 开化县| 屏边| 吉安县| 裕民县| 丹阳市| 东阳市| 溧水县| 石台县| 保康县|