1. 程式人生 > >清理Android中無用的drawable資源和values資源

清理Android中無用的drawable資源和values資源

對於Android專案來說,專案需求改的多了、UI變化多了可能會導致很多無用的圖片資源或者values資源,這些無用的資源導致最終的apk檔案增大。腫麼辦?當然是刪除了。。。怎麼刪除?難道一個一個尋找沒用的資源,然後刪除麼?NONONO,作為一名偉大的(苦逼的)程式猿怎麼能夠在這種小事上浪費時間。。。當然要寫程式碼自動化處理這種事情了。

本人也是非計算機專業,搞這個問題的時候也參考了一些網上的方法,總結了一個個人認為比較靠譜的方法,效率不是最高的但是思路絕對是很清晰,適合想自己DIY的童鞋參考,下面我就介紹一下思路。

      1.首先是如何分析哪些資源沒用,這個當然不是一個一個去手工搜尋,Android SDK自帶了一個分析工具,在sdk目錄tools\lint.bat,執行這個命令就可以得到你想要的結果——哪些資源是沒用的。在cmd窗口裡輸入命令“lint --check UnusedResources 路徑 > result.txt” 就會在當前cmd命令的路徑下輸出一個名為result.txt的檔案,分析的結果就在這個檔案中。sdk的環境變數要配置好,沒有配置的話就要輸入lint的全路徑,比如:D:\sdk\tools\lint。我們來看一下分析的部分結果:

結果總共可分為三類,1.drawable資源,2.layout資源,3.values資源。如下面的圖所示:

drawable資源

values資源

layout資源

       ①首先分析drawable資源和layout資源,它們的輸出格式為:資源相對路徑 + : + 廢話。我們可以按行讀取,以:分割,取出檔案路徑,然後刪除檔案,程式碼寫法是:

程式碼中的註釋還是挺清楚的,顯示將cmd用java執行cmd命令,得到輸入流,逐行讀取,按照上面的分析取出檔名,拼出檔案路徑後用檔案路徑生成File,執行file的delete方法刪除檔案。

對於values就有點麻煩了,分析結果是告訴你哪個資原始檔中的第幾行

無用。我的想法是:先將檔案路徑和行數截取出來,然後逐行讀取目標檔案A並寫入一個臨時檔案B,A檔案與B檔案在同一個目錄,遇到目標行數則直節寫入換行符或者跳過,寫入換行符是為了A檔案和B檔案總行數一致,方便對比。A檔案讀取完畢以後B檔案中是將無用資源刪掉後的最終檔案,將A檔案刪除,B檔案重新命名為A即可。下面是程式碼:

以上就是我的思路,自己測試過了,沒有什麼問題,需要多執行幾遍才能將無用資源刪除徹底。

問題分析:目的雖然達到了,但是對於values資源的清理明顯不是效率最高的。因為lint工具分析的結果輸出並沒有什麼規律可言,一段drawable的,一段values的,一段layout的,並且values中同一個檔案中並不是直接將所有無用資源一次性列出來,比如a.xml中第2行和第5行有兩個無用的字串,會分別給出res\values\a.xml:2和res\values\a.xml:5,按照我的處理方法會反覆的對a.xml進行“讀、寫臨時檔案、刪除原檔案、重新命名臨時檔案”這個步驟。其實可以對輸出的結果進行預處理一下,將values相關的內容分離出來,按照檔名進行整理,同一個檔案的無用資源行數整合到一起,直接一次性修改完畢。

其實這個問題也不是什麼大問題,對於一個android專案來說,刪除無用資源的時候多讀寫幾遍也無所謂。假如你有程式碼潔癖的話,可以將優化後的程式碼貼在留言區大家一起參考 =。=

童鞋們有什麼好的想法可以留言大家一起參考大笑

程式碼:https://github.com/dreamlizhengwei/AndroidCleanDrawableAndValues

相關推薦

清理Android無用drawable資源values資源

對於Android專案來說,專案需求改的多了、UI變化多了可能會導致很多無用的圖片資源或者values資源,這些無用的資源導致最終的apk檔案增大。腫麼辦?當然是刪除了。。。怎麼刪除?難道一個一個尋找

Androidres/drawable(mipmap)/xxxx.png的Uriurl的轉換

  宣告:下列方法已經經過驗證,可用 Uri------>url. /** * res/drawable(mipmap)/xxx.png::::uri---->url * * @return */ private

如何有效的清除Android無用資源(靜態程式碼分析)

最近公司要做這個,簡單調研了一下,現有的大多數部落格也比較舊了,不太合適,總結了這麼幾個方式吧,一起來學習下。 為什麼要清除Android中這些資源呢 是這樣的,今天收到的郵件裡,有這麼一條任務: 資源優化 軟體中無用的圖片和佈局檔案,找到並驗證是否無用. 這個需要設計一套工具進行分析(自

多方法批量刪除Android無用資源(更新Android Studio2.1工具)

一個app開發久了,專案中難免會有越來越多沒有被呼叫到卻沒有被及時刪除的資原始檔, 尤其是體積較大的圖片檔案,於是我們會發現我們的app包越來越大,越來越臃腫。於是,定期的檢測我們工程中哪些資源已經被廢棄,是十分必要的。要做這麼一個工作,分為兩步,一步是查詢到這

AndroidDrawable資源—— ClipDrawable

ClipDrawable是通過設定一個Drawable的當前顯示比例來裁剪出另一張Drawable,你可以通過調節這個比例來控制裁剪的寬高,以及裁剪內容佔整個容器的權重,通過ClipDrawable的setLevel()方法調節顯示比例可以實現類似Progres

AndroidDrawable資源—— VectorDrawable

在android5.0(API Level 21)中使用向量圖:vector drawable,vector drawable的特點是它不會因為影象的縮放而失真。為了相容android 5.0以前的版本,Google推出了Android Support Libr

wpf靜態資源動態資源的區別

一次 div font size res static 靜態 mil source 靜態資源(StaticResource)指的是在程序載入內存時對資源的一次性使用,之後就不再訪問這個資源了。 動態資源(DynamicResource)指的是在程序運行過程中然會去訪問資源。

AndroidDrawable基礎菠菜bc平臺搭建架設與自定義Drawable

eat 動效 之間 搭建 androi enc view tint 1.0 1、Drawable是什麽? 一種可以在Canvas上進行繪制的抽象的概念顏色、圖片等都可以是一個DrawableDrawable可以通過XML定義,或者通過代碼創建Android中Drawable

Android sharedpreference的commitapply的區別

        今天在提交程式碼的時候,提示有warning,以前都是看都不看,直接跳過的,今天心血來潮,開啟看了一下,也發現了一些自己在編碼過程中不規範的地方,然後,就看到了這邊文章的重點,關於sharedpreference的

Android實現短音訊震動的一些總結

好長時間沒有寫部落格了,因為最近事情比較多。所以好長時間沒有寫部落格了。堅持是一件很辛苦的事情。但還需要努力。。。好了,閒話不扯了。因為最近專案中用到了相應的短音訊和震動的功能,所以這裡總結一下相應的內容! 本文知識點: 音訊中的一些知識和常用的API介紹;

android 漸變的實現SweepGradient 圓形漸變重點注意

Android 的自定義View神通廣大,可以實現各種複雜的樣式,漸變圓弧就是其中的一種。 1 shape 實現漸變 這個比較簡單就是定義一個漸變的shape。 <?xml version="1.0" encoding="utf-8"?> <shape xm

Android具有動畫效果的圖片資源

在一些場景下,圖片需要具有動畫效果。當你想顯示一個由多張圖片組成的loading動畫,或者一個圖示切換過程,就需要到具有動畫效果的圖片了。Android提供了幾種方式實現動畫圖片。 下面的是個示例: 第一種方式是使用Animation Drawable,這是通過建立多張靜態

androidSELINUX規則分析語法簡介

目錄: SELINUX簡介 檢視SELINUX許可權 1. 檢視程序許可權 2. 檢視檔案許可權 如何配置selinux 1.基本語法 A. 上下文描述檔案 B. 策略檔案te

Android搜索圖示文字居中的EditText

import android.widget.EditText; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; im

AndroidRelativeLayout各個屬性自帶樣式 theme

Android中RelativeLayout各個屬性 android:layout_above="@id/xxx"  --將控制元件置於給定ID控制元件之上 android:layout_below="@id/xxx"  --將控制元件置於給定ID控制元件之下

AndroidShape Drawable在xml的使用

關於Shape使用的官方文件: Android中常常使用shape來定義控制元件的一些顯示屬性,下面是Shape中的所有屬性及一個簡單的示例: [html] view plain copy  print? <?xmlversion="1.0"encoding="utf-8"?>

[Unity3D]清理material無用的的property

摘要 unity3d中的material再更換數次shader後,property的資訊會殘留,這會導致material select depedency的時候,發現其引用了根本沒用到的texture(原因是曾經用過的shader中的property沒有被去掉

android的MVC,MVPMVVM模式簡單總結

1.MVC View:對應於xml佈局檔案Model:實體模型Controllor:對應於Activity業務邏輯,資料處理和UI處理 xml的view功能太過於弱化,導致actvity裡面即處理業務

Android的抽象類介面實踐

1.關於抽象類 說到抽象類,那必定要提到抽象方法,抽象方法是指在類中沒有方法體的方法,而抽象類中的抽象方法必須被子類實現。含有抽象方法的類就叫抽象類,那如果一個抽象類不含有抽象方法可以嗎?答案是可以,但是這就失去了抽象類本身的用處和意義了,因為抽象方法就是為了

Android 獲取簽名md5 sha1

Win+R開啟執行視窗輸入cmd回車 然後輸入: keytool -v -list -keystore C:\Users\AAAA\Desktop\keystore.jks -alias nam