App竞品技术分析 (3)减小安装包的体积
1 从几件小事说起
由此而得到一个结论,App安装包的体积一定要小,至少要比竞争对手的App体积小。
尽管如此,以上种种措施只能解决升级用户的流量困扰,对新用户并无帮助。我们必须减小安装包的大小,才能吸引更多的新用户。
2 安装包为什么那么大
在众多App之中,我印象最深的是一款旅游类软件,它的所有图片都不超过100KB,甚至说50KB以上的都屈指可数。这是把极致做到家的表现。
3 png和jpg的区别和使用场景
设计师曾经问过我,App为什么不使用jpg图片,因为同样的尺寸,png格式的图片要比jpg图片大很多。
众所周知,png有透明通道,而jpg没有,此外png是无损压缩的而jpg是有损压缩的,所以png中存储的信息会很多,体积自然就大了。
但是手机却偏偏对png情有独钟,会对其进行硬件加速,所以我们会发现,同样一张背景图,png虽然体积比jpg大但是加载速度却要快一些。
终上所述,对于App包中的图片,我们都使用png格式的,而对于要从网上加载的图片,考虑到流量以及下载速度,则使用jpg格式的,因为它有较高的压缩率,体积很小。
但是对于背景图、引导页,这种大尺寸的图片,我们还是倾向于使用jpg格式,虽然加载慢一些,但是体积小,减少了包的体积。我看过的App基本都是这么做的。
对于Splash广告图,就是那个每次开启App一闪而过的广告,由于我们隔三岔五就要从线上下载新的广告图并展示在Spalsh页面上,所以这里使用jpg格式的图片。
对于iOS,苹果规定启动页(Launch image)必须是png图片,否则审核时就会被拒。
Google后来发布了一种新的图片格式,WebP,它的压缩率比jpg更好,已经慢慢普及。Android自然是支持的,iOS想要使用这种格式的图片,需要在程序中引入WebP解码器。
4 Splash、引导图和背景图
通过对50多款App中的图片逐个分析,我发现有3种比较典型的场景,大多数公司的解决方案是雷同的:
1. Splash默认广告是体积最大的,而且对应不同机型,要做多套,根据我的经验,每张图控制在300-500k左右就可以了。分辨率再高,对于手机而言,看不出效果。
5 iOS的1倍图、2倍图和3倍图
iPhone4S、iPhone5、iPhone5c、iPhone5s、iPhone6,它们都使用a@2x.png这张2倍图。
直到iPhone6 Plus,才需要提供a@3x.png的图片。如果没有这张3倍图呢,它会选择1倍图或2倍图,我尝试过只有2倍图的情况,在iPhone6 Plus上确实是模糊的效果。
那么问题就来了,我们需要为每张图都提供1倍图、2倍图和3倍图这3张图片吗?
但是在中国,可不是这样哦。我看过友盟给出的数据报告,中国iPhone3GS用户不足0.1%。于是,我有一个大胆的设想,就是把iOS App的包中所有的1倍图都干掉,为每张图生成2倍图和3倍图。
本文给出的解决方案,并不能有效减小iOS包的体积,说不定反而会增大包的大小,但是却能系统的对图片进行管理,从而确保每张图片都是清晰的。
6 在iOS中进行图片拉伸和旋转
在Android技术领域,流行.9图这个概念,从而极大的节省了图片的体积。iOS其实也可以这么干,使用iOS的图片拉伸的语法,可以把一张.9图铺满一个区域,比如说按钮,如下所示:
(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
其中capInsets这个参数是一个UIEdgeInsets类型的结构体,被capInsets覆盖到的区域将会保持不变,而未覆盖到的部分将会被用来平铺。
以上这个方法只适用于iOS0及以上版本,0以下版本有另外的解决方案,但是目前国内的App都只支持0以上版本了,所以这里我就不提及了。
对于箭头,更没必要准备上下左右4张图片,准备一张图片就够了,使用的时候在方向上进行旋转即可。
7 使用XML配置动画
对于做应用类App的开发人员,他们做动画不是很在行,所以他们会要求设计师提供gif格式的动画,或者二十多张图片进行轮播,以达到gif动画的效果,殊不知,在编程上简单了,但是App的体积却相应变大了。
比较简单的解决方案是,减少动画中的关键帧,来降低动画的大小。
我们为什么不仿照Android的XML动画实现技术,为iOS也量身定制一套XML的动画标签呢?从而不用写任何objective-C代码,配置几行XML就展现一个动画。
我见过一家App就是使用这个思想在plist中配置属性来做iOS动画的,如图9-4所示,就是一个平移的动画:
基于这个配置,还需要有一个动画引擎,来解析这个配置文件,将其翻译成objective-C原生语言。在设计模式中,我们称之为解释器模式。
不单如此,我还需要有个测试页面,通过在这个页面中修改动画的属性,然后点击按钮能立刻看到改动后的效果,而不需要重新运行App程序。点个按钮就能执行输入框中的XML脚本。
使用上述的若干方法,我们可以把1个500KB左右的gif文件,减小到50KB的几张图片,并且极大地节省了而开发成本。
8 iOS使用storyboard还是xib?
结论是,是否使用storyboard,对ipa包大小没有影响。
9 字体文件的学问
我在某个ipa包中发现了ttf格式的字体文件。起初还以为是他们的App使用了某种特定字体,但打开这个ttf文件后才发现,这里面存放的居然是图片,如图9-5所示:
每个icon对应一个十六进制的数字,比如说第一个是\Ue600,这个值是唯一的。
- 这些icon都是单色的,可以在App中的页面里设置这些icon为其他颜色,但也必须是单色。
- 这些icon可大可小,因为它们是一种“字体”,字体是矢量图,所以拉伸不会失真。
- 这个ttf文件体积很小,比做成单独的png图片要小。
有人立刻就会联想到iOS的1倍图、2倍图和3倍图,每次都要准备3张图片,分别适用于不同的手机型号。如果做成一个字体,就可以减少体积,再也不用设计@2x和@3x两套图了——这种方案仅限于单色图片。
我们一般到下述网站来把单色icon转换成字体文件:https://icomoon.io。或者使用FontLab这样的工具自己来制作。
接下来,我们将icon和十六进制编码的映射关系保存在drawable资源文件中:
<string name="font_icon_1_normal"></string> <string name="font_icon_1_pressed"></string>
这样就可以使用R.id.font_icon_1_normal这样的语法来取出这个图片了。
TextView textView1 = (TextView) findViewById(R.id.textView1); Typeface font = Typeface.createFromAsset(getAssets(), "icomoon.ttf"); textView1.setTypeface(font); textView1.setTextSize(12); textView1.setText(getResources().getString(R.string.font_icon_1_normal));
也可以将其设计为一个Drawable对象,然后设置给ImageView这样的控件。
2)对于iOS,实现思路差不多。
首先我们要把icmoon.ttf文件添加到项目中,如图9-7所示:
图9-7 UseIconInTTF中的icomoon.ttf文件
在Supporting Files目录下的UserIconInTTF-Info.plist文件中,增加一个配置,类型指定为Fonts provided by application,在其中添加对icomoon.ttf字体文件的声明,如图9-8所示:
图9-8 在UseIconInTTF-Info.plist配置icomoon.ttf
与Android类似,为了不直接使用\ue605这样的十六机制编码数字,我们将icon和十六进制编码的映射关系定义为一个宏TTFConstants:
#define font_icon_1_normal "\ue605" #define font_icon_1_pressed "\ue606"
接下来只要两行代码就能显示这个字体文件中的图片:
[self.label1 setFont:[UIFont fontWithName:@"icomoon" size:12]]; [self.label1 setText: [NSString stringWithUTF8String: font_icon_1_normal]];
10 表情图片打包下载
对于表情图片。很多App中集成了聊天功能,有了聊天,自然就要提供各种表情图片,有静态图png,也有动画gif,虽然每个都不大,但是数量多啊,都打到包里面一起发布,会直接导致包变大。
11 清除未使用图片
对于Android而言,Eclipse可以自动检查出哪些图片没有用到。
对于iOS而言,则需要写个小程序,逐一检查哪些图片没有使用到,注意,对于a@2x.png和a@3x.png的处理,要先将@2x和@3x过滤掉。
无论是Android还是iOS,即使发现到冗余图片,也不能直接删除,因为我们的程序经常会在代码中动态决定要显示哪些图片,我们只能检查这些图片在版本库的修改历史,来决定这些图片是否真的不需要了。
12 Proguard不只是用来混淆的
一提起Android中的Proguard,我们首先想到的是代码混淆,那是因为我们要经常去修改proguard.cfg文件,去keep那些不需要被混淆的类和方法。
13 在iOS中使用pdf格式的图片
在研究各家App的过程中,我发现某款App的ipa文件中有几张pdf格式的图片。
在研究中还发现,有几款App的ipa包中的每张图片都做成imageset的形式,每个imageset目录中都同时存在这张图片的1倍图、2倍图和3倍图,如图9-9所示:
图9-9 cancelSelectedListBtn.imageset目录下的3张图片
上述这两件看似无关的事情,咋一看毫无关联,其实是使用了iOS的一个新技术。让我们从这些蛛丝马迹中探赜索隐。
就是这几张pdf图片,我研究了半天,请设计师同学做成同样的png图片,体积相差不大,所以和png相比毫无优势。由于这个App的ipa包中有几百张图片,其中只有这3张图片是pdf格式的,所以我怀疑,这只是他们的新技术尝试。
再观察imageset目录下的那3张图片,我发现每张图片都是这样的。这不由使我意识到,一定是用了什么工具,一次性生成的这些图片。
搜索关键字ios+pdf,直到找到《Using Vector Images in Xcode 6》这篇文章[4],才发现这是iOS8才出现的一种新技术,只能在XCode6上使用。
在这里简单介绍一下这门技术,先绘制一张pdf矢量图,然后XCode6在编译的时候,会生成3张pdf格式的图片,分别是1倍图、2倍图、3倍图。这样就避免了图片不全导致的模糊,也避免了每次都要设计师准备3套图的麻烦。
但是,我们为什么要在用户的iPhone上装一些永远用不到的图片呢?苹果煞费苦心的搞出来这样一门技术,仍然没有解决App体积日益膨胀的现实,而且这门技术只会让App的体积变得更庞大——而这才是用户的痛点所在。如果是我来设计下一版iOS,我会让App中只包括pdf矢量图,只有在用户下载完App开始安装的时候,才会根据用户的机型,把pdf转换为相应的图片,比如说iPhone 6+上App生成的图片就是3倍图。
苹果公司在iOS9中推出了App瘦身功能,据说能大幅减少要下载的App包的体积。具体效果如何,我们拭目以待。
14 iOS的包永远比Android包体积大吗?
我比较了100多款App后发现,同一款App的iOS和Android版本,iOS的ipa包的一定比Android的apk包在体积上大很多。
drawable文件夹就更多了,高达28个,限于篇幅,这里就不贴图了。
15 从代码层面减少iOS包的体积
我们要想办法减少这个.a文件的大小,其实就是要减少项目中的冗余代码。经过不断地摸索和尝试,我发现这些冗余代码分为3部分:
2)已经不再使用的方法。这个找起来有些费劲,因为Objective-C独特的方法签名形式(方法签名由三部分组成,包括方法名称、参数和返回类型)。
仍然是写一个Python脚本,逐个遍历每个类中的方法,然后到项目中查找是否使用到了。
3)代码相似度问题。初级程序员在写代码时,喜欢把一段代码从A类粘贴到B类中,然后修改其中的几个变量名称,这个功能就算做完了。于是两段相似度极高的代码就产生了。
稍微懂得些面向对象思想的人,都知道这时候需要把这样的代码抽象出来,比如说在Utils类中新建一个方法,然后要用到这段逻辑的人调用Utils类的这个方法即可。
[1] 关于Android增量更新技术,请参见http://blog.csdn.net/hmg25/article/details/8100896
[3] 详细内容请参见知乎上的这篇文章:http://www.zhihu.com/question/25421514/answer/31623909
[4] 文章参见http://martiancraft.com/blog/2014/09/vector-images-xcode6/
App竞品技术分析 (3)减小安装包的体积相关推荐
- App竞品技术分析 (3)减小安装包的体积(转)
http://blog.csdn.net/JspAndAsp/article/details/49339403 1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是 ...
- 《App研发录:架构设计、Crash分析和竞品技术分析》— Android 书籍
文章目录 第1章 重构,夜未眠 3 第2章 Android网络底层框架设计 19 第3章 Android经典场景设计 53 第4章 Android命名规范和编码规范 83 第5章 Crash异常收集与 ...
- App研发录:架构设计、Crash分析和竞品技术分析读书笔记
研发录者,有友荐之,遂买观之,颇有感触.大惊呼:书之甚好. 吾之开发,一二年也.所览书而略有一二,得此书,如获一宝.故焚香沐浴,静坐以观之.然不知时也,东方微白.吾起而立,精神抖数,飘飘乎策车而劳之. ...
- 2019年移动社交APP竞品前瞻性分析
社交的本质是什么?笔者认为社交的本质是一个用户社交资产成长的游戏.在这个游戏里,用户根据自身社交资产的成长曲线,来挑战对应难度的社交目标. 对于2019年社交赛道,我们可以从两个方向来预测,每个方向我 ...
- 四大主流新闻App竞品分析
详细内容扫二维码查看! 四大主流新闻App竞品分析 1.概述 (1)市场概况 产品用户体量:2016年Q2移动资讯分发市场用户规模达到5.8亿人,基本完成用户普及,用户增长趋势明显放缓.在活跃用户渗透 ...
- 竞品技术三瞥安装包的大小
1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是使用4G流量包月了,于是在下载了10个App后,不但耗尽了流量,还按照0.3元/兆的价格扣了七八十元话费.后来我 ...
- 如何写好一份竞品运营分析报告?
网络上关于写产品竞品分析的文章很多,做运营类竞品分析的文章比较少,所以今天抛砖引玉和大家分享一下,我在分析竞品运营中的思考和心得. 每天发生在我们APP里各种变化都是值得运营学习的最好材料,尤其是竞品 ...
- 小红书竞品分析_跨境电商APP竞品分析:小红书、网易考拉和达令
本文作者选取跨境电商中发展较为不错的三款APP(红书.网易考拉和达令APP)进行了分析,指出了各自的不足,且提出了自己的建议.作为彼此的竞品,三款软件的侧重点不同,值得一阅. 入选条件 小红书海外购物 ...
- 小众陌生人社交App:爱聊、觅伊、他趣APP竞品分析
编辑导语:近几年,陌生人社交市场正在迅速发展,小众社交产品的用户不断增加,因此,同类APP间也开始了差异化竞争.本篇文章对爱聊.觅伊.他趣三款小众社交APP进行分析,一起来看看. "既害怕社 ...
最新文章
- getoutputstream java_java socket getInputStream getOutputStream
- 【JS】我的JavaScript学习之路(6)
- 简单的线性模型实现tensorflow权重的生成和调用,并且用类的方式实现参数共享
- php mysql 数据库类_PHP操作MySQL数据库的类
- python中正确的赋值语句_在Python中使用赋值表达式时,如何完成赋值语句“x=y:=f(x)”?...
- Phycharm下载并安装
- 115怎么利用sha1下载东西_如何不登陆115网盘也能使用迅雷下载其文件?教你手动解析115网盘文件真实的直接下载地址【转】...
- 单位旧计算机处理,单位出售旧电脑增值税税率是多少?
- 大数据的核心架构层是哪些?
- 一个转来的简单T9输入法
- python 时间格式datetime、str与date的相互转换
- 关于n阶线性齐次常微分的特征方程特征根相同时解的推导
- Scene…… couldn‘t be loaded because it has not been added to the build settings or the AssetBundle...
- 深入浅出Pytorch函数——torch.arange
- 网上测试眼镜的软件,测脸型配眼镜app
- 从面试到入职到离职,我在B站工作的30天时光!!!
- 从零开始做3D地图编辑器(六)(基于QT与OGRE)
- 警惕: Python 中的路径穿越
- 2021华为荣耀手机最新GMS15分钟快速安装教学-无烦人警告与弹窗!
- php颜色底色,PHP GD 库自定义图片背景颜色