快速清理项目中的未使用资源

项目由于初期直接把两个app的资源文件全部复制到了项目内,需要图片的时候就可以直接引用了。但是,这么做的坏处就是安装包的体积有点太大了。这两天一个想上苹果的应用商店,另外一个是准备发小程序。

用的日历插件依然是各种bug,这个放到另外一篇文章再说吧,整个插件已经改了无数的内容了。

为了精简没有使用的资源,搜索了一下貌似也没什么好办法。还是自己想办法解决吧,初步想了一下:

1.找出代码中引用的各种图片资源,通过再文件中查找的方法来处理代码,命令中的>>用于追加,如果只用>则会重新从头开始写入。

MacBook-Pro ~ % grep -r ".webp" /Users/zhongming/PycharmProjects/dayima_uniapp/pages >png.txt
MacBook-Pro ~ % grep -r ".png" /Users/zhongming/PycharmProjects/dayima_uniapp/pages >>png.txt
MacBook-Pro ~ % grep -r ".jpg" /Users/zhongming/PycharmProjects/dayima_uniapp/pages >>png.txt
MacBook-Pro ~ % grep -r ".jpeg" /Users/zhongming/PycharmProjects/dayima_uniapp/pages >>png.txt

png.txt文件内容:

/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/index.vue:						src: '/static/my/apk_emotion_2.webp'
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/index.vue:						src: '/static/my/apk_emotion_1.webp'
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/index.vue:						src: '/static/my/apk_emotion_38.webp'
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/index.vue:						src: '/static/my/apk_emotion_9.webp'
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/index.vue:						src: '/static/my/apk_emotion_28.webp'
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/login.vue:				<view @tap="navigateTo" data-type="page" data-url="/pages/page/webpage?title=隐私政策&pageUrl=http://uni.h4ck.org.cn/privacy.html" data-newstype="privacy"
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/login.vue:				<view @tap="navigateTo" data-type="page" data-url="/pages/page/webpage?title=用户协议&pageUrl=http://uni.h4ck.org.cn/aggreement.html" data-newstype="user"
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/period.vue:			<uni-list-item title="经期长度" note="您的经期持续时间" thumb="/static/my/icon_title_period.webp" thumb-size="lg"
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/period.vue:			<uni-list-item title="周期长度" note="两次月经间隔时间" thumb="/static/my/period_auto_end.webp" thumb-size="lg"
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/user.vue:								<image mode="aspectFit" class="diygw-avatar-img" src="/static/my/apk_icon_friend.webp">
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/user.vue:									src="/static/my/data_icon_zhouqi.webp"></image>
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/user.vue:									src="/static/my/apk_image_chose_bg.webp"></image>
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/user.vue:									src="/static/my/txy_ico_bmpn_heart.webp"></image>
/drives/F/uniapp_projects/uniapp-app.ma.dayi/pages/page/user.vue:					url: '/pages/page/webpage'

通过上面的文件内容,基本就能定位到所有的图片资源了。

2.有了文件,那么剩下的就是遍历目录下所有的资源,将代码中没有使用的删除掉。

import os
from pathlib import Path
import hashlib
import shutil
source_file_paths = [
    Path(r'/Users/obaby/PycharmProjects/dayima_uniapp/static/icons'),
    Path(r'/Users/obaby/PycharmProjects/dayima_uniapp/static/my'),
]
def print_hack():
    print('*' * 100)
    # f = Figlet(font='slant')
    print('Blog: http://www.h4ck.org.cn')
    print('      http://nai.dog')
    print('*' * 100)
def check_empty_by_scandir(path):
    with os.scandir(path) as it:
        return not any(it)
def clean_images_in_dir(p):
    with open(r'/Users/obaby/png.txt', 'r') as f:
        data = f.read()
    global done_paths
    print('=' * 200)
    print('[M] 开始复制目录' + p.name + ' ......')

    for img in p.glob('*.*'):
        print(img.name)
        # 处理小于100k文件
        if img.name not in data:
            try:
                img.unlink()
            except :
                pass
            print('[*]' + img.name + ' 已经删除')
    print('[*]' + p.name + ' 目录清理完成')
    print('-' * 200)

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hack()
    print('*' * 100)
    print('[S] 开始处理图片:')
    for p in source_file_paths:
        clean_images_in_dir(p)
    print('[D] 所有目录完成清理。')
    print('*' * 100)

精简之后的打包效果:

安卓版本apk文件从64m——>25m,效果还是挺明显的:

iso版本48m——>9m:

web包体积也从40m到了3m左右。效果还是挺明显的。

☆版权☆

* 网站名称:obaby@mars
* 网址:https://lang.ma/
* 个性:https://oba.by/
* 本文标题: 《快速清理项目中的未使用资源》
* 本文链接:https://nai.dog/2023/11/14030
* 短链接:https://oba.by/?p=14030
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

6 comments

    1. 公主 Queen 
      Google Chrome 116 Google Chrome 116 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      小程序的话基本是这个思路,用来减小包的体积。
      app 的话还是直接封装资源更合适,加载更快。

    1. 公主 Queen 
      Google Chrome 116 Google Chrome 116 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      妈的,目前是adhoc的分发,还没上appstore。
      现在ios上架也必须要有icp备案。
      以前上的应用可以后补,新发布的不行。

  1.   Level 5
    Firefox 119 Firefox 119 GNU/Linux GNU/Linux cn广东省珠海市 电信

    咦,我理解是用程序找出有被引用的资源,对那些没用的资源做清理,是么

    1. 公主 Queen 
      Google Chrome 116 Google Chrome 116 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      是哒,就是为了清理哪些没有用到的资源。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注