摘要:及時的清理掉不用的圖片資源很有必要,在項目中使用可以輕松的完成這個任務,而在上沒有找到比較好的清理無用圖片的工具。參考網上的例子,寫了一個清除項目中無用的圖片資源的腳本。
項目經過需求的變更,產品迭代,再多次的改版之后,有些不再使用的圖片不一定能夠及時的清理掉,這些無用的圖片一方面讓項目圖片資源的結構更加的復雜,另一方面會導致ipa包的體積變大。
及時的清理掉不用的圖片資源很有必要,在Android項目中使用Lint可以輕松的完成這個任務,而在ios上沒有找到比較好的清理無用圖片的工具。
參考網上的例子,寫了一個python清除ios項目中無用的圖片資源的腳本。首先介紹下ios中使用圖像資源的方式。
ios中使用 Images Assets管理圖片,項目的圖片資源一般都放在這Image Assets里面,圖片會放到*.imageset目錄里,對應的有1x,2x和3x的圖,還有一個Contents.json的描述文件。 清除圖片資源需要把*.imageset清除掉,包括圖片文件和json文件。 想要清除掉不用的圖片資源,就需要知道圖片資源怎么被引用的,再查找到未被引用的圖片資源就可以清除掉了。
在ios代碼中調用圖片的方法一般是:
[UIImage imageNamed:@"image"]
在xib中調用圖片的方法是用xml的方式描述,圖片資源作為image的名稱:
因此清理的思路就是搜索項目中的圖片文件,如果找到對于的"name"在xib或者ios代碼中存在,說明該圖片被使用了,不然的話該圖片即可被清理掉。
先看看如何方便的搜索圖片文件有沒有被使用吧!
搜索文件的方式可以使用grep,ack都是不錯的工具,但是有一種更快,更好的搜索文件內容的方式:The Silver Searcher,The Silver Searcher使用起來更方便,更快,更簡單,項目地址:https://github.com/ggreer/the_silver_searcher。 直接安裝The Silver Searcher的命令:
brew install the_silver_searcher
使用ag命令就可以進行文本搜索:
ag "image" "./"
這個命令的意思是搜索到該目錄下以及其子目錄下的所有含有"image"的文件。
使用這個命令就需要在python中執行bash命令。
使用bash命令來進行一些搜索文本,刪除文件的工作,在python中可以直接運行bash命令。 在python中直接使用bash命令:
os.popen("echo $PATH")
在執行bash命令的時候,可以通過os.popen("echo $PATH").read()執行并讀取執行的結果。 也可以直接執行bash命令不用關系執行的結果,例如:
os.system("rm -rf dir")
需要用到的bash命令有ag "image" "./"和rm -rf "./",前者用來搜索文本有沒有被使用,后者用來刪除文件夾。
下面就看下完整的實現。
完整的清理無用的圖片資源的代碼:
path = "ios" images = glob.glob("ios/images.xcassets/*/*.imageset") def find_un_used(): img_names = [os.path.basename(pic)[:-9] for pic in images] unused_imgs = [] for i in range(0, len(images)): pic_name = img_names[i] command = "ag "%s" %s" % (pic_name, path) result = os.popen(command).read() if result == "": unused_imgs.append(images[i]) print "remove %s" % (images[i]) os.system("rm -rf %s" % (images[i])) text_path = "unused.txt" tex = " ".join(sorted(unused_imgs)) os.system("echo "%s" > %s" % (tex, text_path)) print "unuse res:%d" % (len(unused_imgs)) print "Done!"
這段代碼是從當前文件夾里,遍歷所有的.imageset文件,找到圖片使用的圖片名稱,在文件夾中搜索該名稱的文件有沒有被使用。如果沒有被使用的名稱就可以清除掉該資源。
執行這段之后發現有一些不應該清除圖片資源也被清除了,這里有個例外的情況沒有考慮到。
有時候會給一些資源文件動態的賦值,使用這樣的代碼:
for (int i = 1; i <= 10; ++i) { NSString *imageName = [NSString stringWithFormat:@"image_%d", i]; UIImage *image = [UIImage imageNamed:imageName]; ...... }
上面的代碼中查找 image1時,發現這個圖片并沒有使用,該圖片資源就會被清除掉,但是該圖片在項目中是動態賦值的并不應該被清除。
我采用ignore的方式來解決這個問題,也就是先提前準備好一個ignore的列表,內容采用正則表達式來定義,被匹配到的文件資源就不進行清除處理,例如ignores為:
ignores = {r"image*d+"}
然后在定義一個檢查ignores的方法:
def is_ignore(str): for ignore in ignores: if re.match(ignore, str): return True return False
如果一個文件名在ignores中出現就會忽略該文件的清理檢查,這樣就不會清理掉一些動態賦值的圖片資源了。
源碼地址:https://github.com/jjz/script/blob/master/un_used.py
請自行設置好目錄,執行命令:
python un_used.py
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37849.html
摘要:分位值解釋分位值目前是我們看性能指標的一個重要參考點。為什么是,因為跟進高的優化經驗,分位值的數據取點最能放大問題。分位值下,一個散文件可能就是的影響。 最近接到一個任務,首頁性能優化。 目標:95分位值下 看到頁面框架主體內容6s(優化前10s左右),優化提升40% 看到操作詳細內容9s(優化前12s左右),優化提升25%。 側面看出我們系統的龐大程度吧,這個不值得驕傲,項目...
閱讀 1686·2021-09-22 10:02
閱讀 1931·2021-09-02 15:40
閱讀 2835·2019-08-30 15:55
閱讀 2243·2019-08-30 15:44
閱讀 3593·2019-08-30 13:18
閱讀 3224·2019-08-30 11:00
閱讀 1945·2019-08-29 16:57
閱讀 564·2019-08-29 16:41