1. 程式人生 > >清理iOS專案中不用的圖片資源方法

清理iOS專案中不用的圖片資源方法

       專案經過需求的變更,產品本身的迭代,會經過多次的改版,有一些以前的圖片不一定能及時的清理掉,這些圖片一方面讓專案圖片資源的結構更加的複雜,另一方便會直接導致上線之後的ipa包的體積大,所以需要清理不用的圖片資源,在Android專案中使用Lint可以輕鬆的完成這個任務,在iOS上沒有找到比較好的工具,因此藉助網上的例子,寫了一個python清除Xcode不用的圖片資源的指令碼。

       先簡單說下ios中使用影象資源的方式,iOS中使用 Images Assets管理圖片,圖片資源都是放在這裡面,專案中的圖片資源會放到*.xcassets目錄中,裡面對應1x,2x和3x的圖,還有一個Contents.json的描述檔案,清除圖片資源的同時需要把這個目錄也一起清除。 

       在程式碼中使用圖片的方法一般是:

[UIImage imageNamed:@"圖片"]

       在xib中呼叫圖片的方法是用xml的方式描述,圖片資源作為image的名稱:

   <imageview image="image" id="rb9-sl-eqm"></imageview image="image" id="rb9-sl-eqm">

       所以需要搜尋在專案中除了*.xcassets目錄中的所有檔案來跟該目錄中的檔案相匹配對應,如果找到對應的圖片名稱,說明該圖片是被使用的,否則該圖片沒被使用,即可被清理掉。

通過終端執行 shell 命令來執行,但是發現並不是很好用,不能完全達到想要的效果。過程中間發現有一種更快,更好的搜尋檔案內容的方式:The Silver Searcher,專案地址:https://github.com/ggreer/the_silver_searcher

      1.下載The Silver Searcher

      2.安裝The Silver Searcher,輸入命令:brew install the_silver_searcher便可以看到終端的執行過程,如果安裝成功就有成功的提示。

        3.在終端切換到你所要測試的專案路徑:cd 專案路徑

。(例子專案叫ww副本)

                                         

        4.使用ag搜尋: ag"image"。可以搜尋到該目錄下以及其子目錄下的所有包含image的檔案。agrm -rf './'表示刪除所有的檔案。

5.下載python原始碼地址:https://github.com/jjz/script/blob/master/un_used.py。這是一段執行篩選在專案中是否有使用圖片的程式碼,我在使用過程中,發現程式碼並不完整和正確,根據自己的需求進行部分修改新增後,程式碼如下:

以上的程式碼:

1-6表示一些python語句在使用時的一些引入。

8-16表示是*.xcassets目錄檔案在操作過程中的路徑變換。原因是由於在實現過程中,發現使用它原來的程式碼是目錄的圖片去匹配了整個專案(包括xcassets目錄)中的圖片,這樣就導致了看似所有的圖片都被使用,而無法實現篩選刪除的操作 所以在這個地方之所以寫了幾個路徑就是對圖片檔案進行移動,好在匹配的時候是用它與專案中的其它(不包括圖片檔案*.xcassets)全部檔案匹配,並不是隨便寫的,而是:

第二個路徑表示當前xcassets檔案的路徑;

第三個是在實現篩選刪除錢要將xcassets檔案移到的位置所在的路徑;

第五個是專案此時已經完成篩選刪除後所在路徑;

第四個完成刪除後迴歸到最初的位置所在的路徑。

18表示刪除之前路徑的移動。

21-60就是整個過程中呼叫的方法,其中find_un_used()方法查詢所有滿足正則表示式的圖片,這段程式碼從當前資料夾裡,找到所有的.imageset檔案,並只使用沒有後綴名的檔名,在資料夾中找到該名稱的檔案有沒有被使用。如果沒有被使用的就清除資源。執行這段之後發現有一些不應該清除圖片資源也被清除了,因為有一種例外的沒有考慮到。而is_ignore()則是考慮此情況的方法:

有的時候我們需要動態的給一些控制賦值會使用這樣的方式:

                                     

比如上面的程式碼中查詢 image1時,發現這個圖片並沒有使用,就會清除該圖片,但是該圖片並不應該被清除。

採用ignore的方式來解決這個問題,也就是我會提前準備好一個ignore的列表,內容採用正則表示式來定義,比如這樣:

ignores = {r'image/d+'}

然後在定義一個檢查ignore的方法:

def is_ignore(str): for ignore in ignores: if re.match(ignore, str): return True return False

如果一個檔名在ignore中就會忽略清除該檔案。

47-48表示在它執行完成後,我們可以在檔案處動態看到檔案的轉移。

6. 然後在終端輸入執行命令:python un_used.py(python檔案路徑)。執行結果如下,顯示了刪除了哪些圖片,還有哪些,我們也可進去專案圖片檔案目錄裡檢視,這樣就完成了清理iOS專案中不用的圖片資源。

 

   在專案過程中,由於百度到說在python中輸入執行命令,所以自己也有下載python軟體進行命令的執行,但是由於對軟體非常的陌生,可能在安裝環境上未能搭配成功,導致執行未能成功,不能跟自己的測試專案聯絡起來,最後選擇在終端執行python。

  題別注意的是,上面的python檔案中篩選圖片的正則我只是寫了兩種型別分別是image和group開頭的的圖片,所以根據自己需要來填寫,當然能寫一個便利所有圖片的正則最好不過了。