项目由于初期直接把两个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左右。效果还是挺明显的。
6 comments
把资源都使用外链,更省
小程序的话基本是这个思路,用来减小包的体积。
app 的话还是直接封装资源更合适,加载更快。
ios搞定了?没看到链接啊
妈的,目前是adhoc的分发,还没上appstore。
现在ios上架也必须要有icp备案。
以前上的应用可以后补,新发布的不行。
咦,我理解是用程序找出有被引用的资源,对那些没用的资源做清理,是么
是哒,就是为了清理哪些没有用到的资源。