前沿

很早之前写过一篇相关文章,不过博客主机上跑路了之后数据没了,凭着记忆补了下相关资料

ipa安装包瘦身

  1. 清理无用图片,图片压缩(PNGWebPJPG),处于某种不可抗拒的原因,导致有部分3X图没有被App Thining处理,这部分3x图是否可以删除只用2x图。(这一条一般收益很小,因为大部分团队都会注意)

  2. 特殊字体文件

  3. 如果有自己封装的库,检查下静态库和动态库情况,不要该打静态库的不注意输出的是动态库,这个我们之前犯过错

  4. App Code重构,找出无用代码(这个工作量大,但是对下面text段也有好处)

  5. 检查编译优化设置(有些设置项最好检查下因为老工程很多都是以前老版本Xcode建立的,会导致设置还是以前老Xcode的设置),可参考:

    • BuildSettings->Optimization LevelXcode默认设置 为“Fastest ,Smallest”,保持默认即可。
    • Build Settings-> Linking->Dead Code Stripping 设置成 YES
    • Deployment Postprocessing 设置成YES
    • Strip Linked Product 设置成YES
    • 工程的Enable C++ ExceptionsEnable Objective-C Exceptions选项都设置为NO。手动管理异常。
    • symbols hidden by default选项设置为YES
    • 所有没有使用C++动态特性的lib库(搜索工程没有使用dynamic_cast关键字) Enable C++ Runtime Types 选项设置为NO

如果是OCSwift混编工程还可以

  1. 有逐帧动画的图片资源改成用lottie,逐帧动画的图片还是挺大的
  2. Swift与OC混编ipa包增大

如果工程还有Pod+Carthage 的情况,在Build Phases里面加上一个脚本:

#这个脚本要在copy pods Resources执行之前执行,不然会导致打包出来的asserts.car会附加Checkouts目录下的xcasserts
carthageCheckoutsPath=${SRCROOT}/Carthage/Checkouts
echo carthageCheckoutsPath is :${carthageCheckoutsPath}
if [ -d "${carthageCheckoutsPath}" ]; then
rm -rf ${carthageCheckoutsPath}
echo "removed ${carthageCheckoutsPath}"
else
echo "Checkouts not found"
fi

确认这个问题的方法是把打出来的包解压出来看,看看asserts.car里到底有些啥图片,有没有何项目无关的图片就知道了

text段(iOS7,8 text段不能超过60MB)

如果已经超过60MB,在不修改任何代码的情况下可以做以下几件事:

  1. 删除无用的代码文件(一个空文件占的text段很少记得是2KB,但是无用文件多了量还是可观)
  2. Optimization Level 等编译项优化:Build Settings -> Optimization Level 有几个编译优化选项,release 版应该选择 Fastest, Smalllest ,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
  3. Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Defaultrelease 版本应该设为 YES ,可以去除不必要的调试符号。Symbols Hidden by Default 会把所有符号都定义成 ”private extern” 。( 这些选项目前都是 XCoderelease 的默认选项,但旧版 XCode 生成的项目可能不是,可以检查一下 )
  4. Symbols Hidden by Defaultrelease 版本应该设为 YES

从功能出发

走到这一步是最万不得已的,text段大小问题如果一旦超过官方规定60MB或者已经贴近这个值,会导致平台组(负责最终整合的团队)隔一段时间就需要站出来解决这个问题,因为平台组的小伙伴不确定是哪个业务组提交新功能里面的代码又增大了,查找起来费时费力,沟通成本也很大。

首先明确一点功能不支持某个架构或者iOS系统版本,并不代表这部分用户永远下不了我们的产品,能在App Store上下载到,只不过是停留在某一个版本。

这里需要结合自己已有用户数据以及新增用户趋势来取舍

譬如:如果最低支持iOS8,那么iPhone 4S,iPhone 5,iPhone 5C这部分用户在某些功能点上是否本来就已经很卡近乎到不能用的地步,最典型的就是直播场景(因为直播场景会涉及到很多SDK)

那么是否可以考虑,在这部分功能上做让步直接将相应SDK的arvm7架构剥离掉。
  • 有可能剥离还是会导致text段贴近60MB,是否考虑在iOS8做一个最终版本,让iOS8用户就停留在这边版本,后续版本最低从iOS9开始,这个方案需要综合各方面数据考虑。

iOS ipa包瘦身,iOS8及以下text段超60MB的更多相关文章

  1. iOS ipa包瘦身------删除无用图片资源

         随着客户端业务的增多和业务的更新,App包大小越来越大,优化包大小是迫在眉睫,客户端需要优化的地方也有很多,本期主要讲如何查找无用图片并且删除无用图片的方法.      方案1:(暴力方法) ...

  2. springboot 打包插件去除jar包瘦身

    1.pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>s ...

  3. maven war包打包去除jar包瘦身

    1.pom文件配置 <!-- war包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  4. iOS - Bitcode App 瘦身中间码

    1.Bitcode 随着 Xcode7 的发布,Apple 提供了一项新的技术来支持 App 瘦身功能,那就是 Bitcode. 1.BitCode 是什么 Bitcode is an interme ...

  5. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  6. iOS 安装包瘦身 (上篇)

    本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...

  7. iOS 安装包瘦身(下篇)

    本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...

  8. SpringBoot Jar包瘦身 - 跟大文件说再见!

    前言 SpringBoot部署起来配置非常少,如果服务器部署在公司内网,上传速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼.就是 编译出来的 Jar 包很大,如果工程引入了许多开 ...

  9. iOS UIViewController的瘦身计划

    代码的组织结构,以及为何要这样写. 那些场景适合使用子控制器,那些场景应该避免使用子控制器? 分离UITableView的数据源和UITableViewDataSource协议. MVVM的重点是Vi ...

随机推荐

  1. PostFix添加多个端口

    /usr/local/*/config/postfix/master.cf 在/etc/services中搜索smtp,复制,添加smtp2<与上面一步对应起来的服务名>,后面为需要添加的 ...

  2. hdu-1878(欧拉回路)

    题目链接:传送门 思路:就是判断无向图的欧拉回路的两个条件:(1)连通性(2)点的度数是偶数 注意:两个条件一同时满足才行. #include<iostream> #include< ...

  3. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十六之铭文升级版

    铭文一级: linux crontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式: */1 * * * * crontab -e */1 * * * ...

  4. 【SP1811】 LCS - Longest Common Substring(SAM)

    传送门 洛谷 Solution 考虑他要求的是最长公共子串对吧,那么我们对于一个串建后缀自动机,另一个串在后缀自动机上面跑就是了. 复杂度\(O(n+m)\)的,很棒! 代码实现 代码戳这里

  5. Scala微服务架构 一

    因为公司的一个项目需求变动会非常频繁,同时改动在可控范围内,加上产品同学喜欢一些超前思维,我们的CTO决定提前开启八门,使用微服务架构. 划重点 微服务架构主要特点: ==独立组件(自主开发升级)== ...

  6. 构建一个Gods Eye Android应用程序:第1部分 – 收集已安装的Android应用程序

    首先问候一下我的黑客伙伴们,在之前的Introduction to Amunet 教程中,我们了解到Amunet可能是一个间谍Android应用程序. 我不浪费太多时间因而直入主题. 在本教程中,我们 ...

  7. 写一个shell 快速启动停止你的微服务吧

    在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在 ...

  8. Win10下音频设备无法播放音乐问题定位

    最近一直在调试音频设备,由于音频设备需要在不同的采样率下面转换,所以会经常导致我的win10无法播放和录音. 刚开始在网上搜了相关的知识,但是一直没找到有效的解决方案.后来,无奈之下,使用了微软的声音 ...

  9. vue 去哪网项目 学习笔记(一)

    启动项 mian.js 是整个项目的入口程序 定义局部组建 components 是定义的局部组建 template 渲染app里的内容 单文件组建 单文件组建是以vue 结尾的内容 app组建的内容 ...

  10. 6个免费的C++图形和游戏库

    继上一篇,本篇同样出自zoomzum.com,具体可见http://zoomzum.com/6-free-c-graphics-and-game-libraries/,介绍了6个免费的C++图形和游戏 ...