摘要:及時(shí)的清理掉不用的圖片資源很有必要,在項(xiàng)目中使用可以輕松的完成這個(gè)任務(wù),而在上沒(méi)有找到比較好的清理無(wú)用圖片的工具。參考網(wǎng)上的例子,寫(xiě)了一個(gè)清除項(xiàng)目中無(wú)用的圖片資源的腳本。
項(xiàng)目經(jīng)過(guò)需求的變更,產(chǎn)品迭代,再多次的改版之后,有些不再使用的圖片不一定能夠及時(shí)的清理掉,這些無(wú)用的圖片一方面讓項(xiàng)目圖片資源的結(jié)構(gòu)更加的復(fù)雜,另一方面會(huì)導(dǎo)致ipa包的體積變大。
及時(shí)的清理掉不用的圖片資源很有必要,在A(yíng)ndroid項(xiàng)目中使用Lint可以輕松的完成這個(gè)任務(wù),而在ios上沒(méi)有找到比較好的清理無(wú)用圖片的工具。
參考網(wǎng)上的例子,寫(xiě)了一個(gè)python清除ios項(xiàng)目中無(wú)用的圖片資源的腳本。首先介紹下ios中使用圖像資源的方式。
ios中使用 Images Assets管理圖片,項(xiàng)目的圖片資源一般都放在這Image Assets里面,圖片會(huì)放到*.imageset目錄里,對(duì)應(yīng)的有1x,2x和3x的圖,還有一個(gè)Contents.json的描述文件。 清除圖片資源需要把*.imageset清除掉,包括圖片文件和json文件。 想要清除掉不用的圖片資源,就需要知道圖片資源怎么被引用的,再查找到未被引用的圖片資源就可以清除掉了。
在ios代碼中調(diào)用圖片的方法一般是:
[UIImage imageNamed:@"image"]
在xib中調(diào)用圖片的方法是用xml的方式描述,圖片資源作為image的名稱(chēng):
因此清理的思路就是搜索項(xiàng)目中的圖片文件,如果找到對(duì)于的"name"在xib或者ios代碼中存在,說(shuō)明該圖片被使用了,不然的話(huà)該圖片即可被清理掉。
先看看如何方便的搜索圖片文件有沒(méi)有被使用吧!
搜索文件的方式可以使用grep,ack都是不錯(cuò)的工具,但是有一種更快,更好的搜索文件內(nèi)容的方式:The Silver Searcher,The Silver Searcher使用起來(lái)更方便,更快,更簡(jiǎn)單,項(xiàng)目地址:https://github.com/ggreer/the_silver_searcher。 直接安裝The Silver Searcher的命令:
brew install the_silver_searcher
使用ag命令就可以進(jìn)行文本搜索:
ag "image" "./"
這個(gè)命令的意思是搜索到該目錄下以及其子目錄下的所有含有"image"的文件。
使用這個(gè)命令就需要在python中執(zhí)行bash命令。
使用bash命令來(lái)進(jìn)行一些搜索文本,刪除文件的工作,在python中可以直接運(yùn)行bash命令。 在python中直接使用bash命令:
os.popen("echo $PATH")
在執(zhí)行bash命令的時(shí)候,可以通過(guò)os.popen("echo $PATH").read()執(zhí)行并讀取執(zhí)行的結(jié)果。 也可以直接執(zhí)行bash命令不用關(guān)系執(zhí)行的結(jié)果,例如:
os.system("rm -rf dir")
需要用到的bash命令有ag "image" "./"和rm -rf "./",前者用來(lái)搜索文本有沒(méi)有被使用,后者用來(lái)刪除文件夾。
下面就看下完整的實(shí)現(xiàn)。
完整的清理無(wú)用的圖片資源的代碼:
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!"
這段代碼是從當(dāng)前文件夾里,遍歷所有的.imageset文件,找到圖片使用的圖片名稱(chēng),在文件夾中搜索該名稱(chēng)的文件有沒(méi)有被使用。如果沒(méi)有被使用的名稱(chēng)就可以清除掉該資源。
執(zhí)行這段之后發(fā)現(xiàn)有一些不應(yīng)該清除圖片資源也被清除了,這里有個(gè)例外的情況沒(méi)有考慮到。
有時(shí)候會(huì)給一些資源文件動(dòng)態(tài)的賦值,使用這樣的代碼:
for (int i = 1; i <= 10; ++i) { NSString *imageName = [NSString stringWithFormat:@"image_%d", i]; UIImage *image = [UIImage imageNamed:imageName]; ...... }
上面的代碼中查找 image1時(shí),發(fā)現(xiàn)這個(gè)圖片并沒(méi)有使用,該圖片資源就會(huì)被清除掉,但是該圖片在項(xiàng)目中是動(dòng)態(tài)賦值的并不應(yīng)該被清除。
我采用ignore的方式來(lái)解決這個(gè)問(wèn)題,也就是先提前準(zhǔn)備好一個(gè)ignore的列表,內(nèi)容采用正則表達(dá)式來(lái)定義,被匹配到的文件資源就不進(jìn)行清除處理,例如ignores為:
ignores = {r"image*d+"}
然后在定義一個(gè)檢查ignores的方法:
def is_ignore(str): for ignore in ignores: if re.match(ignore, str): return True return False
如果一個(gè)文件名在ignores中出現(xiàn)就會(huì)忽略該文件的清理檢查,這樣就不會(huì)清理掉一些動(dòng)態(tài)賦值的圖片資源了。
源碼地址:https://github.com/jjz/script/blob/master/un_used.py
請(qǐng)自行設(shè)置好目錄,執(zhí)行命令:
python un_used.py
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37849.html
摘要:分位值解釋分位值目前是我們看性能指標(biāo)的一個(gè)重要參考點(diǎn)。為什么是,因?yàn)楦M(jìn)高的優(yōu)化經(jīng)驗(yàn),分位值的數(shù)據(jù)取點(diǎn)最能放大問(wèn)題。分位值下,一個(gè)散文件可能就是的影響。 最近接到一個(gè)任務(wù),首頁(yè)性能優(yōu)化。 目標(biāo):95分位值下 看到頁(yè)面框架主體內(nèi)容6s(優(yōu)化前10s左右),優(yōu)化提升40% 看到操作詳細(xì)內(nèi)容9s(優(yōu)化前12s左右),優(yōu)化提升25%。 側(cè)面看出我們系統(tǒng)的龐大程度吧,這個(gè)不值得驕傲,項(xiàng)目...
閱讀 1722·2021-09-22 10:02
閱讀 1943·2021-09-02 15:40
閱讀 2846·2019-08-30 15:55
閱讀 2255·2019-08-30 15:44
閱讀 3602·2019-08-30 13:18
閱讀 3232·2019-08-30 11:00
閱讀 1956·2019-08-29 16:57
閱讀 571·2019-08-29 16:41