iOS安装包瘦身总结
使用lipo工具拆分单架构
lipo "originalExecutable" -thin arm64 -output "arm64Executable"
使用assetutil工具拆分不同倍图的asset
xcrun --sdk iphoneos assetutil --scale 3 --output "$targetFolder/Assets3.car" "$sourceFolder/Assets.car"
// Pods-targetName-resource.sh
install_resource "${PODS_ROOT}/APodName/APodName.framework/APodName.bundle"
install_resource "${PODS_ROOT}/BPodName/BPodName.framework/BPodName.xcassets"
install_resource "${PODS_ROOT}/BPodName/BPodName.framework/xxx.png"
targetPicture=".imageset"
function searchOneDir(){
cd $1
path=`pwd`
for item in `ls`; do
if [[ -d "${path}/${item}" ]] && [[ ! "${filterList[@]}" =~ "${item}" ]]
then
if [[ "${item}" =~ "${targetPicture}" ]]
then
echo "${path}/${item}"
echo "内部:$item"
itemSub="${path}/${item}"
appContainPictureList+=(${itemSub})
else
if [[ -d ${item} ]]
then
searchOneDir "$item"
fi
fi
fi
done
cd ..
path=`pwd`
echo "path2: $path" return 0;
}
targetAssetDir=".xcassets"
targetPicture=".imageset" appContainPictureList=()
UnUsedPictureList=()
UsedPictureList=()
function checkMachOFile() {
res=`strings $1` for assertName in ${appContainPictureList[@]}; do
if [[ ! "$res" =~ "$assertName" ]]
echo "$assertName"
then
UnUsedPictureList[${#UnUsedPictureList[*]}]=$assertName
else
UsedPictureList[${#UsedPictureList[*]}]=$assertName
fi
done
}
主工程Release
Optimization Level :-Oz
Framework工程
Optimization Level :-Oz
主工程Release
Deployment Postprocessing :YES
Strip Linked Product :YES
Strip Style :All Symbols(剥离所有符号表和重定向信息) Framework工程
Deployment Postprocessing :YES
Strip Linked Product :YES
Strip Style :Non-Global Symbols(剥离包括调试信息等非全局的符号,保留外部符号)
主工程Release
Symbols Hidden by Default :Yes
Framework工程 静态库/动态库
Symbols Hidden by Default :NO
主工程
Dead Code Stripping :Yes
主工程
Asset Catalog Compiler->Optimization设置为space
动态库工程:
1设置当遇到未定义的函数时,动态查找APP主二进制符号表。
2 关闭bitcode
Other Linker Flags -> -undefined dynamic_lookup
Enable Bitcode -> No
3导出动态库需要调用的外部符号,写到一个文件exported_symbols内
nm -u xxx.framework/xxx > exported_symbols.txt
APP工程:
1配置需要导出exported_symbols文件内的所有符号,避免编译时动态库需要用到的符号被strip掉。
2关闭bitcode。
// exported_symbols.txt是需要被导出的符号文件路径
EXPORTED_SYMBOLS_FILE -> exported_symbols.txt
Enable Bitcode -> No
__attribute__((visibility("default"))) void MyFunction1() {}
__attribute__((visibility("default"))) void MyFunction2() {}
// objc-class.mm
Class class_initialize(Class cls, id inst) {
if (!cls->isInitialized()) {
initializeNonMetaClass (_class_getNonMetaClass(cls, inst));
}
return cls;
} // objc-runtime.h
#define RW_INITIALIZED (1<<29)
bool isInitialized() {
return getMeta()->data()->flags & RW_INITIALIZED;
}
otool -v -s __DATA __objc_classrefs xxxMainClient #读取__DATA Segment中section为__objc_classrefs的符号
otool -v -s __DATA __objc_classlist xxxMainClient #读取__DATA Segment中section为__objc_classlist的符号
nm -nm xxxMainClient
iOS安装包瘦身总结的更多相关文章
- iOS安装包瘦身的那些事儿
在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...
- iOS 安装包瘦身(下篇)
本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...
- iOS 安装包瘦身 (上篇)
本文来自网易云社区 作者:饶梦云 1. 安装包组成 谈到 App 瘦身,最直接的想法莫过于分析一个安装包内部结构,了解其每一部分的来源.解压一个 ipa 包,拿到其 payload 中 app 文件的 ...
- Android APK安装包瘦身[转]
很显然,APK安装包越小越好.下面从代码,资源文件,使用策略几个方面简要介绍下: 代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs. 使用proguard混淆 ...
- Android App安装包瘦身计划
Android App安装包瘦身计划 Android App安装包体积优化: 理由, 指标和可以采用的方法. 本文内容归纳如下图: 为什么要安装包瘦身 安装包需要瘦身吗? 不需要吗? 安装包要瘦身的主 ...
- iOS ipa包瘦身,iOS8及以下text段超60MB
前沿 很早之前写过一篇相关文章,不过博客主机上跑路了之后数据没了,凭着记忆补了下相关资料 ipa安装包瘦身 清理无用图片,图片压缩(PNG换WebP和JPG),处于某种不可抗拒的原因,导致有部分3X图 ...
- iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明
iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...
- 如何减小ios安装包大小
以前的老文章了,搬到cnblog 更小的安装包意味着更快的下载安装速度,也往往意味着更快的加载运行速度,是优化ios应用的一个重要方面,本文主要参考<减小iOS应用程序的大小>,在实际测试 ...
- iOS - Bitcode App 瘦身中间码
1.Bitcode 随着 Xcode7 的发布,Apple 提供了一项新的技术来支持 App 瘦身功能,那就是 Bitcode. 1.BitCode 是什么 Bitcode is an interme ...
- 在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤
Xamarin 配置手册和离线包下载 http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安装 ...
随机推荐
- POJ:Arbitrage (搜索,汇率换算是否赚?)
POJ 2240 http://poj.org/problem?id=2240 题意:判断是否存在使得汇率增多的环 [任意一个点的汇率增多都可以] Floyd 简单变形 \(w[i][j] = max ...
- 国内pip源提示“not a trusted or secure host”解决方案
大家应该都知道怎么添加国内pip源(主要是豆瓣和阿里云),~/.pip/pip.conf文件配置大概如下(下面注释掉了豆瓣源): [global] # index-url = http://pypi. ...
- 骨牌摆放问题 POJ 2411(状态压缩DP)
题目: 给你\(n*m(1<=n,m<=11)\)的方格矩阵,要求用1*2的多米诺骨牌去填充,问有多少种填充方法. 比如下图是对于如下2x6的方格矩阵,可能的填充方案之一. 该如何使用动态 ...
- L2-008 最长对称子串 (回文子串 / DP / Manacher算法)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 2012年第三届蓝桥杯【C++省赛B组】
第一题:微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1 ...
- jdk1.8(java8)新特性
借鉴之:https://blog.csdn.net/qq_28410283/article/details/80601495 Lambda 表达式: //1.Lambda 表达式,也可称为闭包,它是推 ...
- 【调试】kdump原理及其使用方法
kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...
- MySQL 及调优
存储引擎的种类 MySQL 中存在多种存储引擎,比如: InnoDB 支持事务: 支持外键: 同时支持行锁和表锁. 适用场景:经常更新的表,存在并发读写或者有事务处理的业务场景. MyISAM 支持表 ...
- Laravel - 模板中的url
<!-- 1, url --> <a href="{{url('/')}}">跳转到主页</a> <!-- 2,action 方法 ...
- CSS : object-fit 和 object-position实现 图片或视频自适应
img { width: 100%; height: 300px; object-fit: cover; ...