引言
既要做个HardWorker,又要做个SmarterWorker,我们在开发的时候,经常会替换图片,时间久了,不用的图片也没删,工程和编译后的apk越来越大,最近领导让把apk瘦下身,大部分人直接就先想到处理图片,因为这块是最简单,最有效的一步,开发组的同学居然想分工一个个把没用的图片挑出来,天呐,作为一个多年的老鸟,必须Python来解决啊。
思路
Pyhton真的是个写工具的神器,其实也不用会很多,会增删改查文件,就能实现很多有用的脚本,处理平时工作中的很多问题。
思路是什么呢?
RN中对于引用工程中的图片如下:
<ImageBackground
source={ require('../../img/AConfigurableLabelLayoutIMG.png')}
style={{ width: width, height: width /375 * 160, alignItems: 'center', justifyContent: 'center',}}
>
</ImageBackground>
简单点的思路就是,把pyhton脚本定位到js目录中,然后分别根据后缀名把js文件和图片文件保存到两个map中,把js中的内容读到一个大字符串变量中,然后遍历保存图片的map,找出大字符串中不存在的图片名称,意味着这些图片没有被工程引用过,就是无用的图片,然后删掉就行。
注意的问题就是:
1.要连同@2x和@3x的图片也删掉。
2.光删除js目录中的无用图片没用,因为rn打包bundle的时候,会重命名一下,复制到原生工程的drawable这些目录中,所以,在js工程中删除后,要清空下原生工程中drawable这类文件的资源,重新编译。
好啦,脚本贴出来吧。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os;
import shutil
# 一.获取当前目录
pwd = os.getcwd()
print(pwd)
# rn的app目录
appDir = pwd + "/app"
print(appDir)
# 二.查找js文件和.png文件
jsFiles = {};
pngFiles = {}
def search(root):
items = os.listdir(root)
for item in items:
path = os.path.join(root, item)
if os.path.isdir(path):
search(path)
elif path.endswith(".png"):
# print(os.path.basename(path))
pngFiles[os.path.basename(path)] = path
elif path.endswith(".js"):
os.path.basename(path)
jsFiles[os.path.basename(path)] = path
else:
os.path.basename(path)
search(appDir)
# 三.遍历保存js文件的列表,把内容读成字符串,看是否包含某个图片
def readJsFile(file):
result = ""
f = open(file)
line = f.readline()
while line:
result = result + line
line = f.readline()
f.close()
return result
# testFile=jsFiles.get("Washer.js")
# testC=readJsFile(testFile)
# print(testC)
#
# if(testC.find("ertongsuo_icon.png")>=0):
# print("no find")
allContent = ""
for jsItem in jsFiles.keys():
jsContent = readJsFile(jsFiles[jsItem])
allContent = allContent + jsContent;
# 保存城待删的图片列表
waiteDeletePngFile = {};
# 把没用的png保存到列表,同时找到@2x,@3x的同名图片
def getDifPng(pngFileName, pngPath):
waiteDeletePngFile[pngItem] = pngFiles[pngItem]
pngIndex = pngFileName.find(".png")
nameWithoutPNG = pngFileName[0:pngIndex]
# print(pngFileName,nameWithoutPNG)
parentPath = os.path.abspath(os.path.join(pngPath, "../"))
x2Path = parentPath + "/" + nameWithoutPNG + "@2x.png"
x3Path = parentPath + "/" + nameWithoutPNG + "@3x.png"
#print("x2",x2Path)
if os.path.exists(x2Path):
waiteDeletePngFile[nameWithoutPNG + "@2x.png"] = x2Path
# else:
# print("x2", x2Path)
if os.path.exists(x3Path):
waiteDeletePngFile[nameWithoutPNG + "@3x.png"] = x3Path
for pngItem in pngFiles.keys():
if (allContent.find(pngItem) < 0):
if (pngItem.find("@") < 0):
# print(pngItem, pngFiles[pngItem])
getDifPng(pngItem, pngFiles[pngItem])
#删除没用的图片
print("find no use image",len(waiteDeletePngFile))
for deletPng in waiteDeletePngFile:
print(deletPng,waiteDeletePngFile[deletPng])
os.remove(waiteDeletePngFile[deletPng])