实现iOS图片等资源文件的热更新化(一): 从Images.xcassets导出合适的图片
本文会基于一个已有的脚本工具自动导出所有的图片;最终给出的是一个从 Images.xcassets 到基于文件夹的精简 合适 的图片资源集的完整过程.难点在于从完整图片集到精简图片集,肯定是基于一个定制化的脚本,自定义导出的.如果自己手动导出?那可有的忙喽~
Images.xcassets 与 Assets.car
Images.xcassets,是Xcode项目中的,用于存放资源文件.那么我们为什么不直接处理 Images.xcassets 呢?因为Images.xcassets中存放的图片名称可能与图片的资源名称不一致,最终决定图片资源名的是资源文件夹的名称;也有可能Images.xcassets存放的是pdf格式的图片,这样可以自动预编译对应尺寸的图片资源.
Images.xcassets 编译后,最终ipa包中,是以Assets.car包的形式出现的,内部是处理后的图片名.此处的文件名与我们代码中引用的图片资源名称是一致的.
也就是说: 直接基于Assets.car进行处理,可以使我们的使用图片处的代码变更尽可能少.
使用 cartool 从 Assets.car 导出图片
Assets.car 无法直接zip解压,需要借助专门的工具,此处推荐: cartool 使用方法,参见: iOS学习之解压Assets.car
如果你缺少足够复杂的Assets.car或者cartool用法有问题,可以直接使用我处理过的资源:https://github.com/ios122/ios_assets_hot_update/tree/master/res
针对文章github给定的目录, cartool的用法,可以简述为:
cd 到 res目录,然后
mkdir Assets
./cartool ./Assets.car ./Assets
其实使用一张图片就可以额兼容iPhone/iPad
从 Assets.car 导出后的图片,大致有以下几种:
- 只存在@1x的图: 如 2.png
- 只存在@1x和@2x的图: 如 account.png 和 account@2x.png
- 只存在@2x的图: 如add-1@2x.png
- 只存在@2x与@3x的图片: 如 10@2x.png 和 10@3x.png
- 同时存在三种尺寸的图片: 如 1.png 1@2x.png 和 1@3x.png
- 区分iphone与ipad的图片,此类图一般由pdf自动在预编译时生成: 如bg_mypage_edit~ipad.png bg_mypage_edit~ipad@2x.png bg_mypage_edit~ipad@3x.png bg_mypage_edit~iphone.png bg_mypage_edit~iphone@2x.png bg_mypage_edit~iphone@3x.png
- 汉语命名的图片: 如 提醒.png
以上图片的原因,很大一部分是由于App迭代引起的.对于一个图片,存在上述不同情况时,图片通常加载与当前屏幕比例(scale)最符合的图片,具体细节下一篇文章会更完整描述.
经过我自己的实验与网上各种资料的查询,使用 @3x 的图片是可以同时作为 iPhone和iPad的通用图标的.当然,这是需要自定义 imageNamed方法,也是下一篇文章的重点. 2套共5个图片,现在只需要1个图片,理论图片资源体积可以减小
((1 + 2 + 3 + 3 + 1.5) - 3) / (1 + 2 + 3 + 3 + 1.5) = 71.428571 % (信息量超大的速算法,看不懂就当是个冷笑话吧(≧▽≦)/)
自动归类脚本思路
我们想要获取的是 可用的@3x图片文件夹 与 不包含@3x图片的有问题的资源列表. 对于不存在@3x副本的图片,很大可能这个资源已经被废弃了.这一块,暂定手动去排查与核实.如果一个图片仍在使用但是不存在@3x的副本,绝对是RD挖了一个坑,等你来填!
基本思路是:
- 去除 ~ipad 结尾的图片,如bg_mypage_edit~ipad.png;
- 去除 ~iphone 图片中的 iphone文字,如bg_mypage_editiphone@3x.png 重命名为 bg_mypage_edit@3x.png;
- 将含有@3x的图片组的@1x @2x @3x 的图片按顺序移动到单独文件夹 如 assets_3x,并都命名为@3x,此时原文件夹中即为有问题的资源,新文件夹中为有效的资源文件,且只保留了@3x;
- 将原资源文件夹命名为assets_error,以供以后使用;
- 人工确认非法图片是否具有存在意义,存在则寻找其@3x副本放到 assets_3x 文件夹;
自动归类脚本实现
除了以上的第五步以外,前四步都可以自动化运行:
#0. 需要先cd到解压后的Assets目录;
#1. 去除 ~ipad 结尾的图片,如bg_mypage_edit~ipad.png;
find . -iname "*~ipad*.png" -delete
#2. 去除 ~iphone 图片中的 ~iphone文字;
find . -name "*~iphone.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone.png}.png"; done' sh {} +
find . -name "*~iphone@2x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@2x.png}@2x.png"; done' sh {} +
find . -name "*~iphone@3x.png" -exec sh -c 'for i do mv -- "$i" "${i%~iphone@3x.png}@3x.png"; done' sh {} +
# 3.将含有@3x的图片组的@1x @2x @3x 的图片按顺序移动到单独文件夹 如 assets_3x,并都命名为@3x,此时原文件夹中即为有问题的资源,新文件夹中为有效的资源文件,且只保留了@3x;
mkdir ../assets_3x
find . -name "*@3x.png" -exec sh -c 'for i do mv -- "${i%@3x.png}.png" "../assets_3x/${i%@3x.png}@3x.png"; mv -- "${i%@3x.png}@2x.png" "../assets_3x/${i%@3x.png}@3x.png";mv -- "${i%@3x.png}@3x.png" "../assets_3x/${i%@3x.png}@3x.png";done' sh {} +
# 4.将原资源文件夹命名为assets_error,以供以后使用;
cd ..
mv Assets assets_error
最终得到的 assets_3x 即为可用资源,assets_error 即为需要手动确认可用性的资源.
收获与感悟:
- 项目中,图片这一块,的确有许多无用的或不合理的资源,需要及早解决;
- shell 脚本是基于路径进行复制,移动等操作的,如 find的结果,其实是一个文件路径,借助它,提出了一个简单的区分可用于不可用资源的方法;
- 写博客,确实可以使思路更清晰有序,坦白讲,这本来是一个我不敢碰的优化任务,一个一个比对,想想都头大.最终的处理结果,还是给出了一定数量的无用图片,但是我根据其名字就可以确定其位置,非常好处理了,已经省了不少功夫了;而且,要比我手动排查地可信多了.
系列专属github地址: https://github.com/ios122/ios_assets_hot_update
实现iOS图片等资源文件的热更新化(一): 从Images.xcassets导出合适的图片的更多相关文章
- 实现iOS图片等资源文件的热更新化(零): 序
必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...
- 实现iOS图片等资源文件的热更新化(二):自定义的动态 imageNamed
这篇文章,要解决的是,使用一个自定义的 imageNamed 函数来替代系统的 imageNamed 函数.内部逻辑,将贯穿对比论证 关于"合适"的图片的定义.对iOS加载图片的规 ...
- 实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
简介 以前写过一个补丁更新的文章,此处会做一个更精简的最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCocoa的依赖.原来的文章,可以先看这里: htt ...
- winform代码反编译后图片等资源文件恢复解决方案
用Reflector工具反编译的winform代码,图片等资源文件不能很好的反编译成功. 这里有一个笨的解决方案.首先我们要了解图片资源当初加入到工程的几种方式,及他们所在的位置. 一般winform ...
- IntelliJ IDEA - 热部署插件JRebel ,对静态资源文件进行热部署?javascript、css、vm文件
IntelliJ IDEA - 热部署插件JRebel ,对静态资源文件进行热部署?javascript.css.vm文件https://blog.csdn.net/feng_pump/article ...
- iOS - 集成Bundle资源文件包
1.Bundle 文件 Bundle 文件,简单理解,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是 ...
- iOS开发那些事-iOS应用本地化-资源文件本地化
资源文件包括:图片文件.音频文件以及前文提到的Localizable.strings等文件,它们的特点是都是随着应用一起打包发布.但就本地化而言无论是图片文件还是音频文件都必须实现的步骤都是类似的,因 ...
随机推荐
- Android(5)— Mono For Android 两个功能型外包
0.前言 距上一篇博文貌似很久了,其中原因种种,归根结底是自己没有坚持好,没有静下心来归纳总结,希望从这一刻起每个月坚持写两篇.(哈哈,突然想起老师说起一句话, 晚上在被窝里悄悄发誓好好学习,第二天涛 ...
- 解如下方程(java实现)
n (m=1) f(m,n)= m (n=1) f(m-1,n)+f(m,n-1) ...
- Sizeof的计算看内存分配
本文记录了有关sizeof的一些计算,主要有下面的四种情况:(如有错误,敬请留言) 使用sizeof()计算普通变量所占用的内存空间 sizeof计算类对象所占用空间的大小-用到了字节对齐 sixeo ...
- import com.sun.image.codec.jpeg.JPEGCodec不通过 找不到包(转载)
http://www.xuebuyuan.com/2008608.html 在Eclipse中处理图片,需要引入两个包:import com.sun.image.codec.jpeg.JPEGCode ...
- web系统架构设计中需要知道的点(前端篇)
上周没写东西,这周写点互联网系统开发中需要了解的技术点,每个点都可以发散出去,连接更多的知识点,打算做个逐步细化的记录. 一个应用的整个生命周期中(生,老,病,死)都需要有一个整体规划. 前期 评估需 ...
- 中小公司PMO不一样期间的责任
中小公司,又称中小型公司或中小企,它是与所在行业的大公司对比在人员规划.财物规划与运营规划上都对比小的经济单位.此类公司一般可由单自个或少数人供给资金构成,其招聘人数与营业额皆不大,因此在运营上多半是 ...
- NodeJS系列~第四个小例子,NodeJs处理Get请求和Post请求
返回目录 说在前 对于HTTP请求来说,我们通常使用的是Get和Post,除此之外还有put,delete等,而对于get来说,比较lightweight,只是对字符串的传输,它会被添加到URL地址里 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- iOS---类方法(静态方法)和实例方法
类方法 实例方法是以+开头的方法, 实例方法是用实例对象访问: 类方法的对象是类而不是实例,通常用来创建对象或者工具类. 在实例方法里,根据继承原理发送消息给self和super其实都 ...
- 每天一个linux命令(11):nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...