2019-09-04 20:03:22 kangpengpeng1 阅读数 21

iOS 安装包瘦身

1、App Thinning

苹果针对安装包已经做了三个层面的瘦身工作。

1.1 App Slicing

我们打包时,常选择arm64、armv7s 等架构支持。但是上传苹果应用商店后,他为我们的应用安装包针对不同的机型架构,生成了特定的安装包。也就是不同arm64架构的机型不会下载armv7s架构的安装包。

1.2 On Demand Resource

资源按需下载。XCode默认开启了改功能。为资源设置tag值,对应于使用到改资源的文件,绑定tag对应的tag值,当需要用到的时候下载对应的资源文件。

1.3 BitCode


2、资源瘦身

2.1 删除项目中未用到的资源文件

删除项目中未用到的图片资源(切记防止误删,有些使用字符串拼接图片名的使用方式可能不能被识别到)。

查找工具:
LSUnusedResources

2.2 压缩图片

对图片资源在不影响显示效果(失真度)的情况下进行适当压缩。

图片压缩工具

  1. tinypng
  2. pngquant
  3. ImageAlpha
  4. ImageOptim

3、代码瘦身

Optimization Level: Fastest,
Smallest Deployment Postprocessing: Yes
Strip linked Product: Yes
Symbols Hidden by default: Yes
Make Strings Read-only: Yes

3.1 删除项目中未用到的类文件

3.2 删除项目中未用到的方法/函数

查找项目中未使用方法的脚本工具 selectorsunref-master
使用方法:iOS代码瘦身:未使用的方法

  1. 执行 python selectorsunref.py
  2. 输入的第一个参数为xxx.app,可以把Xcode products目录下的xxx.app拖到命令行,这个参数是为了拿到.app下的mach-o文件,分析使用的方法和未使用的方法。
  3. 输入的第二个参数是工程目录,这个参数是为了递归遍历找到工程中所有的.h文件,然后过滤掉包含的协议方法。

3.3 一个根据linkMap文件计算Xcode里各个工程代码占安装包大小的工具

该脚本功能主要是把各个工程所占可执行文件的大小统计出来。

2015-12-08 16:47:44 Leemin_ios 阅读数 1807

真机调试,需要两个授权证书, 

一个是.p12文件, 

一个是.mobileprovision文件, 

用户只需将这两个文件双击导入进mac电脑, 

进入XCode ,菜单,Organizer 将设备激活为开发者用机即可进行真机调试 






应用的发布也分两种

一种是.打包成ipa上传到国内第3方软件市场,当用户的手机已经JailBreak时,双击下载的ipa文件就可以安装软件 

(ipa同android的apk包一样,实质是一个压缩包) 

方式一:使用XCode打包ipa

1.选择 Edit Scheme

 iOS打包ipa安装包的流程

2.选择图中显示的【Release】

 iOS打包ipa安装包的流程

注意,此时的工程左边Products目录下仍然是红色的<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140906/2014090608361786.png" alt="\"> 

3.按住Command + B ,进行编译

通过前面指定的Release方式,会自动生成

一个【30_单元测试.app】文件,

此时工程左边Products目录下,已经有了新生成的【30_单元测试.app】文件

 iOS打包ipa安装包的流程

4.右键,show in Finder,将【30_单元测试】这个资源包(其实就是mainBundle),拷贝至桌面


5.在桌面新建一个空白的文件夹,名字必须是:【Payload】


6.再将【30_单元测试】这个资源包,移动到【Payload】文件夹内 

7.右击【Payload】文件夹,选择【压缩】 

8.最后,将压缩后的文件名后缀zip 更改为ipa即可 



方式二:使用iTunes打包ipa

前面3个步骤一样

4.打开iTunes,Command+逗号,打开偏好设置,勾选【应用程序】

 iOS打包ipa安装包的流程

 iOS打包ipa安装包的流程

 iOS打包ipa安装包的流程


5.右键Xcode工程左边Products目录下生成的30_单元测试.app,选择show in Finder,将【30_单元测试】这个资源包(其实就是mainBundle),直接拖至iTunes即可自动生成ipa文件





另一种.上传到app store,使用XCode的Product菜单下的Archive方式打包

 iOS打包ipa安装包的流程

打包完成后,点击XCode菜单window,Organizer,Achives,就可以看到生成的Archive Type:iOS App Archive,像这种压缩包就是发布至appStore的压缩包

 iOS打包ipa安装包的流程

2018-09-18 13:19:55 jessicaiu 阅读数 748

本文来自网易云社区


作者:饶梦云

1. 安装包组成

谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源。解压一个 ipa 包,拿到其 payload 中 app 文件的数据,整理归类后其大致如下:

  • Exectutable: 可执行文件

  • Resources:资源文件

    • 图片资源:Assets.car/bundle/png/jpg 等

    • 视频/音频资源:mp4/mp3 等

    • 静态网页资源:html/css/js 等

    • 视图资源:xib/storyboard 等

    • 其他:文本/字体/证书 等

  • Framework:项目中使用的动态库

    • SwiftSupport: libSwiftxxx 等一系列 Swift 库

    • 其他依赖库:Embeded Framework

  • Pulgins:Application Extensions

    • appex:其组成大致与 ipa 包组成一致

从以上结构中可以看出一个 ipa 包大致由 Executable, Resources, Framework,Plugins 四大模块组成,接下来我们就从这四个方向来探讨 App 瘦身的具体方案。

2. 可执行文件瘦身

可执行文件就是我们源代码(.m/.h/.swift ...)的编译结果。在 iOS 或者 macOS 中称之为 Mach-O executable,它是程序的入口。

2.1. 编译器优化

Xcode 支持编译器层面的一些优化优化选项,可以让我们介于更快的编译速度和更小的二进制大小并且更快的执行速度之间自由选择想要进行的优化粒度。

2.1.1. Clang/LLVM 编译器优化选项

我们都知道 Xcode 是使用 Clang 来编译 Objective-C 语言的,Clang 的优化选项在其文档 clang - Code Generation Options 中可以查阅得到。我们的 IDE-Xcode 只提供给我们 6 个等级的编译选项,在 Xcode -> Build Setting -> Apple LLVM 9.0 - Code Generation -> Optimization Level 中进行设置,每个等级的说明,可以参考官方文档

xcode-clang-optimization

  • None[-O0]: 编译器不会优化代码,意味着更快的编译速度和更多的调试信息,默认在 Debug 模式下开启。

  • Fast[-O,O1]: 编译器会优化代码性能并且最小限度影响编译时间,此选项在编译时会占用更多的内存。

  • Faster[-O2]:编译器会开启不依赖空间/时间折衷所有优化选项。在此,编译器不会展开循环或者函数内联。此选项会增加编译时间并且提高代码执行效率。

  • Fastest[-O3]:编译器会开启所有的优化选项来提升代码执行效率。此模式编译器会执行函数内联使得生成的可执行文件会变得更大。一般不推荐使用此模式。

  • Fastest Smallest[-Os]:编译器会开启除了会明显增加包大小以外的所有优化选项。默认在 Release 模式下开启。

  • Fastest, Aggressive Optimization[-Ofast]:启动 -O3 中的所有优化,可能会开启一些违反语言标准的一些优化选项。一般不推荐使用此模式。

Fastest Smallest[-Os] 极小限度会影响到包大小,而且也保证了代码的执行效率,是最佳的发布选项,一般 Xcode 会在 Release 下默认选择 Fastest Smallest[-Os] 选项,较老的项目可能没有自动勾选。

XCode 中设置的选项最终会反应在 Clang 命令上面,打开 build log 可以看到此选项最终的表现形式:

clang/llvm-optimization-level-command

如果你还需要 clang 的其他选项来编译你的项目,可以在 Other C Flag 中直接添加其参数。举例来说,在 Optimization Level 中设置 Fastest Smallest[-Os] 和在 Other C Flags 中添加 -Os 效果是一样的。

2.1.2. Swift Complier/LLVM 编译优化选项

Swift 语言的编译器是 swiftlang,同时也是基于 LLVM 后端的。Xcode 9.3 版本之后 Swift 编译器会提供新的选项来帮助减少 Swift 可执行文件的大小:

xcode-swift-llvm-optimization

  • No optimization[-Onone]:不进行优化,能保证较快的编译速度。

  • Optimize for Speed[-O]:编译器将会对代码的执行效率进行优化,一定程度上会增加包大小。

  • Optimize for Size[-Osize]:编译器会尽可能减少包的大小并且最小限度影响代码的执行效率。

Xcode 9.3 以前和优化选项混杂在一起的编译模式可以独立设置了:

xcode-swift-compilation

  • Single File:单个文件优化,可以减少增量编译的时间,并且可以充分利用多核 CPU,并行优化多个文件,提高编译速度。但是对于交叉引用无能为力。

  • Whole Module:模块优化,最大限度优化整个模块,能处理交叉引用。缺点不能利用多核 CPU 的优势,每次编译都会重新编译整个 Module。

在 Relese 模式下 -Osize 和 Whole Module 同时开启效果会发挥的最好,从现有的案例中可以看到它会减少 5%~30% 的可执行文件大小,并且对性能的影响也微乎其微(大约 5%)。参考官方文档SwiftCafe

此选项虽然是 Xcode 9.3 支持的,但是我们发现 Xcode 9.2 对应的 Swift Compiler 也是支持 Osize 的。所以 Xcode 9.2 版本中可以在 Build Settings -> Other Swift Flags 中添加 -Osize 提前获取编译器优化的好处。

xcode9.2-swiftc-Osize

虽然 Xcode 9.3/Swift4.1 已经发布,但是其编译器不是特别稳定,特别是开启 Osize 选项之后,编译器很多情况下会莫名其妙的崩溃(Segmentation fault),我们在 bugs.swift.org 上面也找到了很多同类的崩溃。所以假如你使开启 Osize 之后遇到了同类的崩溃,你可以选择放弃 Osize,或者想办法修改代码绕开编译器崩溃。

2.2. 去除符号信息

可执行文件中的符号)是指程序中的所有的变量、类、函数、枚举、变量和地址映射关系,以及一些在调试的时候使用到的用于定位代码在源码中的位置的调试符号,符号和断点定位以及堆栈符号化有很重要的关系。

2.2.1. Strip Style

Strip Style 表示的是我们需要去除的符号的类型的选项,其分为三个选择项:

  • All Symbols: 去除所有符号,一般是在主工程中开启。

  • Non-Global Symbols: 去除一些非全局的 Symbol(保留全局符号,Debug Symbols 同样会被去除),链接时会被重定向的那些符号不会被去除,此选项是静态库/动态库的建议选项。

  • Debug Symbols: 去除调试符号,去除之后将无法断点调试。

iOS 的调试符号是 DWARF 格式的,相关概念如下:

  • Mach-O: 可执行文件,源文件编译链接的结果。包含映射调试信息(对象文件)具体存储位置的 Debug Map。

  • DWARF:一种通用的调试文件格式,支持源码级别的调试,调试信息存在于 对象文件 中,一般都比较大。Xcode 调试模式下一般都是使用 DWARF 来进行符号化的。

  • dSYM:独立的符号表文件,主要用来做发布产品的崩溃符号化。dSYM 是一个压缩包,里面包含了 DWARF 文件。

dwarf_dsym_executable

使用 Xcode 编译打包的时候会先通过可执行文件的 Debug Map 获取到所有对象文件的位置,然后使用 dsymutil 来将对象文件中的 DWARF 提取出来生成 dSYM 文件。

2.2.2. Strip Linked Product

If enabled, the linked product of the build will be stripped of symbols when performing deployment postprocessing.

并不是所有的符号都是必须的,比如 Debug Map,所以 Xcode 提供给我们 Strip Linked Product 来去除不需要的符号信息(Strip Style 中选择的选项相应的符号),去除了符号信息之后我们就只能使用 dSYM 来进行符号化了,所以需要将 Debug Information Format 修改为 DWARF with dSYM file。

我之前一直疑惑没有 DWARF 调试信息之后 Xcode 是靠什么来生成 dSYM 的,答案其实还是 DWARF,因为 Xcode 编译实际的操作步骤是:生成带有 DWARF 调试信息的可执行文件 -> 提取可执行文件中的调试信息打包成 dSYM -> 去除符号化信息。去除符号是单独的步骤,使用的是 strip 命令。

另外一个问题是,去除符号化信息之后我们只能使用 dSYM 来进行符号化,那我们使用 Xcode 来进行调试的时候会不会太麻烦了?其实我们完全不用担心这个问题:Strip Linked Product 选项在 Deployment Postprocessing 设置为 YES 的时候才生效,而在 Archive 的时候 Xcode 总是会把 Deployment Postprocessing 设置为 YES 。所以我们可以打开 Strip Linked Product 并且把 Deployment Postprocessing 设置为 NO,而不用担心调试的时候会影响断点和符号化,同时打包的时候又会自动去除符号信息。这个选项也是默认打开的,较老的项目可以选择手动开启。

2.2.3. Strip Debug Symbols During Copy

Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols. It does not cause the linked product of a target to be stripped—use Strip Linked Product (STRIP_INSTALLED_PRODUCT) for that.

与 Strip Linked Product 类似,但是这个是将那些拷贝进项目包的三方库、资源或者 Extension 的  Debug Symbol 去除掉,同样也是使用的 strip 命令。这个选项没有前置条件,所以我们只需要在 Release 模式下开启,不然就不能对三方库进行断点调试和符号化了。

如果依赖的 Target 是独立签名的(比如 App Extension),strip 操作就会失效,并伴随着 Warning:warning: skipping copy phase strip, binary is code signed: xxxx。此情况将依赖的 Target 中的 Strip Linked Product 修改为 YES,保证依赖的 Target 是已经去除了符号即可,Waning 忽略掉就可以了。

Cocoapods 管理的动态库(use_framework!)的情况就相对要特殊一点,因为 Cocoapods 中的的动态库是使用自己实现的脚本 Pods-xxx-frameworks.sh 来实现拷贝的,所以并不会走 Xcode 的流程,当然也就不受 Strip Debug Symbols During Copy 的影响。当然 Cocoapods 是源码管理的,所以只需要将源码 Target 中的 Strip Linked Product 设置为 YES 即可。

2.2.4. Strip Swift Symbols

Adjust the level of symbol stripping specified by the STRIP_STYLE setting so that when the linked product of the build is stripped, all Swift symbols will be removed.

开启 Strip Swift Symbols 能帮助我们移除相应 Target 中的所有的 Swift 符号,这个选项也是默认打开的。

补充一点:Swift ABI 稳定之前,Swift 标准库是会打进目标文件的,想要同时移除 Swift 标准库里面的符号的话需要在发布选项中勾选 Strip Swift symbols,如下图所示:

distribution_strip_swift_symbols

2.3. BitCode

BitCode 是 iOS 9 引入的新特性,官方文档解释 BitCode 是一种程序中间码,其实就是 LLVM IR 的一种编码形式 - BitCodeFormart

bitcode-architecture

上图表示了 IR 和 BitCode 在编译器架构中所在的位置,需要说明的是 BitCode 是以 section 形式保存在可执行文件中。当我们把携带 BitCode 的 App 提交到 AppStore 后,苹果会提取出可执行文件中的 BitCode 段,然后针对不同的 CPU 架构编译和链接成不同的可执行文件变体(Variant),不同 CPU 架构的设备会自动选择合适的架构的变体进行下载。而在 BitCode 之前没我们都是把所有需要的 CPU 架构集合打包成一个 Fat Binary,结果就是用户最终下载的安装包之中有很多冗余的 CPU 架构支持代码。

从以上编译器架构中我们也可以得出一个结论:开启 BitCode 之后编译器后端(Backend)的工作都由 Apple 接管了。所以假如以后苹果推出了新的 CPU 架构或者以后 LLVM 推出了一系列优化,我们也不再需要为其发布新的安装包了。

2.3.1. BitCode 一致性要求

一致性要求意味着工程开启 BitCode 之后必须要求所有打进 Bundle 的 Binary 都需要支持 BitCode,也就是说我们依赖的静态库和动态库都是含有 BitCode 的,不然就会打包失败。对于 Cocoapods 等源码管理工具来管理的依赖库来说操作会比较简单,我们只需要开启 Pods 工程中的 BitCode 就行。但是对于一些三方的闭源库,我们就无能为力了。

2.3.2. BitCode 的崩溃定位

开启 BitCode 之后需要特别注意崩溃定位的问题:由于最终的可执行文件是 Apple 自动生成的,同时产生新的符号表文件,所以我们使用原本打包生成的 dSYM 符号化文件是无法完成符号化的。所以我们需要在上传至 App Store 时需要勾选 Include app symbols for your application to receive symboilcated crash logs from Apple:

Include app symbols

勾选之后 Apple 会给我们生成 dSYM,然后就可以在 Xcode -> Organizer 或者 iTunes Connect 中下载对应的 dSYM 来进行符号化了。

2.3.3. BitCode 的编译选项优化

上面所说的编译器优化是在编译器前端完成的,所以提交的 BitCode 应该是经过优化的。但是 去除符号信息,是在编译生成可执行文件之后完成的, 苹果在生成可执行文件之后是否给我们去除了符号也不得而知。


本文来自网易云社区,经作者饶梦云授权发布

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 基于Docker的UI自动化初探
【推荐】 一次活动引发的血案
【推荐】 [5.19线下活动]DockerMeetup杭州站—拥抱Kubernetes,容器深度实践

2014-01-06 15:54:16 u013335403 阅读数 595

面试的时候,很多公司要程序安装包,下面是借用来的资料,共需要的人参考

原文地址:iOS 程序安装包制作作者:ggyd
    教你怎么制作iOS(iPhone,iPad)程序安装包:

1 在任意地方建立空文件夹,比如在桌面的建立一个叫做“test”文件夹;
2 在上一步的文件夹中建立一个名为“Payload”的文件夹;
3 找到你程序下的"build"中"release-iphoneos"下的后缀名为app的文件:[转载]iOS <wbr>程序安装包制作

4 将上面的后缀名为“.app”的文件放入你刚才建立的“Payload”这个文件夹
(此步骤非必须)如果你想放一张在iTunes上显示的图片,放在“test”的文件夹下,大小最好是512*512。删除其后缀名,并将其改名为“itunesArtWork”。放置后的文件夹应该如下:
[转载]iOS <wbr>程序安装包制作

6 现在开始打包啦!打开“应用程序”中“实用工具”的“终端.app”(terminal.app),将操作目录定义到你刚才新建的“test”目录。命令是: cd +"你的目录路径"。
比如,我放桌面的“test”文件夹就是:cd desktop/test

7 打包文件 使用命令是:zip -r "你的应用程序名.ipa" *

比如我打包自己程序的命令就是 zip -r whatisthat.ipa *
回车运行就好啦

8 成功后截图如下:
[转载]iOS <wbr>程序安装包制作
后缀名是ipa的文件就是可以安装到你手机上的应用程序啦!

恭喜你,你已经成功制作了iOS(iPhone,iPad)程序安装包啦!

2016-10-06 14:59:00 linweicanpc2 阅读数 925


安装包主要由两部分组成,资源文件以及可执行文件,瘦身主要从这两部分入手;

【1】资源文件瘦身
资源文件包括图片、声音、视频、文本文件等,只要在xcode中引用就会被打包到安装包中。
    1.检查项目中有哪些资源文件不再使用但依然被引用,可通过写脚本进行检查;
    2.检查项目中哪些资源文件可以迁移到线上而不是打包到安装包中;
    3.检查项目中哪些图片过大,如使用TinyPng等压缩工具对Png格式图片进行压缩

【2】可执行文件瘦身
源代码、静态库都会被编译到可执行文件中。
    1.Xcode build Setting中开启Write Link Map File,然后对Link map File进行分析,检查具体哪些类最大;
    2.对CocoaPods引用的无用的库进行清理,写脚本对项目中未使用到的源代码进行清理;
    3.对引用的库大小进行评估,对于过大的库是否有相对轻量的库的替代方案;例如只使用到百度地图的基本功能,这时就可以用百度地图轻量包代替全量包,安装包可减少5M左右;
    4.编译选项优化
    Deployment Postprocessing strip 是总开关,只有它打开了,其他strip选项才起作用
        4.1、Deployment Postprocessing 设置成YES
        4.2、Build Settings-> Linking->Dead Code Stripping 设置成 YES
        4.3、Strip Linked Product 设置成YES
        4.4、symbols hidden by default选项设置为YES。
        4.5、Strip Style(all > non-global > debugging)

安装ios beta版

阅读数 1593

如何发布ios离线安装包

博文 来自: jia12216
没有更多推荐了,返回首页