【iOS重学】On-Demand Resource的简单介绍和使用
关于On-Demand Resource在之前的文章浅谈iOS的包体积优化(一)中我们提到过On-Demand Resource,本文主要来详细介绍一下On-Demand Resource。
iOS9引入了一个新的功能 - On-Demand Resource(ODR),它是App Thinning的一部分,这个功能简单的说就是:在APP下载的时候,APP中包含的不重要的资源可以先不下载,等真正需要用到的时候再去下载,再由系统向苹果的server发送请求,下载这些资源包。
具体见苹果官方文档
注意:
1、 ODR中的资源是在APP打包的时候确定的,不进行版本更新就无法更新这些资源。
2、ODR的资源是存放在苹果Server的,我们不需要再用自己的服务器。
On-Demand Resource使用前后安装包变化
使用ODR的优点1、可以减小应用的大小,使得下载更快,提升用户体验。
2、一些固定的应用资源懒加载
3、操作系统会在磁盘不够的时候清理ODR
按需加载的资源类型
ODR的使用ODR的三种类型
initial install Tags:此种类型的资源会随着APP从App St ...
【iOS重学】浅谈iOS的包体积优化(二)
LinkMap分析可执行文件LinkMap结构分析基础信息
类表
里面保存的是所有用到的类生成的.o文件,也包括用到的dylib库。[num]指的是序号,类是按照顺序保存的,后续可以通过序号查到具体对应的哪个类。
段表
段表里面描述了不同功能的数据保存地址,通过这个地址可以查到对应内存里面存储的是什么数据。
第一列:起始地址
第二列:段占用的大小
第三列:段类型
第四列:段名称
每一行初始地址 = 上一行处始地址 + 占用大小
__TEXT:代码段
__DATA:数据段
后续符号表内容代码节
第一列:起始地址 通过这个地址可以查上面的段表
第二列:方法占用的大小 通过这个可以计算出方法占用的大小
第三列:归属的类
通过这部分我们可以分析出每个类对应的方法的大小。
方法名节
这部分保存的是:类中方法的字符串信息
如何分析
查看第一列初始位置 比如0x1016FF830 然后看这个地址在【段表】中的哪个节里面 我们这里看到是在__objc_methodname里面。
分析LinkMap的工具LinkMap分析工具
__TEXT代码段迁移方案Mach-O文 ...
【iOS重学】浅谈iOS的包体积优化(一)
为什么要做包体积优化随着应用的不断更新迭代,应用安装包的体积会越来越大,用户下载应用消耗流量产生的资费就会进一步增长,会导致用户下载意愿会相对下降。
随着包体积的不断增大,安装应用的时间变长会影响用户的使用感受,对于内存比较小的低端机型来说,应用解压后内存占用更大也会影响用户的使用。
苹果对iOS APP 大小有严格的限制,虽然苹果官方也一直在提高可执行文件的上限,在iOS13 还取消了强制的OTA限制,但是下载大小超过200MB的会默认请求用户下载许可,并且在iOS13以下的设备依然会受到OTA的限制,影响新用户转化和老用户的更新。
苹果对可执行文件大小有明确的限制,超过该限制可能会APP审核被拒。
具体的限制如下:
1、iOS7 之前,二进制文件中所有的__TEXT段总和不得超过80MB
2、iOS7.x - iOS 8.x,二进制文件中,每个特定架构中的__TEXT段不得超过60MB
3、iOS9 之后,二进制文件中所有的__TEXT段总和不得超过500MB
所以,为了更好的用户体验和减少用户等待的时间,包体积优化都是APP优化中非常重要的一环。
IPA安装包分析相关知识【A ...
【 iOS重学】探究OC对象的本质
写在前面苹果官方源码下载:opensource.apple.com/tarballs -> 搜索objc/4 -> 下载最新源码
Objective-C的本质在iOS开发中如果我们使用OC编写的代码,其底层都是C/C++代码。
所以我们可以理解为:Objective-C中面向对象都是基于C/C++的数据结构【结构体】实现的。
在面试的时候有的面试官会问到我们OC对象的本质是什么?我们可以说是【结构体】。
生成C++文件的一些命令:
clang -rewrite-objc main.m -o main.cpp:无法区分平台 不建议使用
xcrun -sdk iphonesimulator clang -rewrite-objc main.m -o main.cpp:模拟器
xcrun -sdk iphoneos clang -rewrite-objc main.m -o main.cpp:真机
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc 源文件名 -o 输出的cpp文件名: ...
【iOS重学】离屏渲染
屏幕显示完整流程
整体渲染流程可以分为三个阶段:
1、CPU阶段
CPU的计算主要是通过CoreAnimation来处理,通过OpenGL ES/Metal将数据传递给GPU。
2、GPU阶段
GPU渲染主要是将接收到的渲染数据进行一系列渲染之后将帧数据存储在帧缓存(Frame Buffer)里面,供视频控制器调用。
3、屏幕显示
视频控制器从帧缓存中获取到帧数据显示在屏幕上。
屏幕显示图像原理CRT显示器原理
CRT显示器原理主要是通过【电子束】激发屏幕内表面的荧光粉来显示图像,由于荧光粉点亮后很快就会熄灭,所以【电子枪】需要不断的【从上到下】进行扫描,扫描完成后显示器就呈现一帧画面,电子枪回到【初始位置】开始下一次的扫描。
水平同步信号:当电子枪换行扫描时会发出一个水平同步信号。
垂直同步信号:当一帧完成绘制后,电子枪恢复到原来的位置准备扫描下一帧时显示器会发出一个垂直同步信号。
GPU渲染完成后将渲染结果存入帧缓存区,视频控制器根据【垂直同步信号】逐帧读取帧缓冲区的数据,经过数据转换之后由显示器进行显示。
帧缓存(Frame Buffer)1、屏幕刷新频率
Re ...
【PS学习】色彩基础
写在前面相关文章:
1、【PS学习】初识PS界面
2、【PS学习】文件基本操作
本篇主要是记录一下关于PS中色彩相关基础,PS版本为【PS2020】。
色彩基础色彩专业术语1、色相
颜色在画板上的反映 可以理解为就是我们所说的颜色。
2、纯度
彩度 - Chroma 是相对于灰色而言 从左到右 彩度越来越高
饱和度 - Saturation 从左到右 饱和度越来越低
强度 - Intensity 中间的颜色 强度是最高的
彩度、饱和度、强度都可以用来形容纯度。
3、明度
光亮度 - Luminance 越暗的颜色光亮度越低 越亮的颜色光亮度越高
暗色 - Shade 从左到右越来越暗
浅色 - Tint 从左到右越来越浅
关于色彩可以看看下图:
颜色的加法与减法
1、印刷三原色:青色、品红、黄色
2、光的三原色:红色、蓝色、绿色
色环构成原理
如何使用双色模式打造单色调的照片效果【菜单栏】 - 图像 - 模式 - 灰度
效果图如下:
用吸管工具选取颜色【工具栏】 - 吸管工具
快捷键 ...
【PS学习】文件基本操作
写在前面相关文章:1、初识PS界面
本篇主要讲一下PS中关于文件的一些操作,PS版本为【PS2020】。
文件的相关操作如何新建文档1、PS界面左边【新建】按钮
2、【菜单栏】文件 - 新建
3、快捷键:command + N
提示:里面有很多PS默认为我们提供的模版,如果有合适的可以直接创建。
如何保存预设文档
新建文档注意事项
提示:
当希望将多个页面的UI放到一个文件时,在创建文件时需要勾选【画板】。
如果文档是针对【打印输出】,颜色模式一般选择CMYK模式,位数保持8bit。
如果文档是针对【屏幕显示】,颜色模式一般选择RGB模式,位数保持8bit。
颜色模式的位数越高呈现的颜色就越多,不过一般我们肉眼也无法识别那么多颜色所以位数一般保持8bit即可。
如何打开文件1、PS界面左边【打开】按钮
2、【菜单栏】文件 - 打开
3、command + O
4、选择需要打开的文件拖拽到PS
如何打开序列文件选择某一序列文件 - 勾选【图像序列】
注意:PS工作区会出现时间轴,如果没有通过【菜单栏】窗口 - 时间轴配置。
置入链接的智能对象【菜单栏】文件 - 置入 ...
【PS学习】初识PS界面
写在前面我这里以【PS2020】和【Mac】为例来带大家初步认识PS,也顺便整理一下我之前学习PS的笔记。
初识PS界面
1:【菜单栏】- 包含了文件、编辑、图像、图层、文字、选择、滤镜、3D、视图、窗口、帮助
2:【工具选项栏】 - 设置工具选项的,根据所选的工具不同【工具选项栏】中的内容也不同
3:【工具栏】- PS相关的工具
4:【工作区】- 所有的操作都会显示在工作区
5:【工作面板】- 用来设置颜色、工具参数等
PS工具栏介绍
总结:上面按照【PS2020】的工具栏从上至下简单做了个介绍,但是大家会发现有的图标右下角有展开标记,说明着里面还包含了其他工具,大概包含了69种工具。
这里就不一一罗列出来,大家可以打开PS看一下。
部分PS操作面板显示与隐藏隐藏所有面板:tab键
只显示【工具栏】和【工具选项栏】面板:tab键 + shift
注意:当鼠标靠近左边,左边面板会出现,当鼠标靠近右边,右边面板会出现。
PS界面如何复位【PS界面】右上角 - 复位基本功能
多个文档之间如何切换快捷键:control + tab键
如何关闭当前打开的所有文档1、【菜单栏 ...
【 iOS重学】启动优化(三)- Clang插桩
写在前面在 上一篇文章iOS重学之启动优化(二)- 二进制重排 最后我们提出了一个问题:如何精确获取应用启动时刻的符号调用顺序,本篇文章我们就来详细介绍如何通过Clang插桩来对所有的符号进行100%的Hook。
Clang插桩LLVM内置了一个简单的代码覆盖率检测(SanitizerCoverage)。它在函数级、基本块级和边缘级插入对用户定义函数的调用,并提供了这些回调的默认实现。在认为启动结束的位置添加代码,就能够拿到启动到指定位置调用到的所有函数符号。
LLVM官方文档 也具体介绍了如何使用Tracing PCs with guards来做到Hook所有的函数符号。
Tracing PCs with guards:
可以理解为跟踪代码执行逻辑的一个工具,Clang编译器就可以通过插桩来获取调用的符号顺序。
Xcode配置在项目Buiding Setting中Other C Flags里面添加 -fsanitize-coverage=trace-pc-guard标识,如下:
添加Hook代码在项目里面添加如下两个函数:
首先导入头文件:
#include <stdio ...
【iOS重学】启动优化(二)- 二进制重排
写在前面在第一部分iOS重学之启动优化(一)中,我们主要从Pre-main和main之后两个时间来衡量一个iOS应用启动的时长,以及详细分析了Pre-main的四个阶段,其中也提到了一些概念:比如物理内存、虚拟内存、缺页中断等,感兴趣的可以移步上一篇文章了解一下,本文主要跟大家详细讨论一下什么是二进制重排、二进制重排为什么能够优化iOS应用启动时间等问题。
物理内存 & 虚拟内存物理内存:指的是通过物理内存条获得的内存空间。
虚拟内存:跟物理内存相反,虚拟内存指的一种计算机系统内存管理技术,它使得应用程序认为它拥有连续可用的内存,实际上它通常被分隔成多个物理内存碎片。
只谈概念太空洞,下面我们用图来解释什么是物理内存、什么是虚拟内存。
物理内存的概述图如下:
分析:
在没有虚拟内存的概念之前,每个应用一启动,操作系统就会把整个应用放进物理内存里面。
物理内存存在的问题:
内存紧张的问题 - 由于每次都是直接把整个应用放进物理内存里面,很可能出现内存不够用的情况。
进程的安全问题 - 没个进程之间的物理地址是连续的,可以拿到别的进程的地址,容易出现进程不安全的问题。
...