專利名稱:移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及移動(dòng)通信領(lǐng)域,特別涉及一種移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法。
背景技術(shù):
在中國,互聯(lián)網(wǎng)和移動(dòng)設(shè)備的發(fā)展相互影響,形成強(qiáng)大的普及浪潮。以智能手機(jī)、上網(wǎng)本為代表的移動(dòng)終端在激烈的競(jìng)爭(zhēng)中迅猛發(fā)展。根據(jù)中國互聯(lián)信息網(wǎng)絡(luò)中心(CNNIC)第29次互聯(lián)網(wǎng)調(diào)查報(bào)告稱,截止2011年12月底,中國有5. 13億互聯(lián)網(wǎng)用戶,其中手機(jī)上網(wǎng)用戶3. 56億,占網(wǎng)民總體的近69. 4%。以安卓(Android)系統(tǒng)為代表的移動(dòng)終端開源操作系統(tǒng)的使用比例和影響能力在不斷擴(kuò)大。GARTNER公司的報(bào)告顯示,在2011年的第四季度,Android是全球使用最廣泛的智能手機(jī)操作系統(tǒng),在全球智能手機(jī)中的市場(chǎng)占有率約50%。Android系統(tǒng)一開始就是用開源、開放的開發(fā)方式,受到業(yè)界和學(xué)術(shù)界的廣泛關(guān)注,自從發(fā)布以來,Android的版本基本上每半年一個(gè)臺(tái)階地向前發(fā)展。其平臺(tái)的開放性也吸引了大量的第三方開發(fā)者進(jìn)行應(yīng)用程序開發(fā),Android Market上的應(yīng)用程序數(shù)量從2009年12月的1.6萬迅速增長(zhǎng)到2012年上半年的50萬。隨著近年移動(dòng)設(shè)備和相關(guān)軟件的迅速發(fā)展,移動(dòng)設(shè)備上的操作系統(tǒng)和應(yīng)用程序的復(fù)雜性、程序體積都比幾年前大幅提高,這也就對(duì)移動(dòng)操作系統(tǒng)的優(yōu)化提出了很多新的需求。在這些快速發(fā)展中,有相當(dāng)數(shù)量原來用于桌面和服務(wù)器系統(tǒng)的組件僅作少量移植后就用于移動(dòng)操作系統(tǒng)上,例如Android系統(tǒng)自身就使用了一百余個(gè)外來的開源軟件代碼,它們既包括最底層的Linux內(nèi)核,也包括上層的WebKit瀏覽器引擎等。這些組件并非專門針對(duì)移動(dòng)操作系統(tǒng)所編寫,移植到移動(dòng)操作系統(tǒng)以后往往還存在優(yōu)化空間,但如果對(duì)它們一一進(jìn)行手工優(yōu)化將耗費(fèi)大量人力物力資源。因此發(fā)明一種能自動(dòng)進(jìn)行全系統(tǒng)優(yōu)化的方法非常有必要。Android系統(tǒng)分為四層,從上到下依次為·應(yīng)用程序使用Java語言編寫,可通過Java本地接口(JNI)調(diào)用本地代碼。 應(yīng)用程序框架使用Java、C、C++編寫,向應(yīng)用程序提供活動(dòng)管理器、窗口管理器等服務(wù)?!は到y(tǒng)庫和Android運(yùn)行時(shí)環(huán)境使用C/C++以及少量匯編編寫,為應(yīng)用程序和應(yīng)用程序框架提供必要的與系統(tǒng)交互的接口?!?Linux內(nèi)核操作系統(tǒng)內(nèi)核,使用為Android修改過的Linux內(nèi)核。整個(gè)Android系統(tǒng)(Android_x86,20120215版本)包含2270萬行代碼,包括C、C++、Java以及其他語言。除了 Linux內(nèi)核以外,系統(tǒng)中共有950萬行本地代碼(C、C++及
少量匯編)。Android系統(tǒng)基于Linux內(nèi)核,但并沒有使用其他Linux系統(tǒng)常用的GNU Iibc(服務(wù)器、桌面Linux系統(tǒng)常用)或uClibc (基于Linux的嵌入式系統(tǒng)常用),而是使用了專有的C庫,稱為Bionic。Bionic庫的部分代碼衍生自BSD,部分專門為Android編寫,并針對(duì)Android系統(tǒng)作了優(yōu)化和精簡(jiǎn),刪除了 Android不需要的功能。優(yōu)化后的Bionic庫的代碼體積顯著減小,在x86平臺(tái)上僅有GNU Iibc的26%, uClibc的62%。從Bionic的例子可以看出,通用的代碼在被用于特定的系統(tǒng)時(shí)會(huì)有比較大的優(yōu)化空間。據(jù)此可以推測(cè)=Android上的其他組件也會(huì)有優(yōu)化的空間,尤其是那些原本為服務(wù)器和桌面系統(tǒng)編寫的組件。由于工作量的關(guān)系,Android沒有也不可能為系統(tǒng)中的每一個(gè)組件都人工進(jìn)行如此細(xì)致的優(yōu)化。本發(fā)明通過一種自動(dòng)進(jìn)行全系統(tǒng)優(yōu)化的方法解決了這個(gè)問題。本發(fā)明給出移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法,從全系統(tǒng)編譯后的目標(biāo)文件中讀取信息,基于這些信息構(gòu)建全系統(tǒng)的擴(kuò)展調(diào)用圖,進(jìn)一步找出擴(kuò)展調(diào)用圖中的有效子圖,根據(jù)有效子圖對(duì)目標(biāo)文件進(jìn)行二進(jìn)制重寫后,鏈接生成優(yōu)化后的可執(zhí)行文件和動(dòng)態(tài)庫文件。本發(fā)明使用自動(dòng)的方法進(jìn)行全系統(tǒng)分析和優(yōu)化,不影響系統(tǒng)的源代碼,優(yōu)化過程不需人工干預(yù),優(yōu)化后的系統(tǒng)體積減小,性能有所提升,具有重要的實(shí)際意義和應(yīng)用價(jià)值。
發(fā)明內(nèi)容
本發(fā)明使用程序分析技術(shù),設(shè)計(jì)出一種移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法,方法針對(duì)目前廣泛采用的移動(dòng)終端操作系統(tǒng)中的軟件優(yōu)化問題,給出自動(dòng)優(yōu)化的方法。以Android系統(tǒng)為例,要求考慮除了底層Linux內(nèi)核以外的所有本地代碼,對(duì)它們進(jìn)行自動(dòng)優(yōu)化,在確保優(yōu)化后的系統(tǒng)正確性不受影響的前提下,消除無用代碼,減小代碼體積,提升系統(tǒng)性能。本發(fā)明的特征在于,是在計(jì)算機(jī)中依次按以下步驟實(shí)現(xiàn)的步驟(I):編譯移動(dòng)終端操作系統(tǒng)的源代碼,生成可重定位的目標(biāo)文件;從源代碼服務(wù)器中下載源代碼,修改相關(guān)的Makefile,向CFLAGS添加“-ffunction-sections”參數(shù)和“-fdata-sections”參數(shù)以使編譯器將每個(gè)函數(shù)和數(shù)據(jù)對(duì)象編譯到單獨(dú)的段中,再運(yùn)行make命令自動(dòng)編譯所述源代碼生成可重定位的目標(biāo)文件,其中函數(shù)和數(shù)據(jù)對(duì)象統(tǒng)稱為“實(shí)體”,所述數(shù)據(jù)對(duì)象既包括源代碼中定義的全局和靜態(tài)變量,也至少包括虛函數(shù)表在內(nèi)的編譯器生成的數(shù)據(jù)對(duì)象;步驟(2):按以下步驟構(gòu)造有向的全系統(tǒng)擴(kuò)展調(diào)用圖步驟(2.1):對(duì)步驟(I)得到的目標(biāo)文件,讀取以下信息,其中包括SS、GS、AF和AU SS,所述目標(biāo)文件中所有包含有所述實(shí)體的段的名稱集合,GS,所述目標(biāo)文件中定義的所有全局符號(hào)及其名稱,并以關(guān)聯(lián)表的形式存儲(chǔ),以便從全局符號(hào)的名稱迅速查找所在的段的名稱,AF,頭和尾都屬于同一個(gè)所述目標(biāo)文件的有向邊形成的集合,AU,頭屬于一個(gè)所述目標(biāo)文件,尾為暫未解析的符號(hào)的有向邊,其中每一個(gè)兀素表示為(u, sym),其中u屬于SS,是所述目標(biāo)文件中的一個(gè)所述實(shí)體,sym為一個(gè)外部符號(hào)的名,表示被實(shí)體u引用,但不在同一個(gè)所述目標(biāo)文件中定義的實(shí)體,
步驟(2. 2),根據(jù)步驟(2.1)中所得到的信息,合并為一個(gè)系統(tǒng)全局的有向圖,從而得到所述擴(kuò)展調(diào)用圖的V和E,其中V為所有所述目標(biāo)文件SS的并集,是一個(gè)結(jié)點(diǎn)集,其中每一個(gè)結(jié)點(diǎn)的名稱用所對(duì)應(yīng)的一個(gè)二元組表示,其中包括目標(biāo)文件名和段名,E為有向邊集,它包括兩部分=E=E1 U E2,其中E1為所有所述目標(biāo)文件的AF的并集,代表了頭和尾都屬于同一個(gè)所述目標(biāo)文件的有向邊所形成的集合,E2為頭和尾屬于不同的所述目標(biāo)文件的有向邊形成的集合,按以下方法得到首先,令馬=0,再遍歷每個(gè)所述目標(biāo)文件的AU集合,對(duì)其中的每一個(gè)元素(U,sym),查找所有所述目標(biāo)文件的GS集,得到所有名稱為sym的全局符號(hào)的所述實(shí)體集合S[sym],將所有二元組(U,V) I ves[sym]加入集合E2,并將E1與E2取并集得到E,其中每一個(gè)元素是一對(duì)結(jié)點(diǎn)(U,V),對(duì)應(yīng)所述系統(tǒng)擴(kuò)展調(diào)用圖中一條從u到V的有向邊,當(dāng)且僅當(dāng)u的重定位數(shù)據(jù)中有相對(duì)V的重定位記錄時(shí),在所述系統(tǒng)擴(kuò)展調(diào)用圖中存在一條從u到V的邊,步驟(2. 3),按以下步驟得到入口點(diǎn)集R 步驟(2.3.1),令i =0,步驟(2. 3. 2),把同程序啟動(dòng)代碼對(duì)應(yīng)的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R,在Android中_start符號(hào)所對(duì)應(yīng)的實(shí)體即為程序啟動(dòng)代碼,步驟(2. 3. 3),把可能通過動(dòng)態(tài)綁定使用的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R,步驟(2. 3. 4),把位于不以.text、, data、, rodata、. bss打頭的段中的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R,步驟(2.4),從步驟(2.1)至步驟(2.3)得到的V、E、R表示為一個(gè)所述的系統(tǒng)調(diào)用圖 G=(V,E,R);步驟(3),按以下步驟從步驟(2)得到的所述系統(tǒng)擴(kuò)展調(diào)用圖G中得到有效子圖Gs= (Vs, Es, R),其中Vs為有效結(jié)點(diǎn)集,Es為有效的有向邊集,表示為
權(quán)利要求
1.一種移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法,其特征在于,是在計(jì)算機(jī)中依次按以下步驟實(shí)現(xiàn)的步驟(I):編譯移動(dòng)終端操作系統(tǒng)的源代碼,生成可重定位的目標(biāo)文件;從源代碼服務(wù)器中下載源代碼’修改相關(guān)的Makefile,向CFLAGS添加 “-ffunction-sections”參數(shù)和“-fdata-sections”參數(shù)以使編譯器將每個(gè)函數(shù)和數(shù)據(jù)對(duì)象編譯到單獨(dú)的段中,再運(yùn)行make命令自動(dòng)編譯所述源代碼生成可重定位的目標(biāo)文件,其中函數(shù)和數(shù)據(jù)對(duì)象統(tǒng)稱為“實(shí)體”,所述數(shù)據(jù)對(duì)象既包括源代碼中定義的全局和靜態(tài)變量, 也至少包括虛函數(shù)表在內(nèi)的編譯器生成的數(shù)據(jù)對(duì)象;步驟(2):按以下步驟構(gòu)造有向的全系統(tǒng)擴(kuò)展調(diào)用圖步驟(2.1):對(duì)步驟(I)得到的目標(biāo)文件,讀取以下信息,其中包括SS、GS、AF和AU SS,所述目標(biāo)文件中所有包含有所述實(shí)體的段的名稱集合,GS,所述目標(biāo)文件中定義的所有全局符號(hào)及其名稱,并以關(guān)聯(lián)表的形式存儲(chǔ),以便從全局符號(hào)的名稱迅速查找所在的段的名稱,AF,頭和尾都屬于同一個(gè)所述目標(biāo)文件的有向邊形成的集合,AU,頭屬于一個(gè)所述目標(biāo)文件,尾為暫未解析的符號(hào)的有向邊,其中每一個(gè)兀素表不為 (u, sym),其中u屬于SS,是所述目標(biāo)文件中的一個(gè)所述實(shí)體,sym為一個(gè)外部符號(hào)的名,表示被實(shí)體u引用,但不在同一個(gè)所述目標(biāo)文件中定義的實(shí)體,步驟(2. 2),根據(jù)步驟(2.1)中所得到的信息,合并為一個(gè)系統(tǒng)全局的有向圖,從而得到所述擴(kuò)展調(diào)用圖的V和E,其中V為所有所述目標(biāo)文件SS的并集,是一個(gè)結(jié)點(diǎn)集,其中每一個(gè)結(jié)點(diǎn)的名稱用所對(duì)應(yīng)的一個(gè)二元組表示,其中包括目標(biāo)文件名和段名,E為有向邊集,它包括兩部分=E=E1 U E2,其中E1為所有所述目標(biāo)文件的AF的并集,代表了頭和尾都屬于同一個(gè)所述目標(biāo)文件的有向邊所形成的集合,E2為頭和尾屬于不同的所述目標(biāo)文件的有向邊形成的集合,按以下方法得到首先,令及=0 ,再遍歷每個(gè)所述目標(biāo)文件的AU集合,對(duì)其中的每一個(gè)元素(u,sym),查找所有所述目標(biāo)文件的GS集,得到所有名稱為sym的全局符號(hào)的所述實(shí)體集合S [sym],將所有二元組(u, v) I ve S[sym]加入集合E2, 并將E1與E2取并集得到E,其中每一個(gè)元素是一對(duì)結(jié)點(diǎn)(U,V),對(duì)應(yīng)所述系統(tǒng)擴(kuò)展調(diào)用圖中一條從U到V的有向邊,當(dāng)且僅當(dāng)U的重定位數(shù)據(jù)中有相對(duì)V的重定位記錄時(shí),在所述系統(tǒng)擴(kuò)展調(diào)用圖中存在一條從U到V的邊,步驟(2. 3),按以下步驟得到入口點(diǎn)集R :步驟(2. 3. 1),令R=0,步驟(2. 3. 2),把同程序啟動(dòng)代碼對(duì)應(yīng)的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R, 在Android中_start符號(hào)所對(duì)應(yīng)的實(shí)體即為程序啟動(dòng)代碼,步驟(2. 3. 3),把可能通過動(dòng)態(tài)綁定使用的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R,步驟(2. 3. 4),把位于不以.text、, data、, rodata、. bss打頭的段中的所述實(shí)體作為一個(gè)結(jié)點(diǎn)加入所述入口點(diǎn)集R,步驟(2. 4),從步驟(2.1)至步驟(2. 3)得到的V、E、R表示為一個(gè)所述的系統(tǒng)調(diào)用圖 G= (V, E, R);步驟(3),按以下步驟從步驟(2)得到的所述系統(tǒng)擴(kuò)展調(diào)用圖G中得到有效子圖 Gs= (Vs, Es, R),其中Vs為有效結(jié)點(diǎn)集,Es為有效的有向邊集,表示為
全文摘要
一種移動(dòng)終端操作系統(tǒng)基于全系統(tǒng)擴(kuò)展調(diào)用圖的自動(dòng)優(yōu)化方法,涉及移動(dòng)終端軟件領(lǐng)域,所述方法適用于移動(dòng)終端操作系統(tǒng),可以實(shí)現(xiàn)在全系統(tǒng)范圍內(nèi)消除無用代碼,在不降低系統(tǒng)性能的前提下減小系統(tǒng)代碼體積,從而減少移動(dòng)終端硬件制造成本。方法的主要步驟如下編譯源代碼得到目標(biāo)文件;從目標(biāo)文件出發(fā),構(gòu)建全系統(tǒng)所有本地代碼的擴(kuò)展調(diào)用圖;對(duì)擴(kuò)展調(diào)用圖進(jìn)行分析,從入口點(diǎn)開始得到擴(kuò)展調(diào)用圖的有效子圖;對(duì)編譯生成的目標(biāo)文件進(jìn)行重寫,刪除所有不在有效子圖中的代碼;鏈接生成優(yōu)化的二進(jìn)制代碼。本發(fā)明具有應(yīng)用范圍廣、自動(dòng)化程度高、使用方便、優(yōu)化效果明顯等特點(diǎn)。
文檔編號(hào)G06F9/44GK103034486SQ20121049545
公開日2013年4月10日 申請(qǐng)日期2012年11月28日 優(yōu)先權(quán)日2012年11月28日
發(fā)明者董淵, 王生原, 李疊, 駱歡 申請(qǐng)人:清華大學(xué)