欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android APP瘦身(清除工程中沒用到的資源)詳解

 更新時(shí)間:2016年11月15日 10:31:39   作者:AngelDevil  
這篇文章主要介紹了Android 清除工程中沒用到的資源詳解的相關(guān)資料,這里舉例說明如何實(shí)現(xiàn),需要的朋友可以參考下

清除Android工程中沒用到的資源

項(xiàng)目需求一改再改,UI一調(diào)再調(diào),結(jié)果就是項(xiàng)目中一堆已經(jīng)用不到但卻沒有清理的垃圾資源,不說工程大小問題,對新進(jìn)入項(xiàng)目的人或看其他模塊的代碼的人來說,這些沒清理的資源可能也可能會帶來困擾,所以最好還是清理掉這些垃圾,對于一個(gè)稍微大一點(diǎn)的工程來說,手工清理明顯是不現(xiàn)實(shí)的,這就需要一個(gè)方法做這些事情。

清理資源文件

要清理沒用的資源,首要的工作當(dāng)然是找到他們,我們知道Anroid SDK中有一個(gè)工具叫l(wèi)int,可以幫助我們查看工程中存在的問題,其中有一項(xiàng)功能就是查找沒用到的資源,這樣這一步就簡單了,直接對需要清理的工程執(zhí)行以下命令:

lint --check "UnusedResources" [project_path] > result.txt

執(zhí)行完以上命令后工程中關(guān)于UnusedResources的問題就都保存到result.txt了,先來看一下result.txt的內(nèi)容

res/values/arrays.xml:202: Warning: The resource R.array.msg_my_friend_category_items appears to be unused [UnusedResources]
^M
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
res/layout/back_up_level_list.xml: Warning: The resource R.layout.back_up_level_list appears to be unused [UnusedResources]
res/layout/backup_list.xml: Warning: The resource R.layout.backup_list appears to be unused [UnusedResources]
res/layout/backup_listview_item.xml: Warning: The resource R.layout.backup_listview_item appears to be unused [UnusedResources]

可以看到列出了沒用到的layout及沒用到的values值等信息。有了這些信息,接下來需要做的就是分析這些信息了,手工分析不太現(xiàn)實(shí),因?yàn)檫@個(gè)文件可能會非常大,比如我執(zhí)行上述命令后文件就有2212行,這種事情,當(dāng)然是交給計(jì)算機(jī)解決了。

仔細(xì)看生成的文本中的內(nèi)容會發(fā)現(xiàn)結(jié)果是按行輸出的,每個(gè)問題是單獨(dú)的一行,而且每一行中的內(nèi)容也很有規(guī)律

file_path[:line]: Warning: info [UnusedResources}

所以還是可以很方便地得到哪個(gè)文件甚至哪行有問題的,我處理的時(shí)候只清理了沒用的文件,像上面的res/values/arrays.xml:202就沒有管,下面看下怎么清除沒用到的資源文件。

String projectPath = "***";
BufferedReader reader = new BufferedReader(new FileReader("/home/angeldevil/result.txt"));
String line;
int count = 0;
while((line = reader.readLine()) != null) {
 if (line.contains("UnusedResources") && !line.contains("res/value") && !line.contains("appcompat")) {
  count++;
  int end = line.indexOf(":");
  if (end != -1){
   String file = line.substring(0, end);
   String f = projectPath +file;
   System.out.println(f);
   new File(f).delete();
  }
 }
}

程序非常簡單,就幾行代碼,就是讀取result.txt文件的每一行,根據(jù)自己需要的條件過濾掉不需要處理的行(比如我只想清理anim、drawable及l(fā)ayout,所以過濾掉res/value目錄下的信息,并且忽略appcompat相關(guān)的信息),每一行":"前的字符串就是文件名,找到了文件名就好處理了,直接刪除,或者打印出來,或者寫到一個(gè)文件里以再次確認(rèn)是否確認(rèn)要?jiǎng)h除,當(dāng)把結(jié)果寫到一個(gè)文件后我們就可以查看這個(gè)文件是否有現(xiàn)在沒用到但仍不想刪除的文件,如果有,處理方法也很簡單,去掉這一行或簡單地做個(gè)標(biāo)記,如前面打#,然后再讀取這個(gè)文件把沒做標(biāo)記的行對應(yīng)的文件刪除就行了。

看起來很簡單,但是有幾點(diǎn)需要注意:

1.有些layout文件,可能你之前用了他們,并在相應(yīng)的Java文件中用了這個(gè)layout布局中的id,如對某些ID的控件設(shè)置了onClickListener,并在onClick的switch...case中引用了這些ID,但最后又不用這個(gè)Layout了,這時(shí)這個(gè)layout就是UnusedResource,但是以前引用它的Java代碼中對這個(gè)layout中的某些ID的引用還沒清除,此時(shí)刪掉這個(gè)Layout就會報(bào)錯(cuò),你可以選擇清理報(bào)錯(cuò)的Java代碼,因?yàn)樗鼈兤鋵?shí)時(shí)Dead Code?;蛘呙看吻謇硪徊糠仲Y源文件,如先清理layout,再清理drawable,對于每一項(xiàng)也可以根據(jù)文件名的規(guī)則每次再清理一小部分,如只清理res/layout中以item_of開頭的文件。。。

2.lint的分析貌似是不完全準(zhǔn)確的,或者說不夠智能,比如有一個(gè)drawable只被一個(gè)layout引用,而這個(gè)layout又是Unused的,lint可能不會發(fā)現(xiàn)這個(gè)drawable是Unused,這就需要我們多次重復(fù)執(zhí)行前面的步驟,直到count為0。

3.lint只能分析資源文件,即res目錄下的文件,如果要分析Java文件還需要其他方法,而且,有可能某個(gè)資源文件被某Java文件引用,而這個(gè)Java文件又是Unused,這樣這個(gè)資源文件就會逃過lint的檢查,所以我們最好先清理了Java文件再清理資源文件。

清理Java文件

首先還是要找到未用到的文件,還是利用工具,我用的是UCDetector,即Unused Code Detector,使用方法就不說了,直接Google一下。

安裝Eclipse的UCDetector插件,對工程執(zhí)行檢查,這個(gè)需要的時(shí)間可能會很長,我當(dāng)時(shí)檢查了兩個(gè)小時(shí)。。同lint一樣,結(jié)果會輸出到一個(gè)文本文件中,同樣是每個(gè)問題一行,所以只要行分析就行了,比如這樣:

com..SampleAdapter.(SampleAdapter.java:18) Class "SampleAdapter" has 0 references SampleAdapter org.ucdetector.analyzeMarkerReference
com..SampleAdapter.(SampleAdapter.java:56) Change visibility of Member class "SampleAdapter.ViewHolder" to private - May cause compile errors! SampleAdapter.ViewHolder org.ucdetector.analyzeMarkerVisibilityPrivate

可以看到,檢測結(jié)果中包含很多信息,如某個(gè)類沒被用到,某個(gè)方法的可見性太大等,同樣的,現(xiàn)在只處理沒用到的類文件,其他不管了。

String reportPath = "**/ucdetector_reports/UCDetectorReport_001.txt";
BufferedReader reader = new BufferedReader(new FileReader(reportPath));
String line;
int count = 0;
while((line = reader.readLine()) != null) {
 if (line.contains("Class") && line.contains("has 0 references") && !line.contains("Method")[ && other conditions]) {
  count++;
  int end = line.indexOf(".<init>");
  if (end != -1){
   String className = line.substring(0, end);
   System.out.println(className);
  }
 }
}

通過以上代碼基本上就能找到?jīng)]用到的類了,還是建議不直接刪除而是把結(jié)果輸出出來,因?yàn)榻Y(jié)果輸出來以后你會發(fā)現(xiàn)很多文件你是不想刪除的,如:

com.nostra13.universalimageloader.core.assist.DiscCacheUtil.(DiscCacheUtil.java:31) 
Class "DiscCacheUtil" has 0 references DiscCacheUtil org.ucdetector.analyzeMarkerReference
 Sergey Tarasevich (nostra13[at]gmail[dot]com)

某些類庫中的文件也可能會被檢測出來,對于這種直接在if條件中過濾掉就好了,也可能自己的一些文件暫時(shí)沒用到但不想刪除,從結(jié)果中過濾就好了。

總結(jié)

清理資源就兩個(gè)步驟:

  1. 找到未用到的資源
  2. 按需清理這些資源

通過UCDetector和lint基本上就可以檢測到項(xiàng)目中UnusedResource相關(guān)的問題了,一般像方法可見性,某個(gè)方法沒用到這種問題,不處理也罷,改到相應(yīng)的文件時(shí)手工處理算了,主要處理的就是某些文件或類沒被用到,有檢測報(bào)告,分析下報(bào)告就行了。這種報(bào)告一般是每行報(bào)告一個(gè)問題并且每行的文字是有規(guī)律的(工具生成的肯定有規(guī)律),按規(guī)律過濾出我們需要的信息就行了

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android開發(fā)中比較耗時(shí)的一些操作小結(jié)

    Android開發(fā)中比較耗時(shí)的一些操作小結(jié)

    這篇文章主要介紹了Android開發(fā)中比較耗時(shí)的一些操作小結(jié),本文根據(jù)實(shí)際開發(fā)經(jīng)驗(yàn)總結(jié)了6條比較耗時(shí)的編程操作,請大家注意下,需要的朋友可以參考下
    2015-06-06
  • Android MQTT與WebSocket協(xié)議詳細(xì)講解

    Android MQTT與WebSocket協(xié)議詳細(xì)講解

    MQTT(消息隊(duì)列遙測傳輸)是ISO 標(biāo)準(zhǔn)(ISO/IEC PRF 20922)下基于發(fā)布/訂閱范式的消息協(xié)議。它工作在TCP/IP協(xié)議族上,是為硬件性能低下的遠(yuǎn)程設(shè)備以及網(wǎng)絡(luò)狀況糟糕的情況下而設(shè)計(jì)的發(fā)布/訂閱型消息協(xié)議
    2022-11-11
  • android判斷軟件是否第一次運(yùn)行的方法

    android判斷軟件是否第一次運(yùn)行的方法

    這篇文章主要介紹了android判斷軟件是否第一次運(yùn)行的方法,涉及針對Android中isFirstRun屬性的判斷,需要的朋友可以參考下
    2015-04-04
  • Android ViewPager小圓點(diǎn)指示器

    Android ViewPager小圓點(diǎn)指示器

    這篇文章主要為大家詳細(xì)介紹了Android ViewPager小圓點(diǎn)指示器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android實(shí)現(xiàn)加載等待展示

    Android實(shí)現(xiàn)加載等待展示

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)加載等待展示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Android TelephonyManager詳解及實(shí)現(xiàn)代碼

    Android TelephonyManager詳解及實(shí)現(xiàn)代碼

    本文主要介紹Android TelephonyManager, 這里整理了關(guān)于Android TelephoneManager的相關(guān)資料,并附有示例代碼和實(shí)現(xiàn)效果圖,有需要的朋友可以參考下
    2016-08-08
  • android壓力測試命令monkey詳解

    android壓力測試命令monkey詳解

    這篇文章主要介紹了android monkey命令詳解,Monkey 就是SDK中附帶的一個(gè)工具,該工具主要用于進(jìn)行壓力測試,需要的朋友可以參考下
    2014-03-03
  • Android內(nèi)部存儲與外部存儲的示例講解

    Android內(nèi)部存儲與外部存儲的示例講解

    內(nèi)部存儲和外部存儲的概念隨著Android版本的更新也在發(fā)生不斷的變化。最早的內(nèi)部存儲指的是系統(tǒng)自帶的ROM存儲,外部存儲指的是外置的Sdcard或者通過OTG掛在的USB存儲
    2023-03-03
  • MacBook M1 Flutter環(huán)境搭建的實(shí)現(xiàn)步驟

    MacBook M1 Flutter環(huán)境搭建的實(shí)現(xiàn)步驟

    本文主要介紹了MacBook M1 Flutter環(huán)境搭建,F(xiàn)lutter官方和各項(xiàng)配套的軟件環(huán)境也還沒有成熟,導(dǎo)致搭建環(huán)境時(shí)碰到了不少坑,本文就詳細(xì)的介紹一下
    2021-08-08
  • Android使用Opengl錄像時(shí)添加水印

    Android使用Opengl錄像時(shí)添加水印

    這篇文章主要為大家詳細(xì)介紹了Android使用Opengl錄像時(shí)添加水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論