<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

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

      清理資源文件

      要清理沒用的資源,首要的工作當然是找到他們,我們知道Anroid SDK中有一個工具叫lint,可以幫助我們查看工程中存在的問題,其中有一項功能就是查找沒用到的資源,這樣這一步就簡單了,直接對需要清理的工程執行以下命令:

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

      執行完以上命令后工程中關于UnusedResources的問題就都保存到result.txt了,先來看一下result.txt的內容

      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值等信息。有了這些信息,接下來需要做的就是分析這些信息了,手工分析不太現實,因為這個文件可能會非常大,比如我執行上述命令后文件就有2212行,這種事情,當然是交給計算機解決了。

      仔細看生成的文本中的內容會發現結果是按行輸出的,每個問題是單獨的一行,而且每一行中的內容也很有規律

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

      所以還是可以很方便地得到哪個文件甚至哪行有問題的,我處理的時候只清理了沒用的文件,像上面的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文件的每一行,根據自己需要的條件過濾掉不需要處理的行(比如我只想清理anim、drawable及layout,所以過濾掉res/value目錄下的信息,并且忽略appcompat相關的信息),每一行":"前的字符串就是文件名,找到了文件名就好處理了,直接刪除,或者打印出來,或者寫到一個文件里以再次確認是否確認要刪除,當把結果寫到一個文件后我們就可以查看這個文件是否有現在沒用到但仍不想刪除的文件,如果有,處理方法也很簡單,去掉這一行或簡單地做個標記,如前面打#,然后再讀取這個文件把沒做標記的行對應的文件刪除就行了。

      看起來很簡單,但是有幾點需要注意:

      1. 有些layout文件,可能你之前用了他們,并在相應的Java文件中用了這個layout布局中的id,如對某些ID的控件設置了onClickListener,并在onClick的switch...case中引用了這些ID,但最后又不用這個Layout了,這時這個layout就是UnusedResource,但是以前引用它的Java代碼中對這個layout中的某些ID的引用還沒清除,此時刪掉這個Layout就會報錯,你可以選擇清理報錯的Java代碼,因為它們其實時Dead Code。或者每次清理一部分資源文件,如先清理layout,再清理drawable,對于每一項也可以根據文件名的規則每次再清理一小部分,如只清理res/layout中以item_of開頭的文件。
      2. lint的分析貌似是不完全準確的,或者說不夠智能,比如有一個drawable只被一個layout引用,而這個layout又是Unused的,lint可能不會發現這個drawable是Unused,這就需要我們多次重復執行前面的步驟,直到count為0。
      3. lint只能分析資源文件,即res目錄下的文件,如果要分析Java文件還需要其他方法,而且,有可能某個資源文件被某Java文件引用,而這個Java文件又是Unused,這樣這個資源文件就會逃過lint的檢查,所以我們最好先清理了Java文件再清理資源文件。

      清理Java文件

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

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

      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

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

      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);
              }
          }
      }
      

      通過以上代碼基本上就能找到沒用到的類了,還是建議不直接刪除而是把結果輸出出來,因為結果輸出來以后你會發現很多文件你是不想刪除的,如:

      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條件中過濾掉就好了,也可能自己的一些文件暫時沒用到但不想刪除,從結果中過濾就好了。

      總結

      清理資源就兩個步驟:

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

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

      posted @ 2014-05-13 13:54  AngelDevil  閱讀(21371)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品国产综合久久一线| 麻豆精产国品一二三区区| 国产精品一区二区三区日韩| 国产最大的福利精品自拍| 高中女无套中出17p| 亚洲成人网在线观看| 综合无码一区二区三区| 内射极品少妇xxxxxhd| 51午夜精品免费视频| 枞阳县| 视频一区视频二区视频三区| 国产高清自产拍av在线| 97人人超碰国产精品最新| 欧美黑人巨大videos精品| 彭山县| 樱花草视频www日本韩国| 亚洲熟妇少妇任你躁在线观看无码| 亚洲性线免费观看视频成熟| 狠狠色噜噜狼狼狼色综合久| 国产老头多毛Gay老年男| 国产在线国偷精品产拍| 翁源县| 中文 在线 日韩 亚洲 欧美| 蜜臀午夜一区二区在线播放| 久草网视频在线观看| 国产精品色三级在线观看| 天堂一区人妻无码| 亚洲av永久一区二区| 中国熟女仑乱hd| 99在线精品国自产拍中文字幕| 疯狂做受xxxx高潮视频免费| 亚洲韩国精品无码一区二区三区 | 十八禁国产一区二区三区| 丰满人妻熟妇乱又伦精品软件 | 国内精品久久人妻无码不卡| 精品国产AV无码一区二区三区| 一本加勒比hezyo无码专区| 亚洲无av在线中文字幕| 国产成人a∨激情视频厨房| 在线免费播放av日韩| 久久精品夜夜夜夜夜久久|