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

时间:2021-08-03 17:43:11
     随着客户端业务的增多和业务的更新,App包大小越来越大,优化包大小的事情迫在眉睫,客户端需要优化的地方也有很多,本期主要讲如何查找无用图片并且删除无用图片的方法。
     方案1:(暴力方法)很简单写一个脚本把图片的名称在整个工程下查找即可,查不到就说明这张图片是无用的。(对于小的工程这样方案是可以的,但是对于工程大的项目查找太慢了)。
     方案2:把所有的赋值语句提取出来放到一个文件中,再把工程下面的图片名称获取出来在这个文件中查找,若查找不到则说明此图片是无用资源。由于工程中的图片全部放在了Images.xcassets文件夹下。下面的脚本是查找Images.xcassets目录下面的无用图片。若图片文件不是放在Images.xcassets文件夹下,稍微修改脚本就可以用,下面的脚本删除无用图片的思路同样适用于Android工程。
#!/bin/sh

programFilePath=$(cd "$(dirname "$0")"; pwd)
unusedCount=0
maybeUnusedCount=0 if [[ -z $programFilePath ]]; then
read -p "请输入工程的路径" programFilePath
fi check_files=`find $programFilePath -name '*.xib' -o -name '*.storyboard' -o -name '*.[mh]' -o -name '*.pch' -o -name '*.java' -o -name '*.xml' -o -name '*.js' -o -name '*.html'` for file in `echo $check_files | sed 's/\n/ /g'`
do
#iOS图片引用规则 :获取@符号的语句
grep -i "@\"" -A 0 "$file" | grep -v -e "--" >> maybeImageSentence.txt
done imageTextPath="$programFilePath/maybeImageSentence.txt" maybeUnusedImageFilePath="$programFilePath/maybeUnusedImage.txt"
if [ -f "$maybeUnusedImageFilePath" ]; then
rm -f "$maybeUnusedImageFilePath"
fi unusedImageFilePath="$programFilePath/unusedImage.txt"
if [ -f "$unusedImageFilePath" ]; then
rm -f "$unusedImageFilePath"
fi for png in `find $programFilePath -name '*.png'`
do
# 图片名称
match_name=`basename $png` suffix1="@2x.png"
suffix2=".9.png"
suffix3=".png"
suffix4="@3x.png" if [[ ${match_name/${suffix1}//} != $match_name ]]; then
match_name=${match_name%$suffix1}
elif [[ ${match_name/${suffix4}//} != $match_name ]]; then
match_name=${match_name%$suffix4}
elif [[ ${match_name/${suffix2}//} != $match_name ]]; then
match_name=${match_name%$suffix2}
else
match_name=${match_name%$suffix3}
fi dir_name=`dirname $png` if [[ $dir_name =~ .bundle$ ]] || [[ $dir_name =~ .appiconset$ ]] || [[ $dir_name =~ .launchimage$ ]]; then
continue
fi # 在imageset里面找
result=$(echo $dir_name | grep "imageset")
if [[ "$result" == "" ]]; then
continue
fi referenced=false if grep -q "$match_name" "$imageTextPath"; then
referenced=true
fi contaT=$(echo $match_name | grep "[0-9]")
if [[ "$contaT" != "" ]]; then
maybeUnusedCount=`expr $maybeUnusedCount + 1`
echo "$png" >> maybeUnusedImage.txt
continue
fi if ! $referenced ; then
unusedCount=`expr $unusedCount + 1`
echo "$png" >> unusedImage.txt
# 打开下面的语句直接删除图片目录 例如icon_arrow_bluesmall.imageset
# rm -rf $dir_name
fi done rm maybeImageSentence.txt echo "Total $unusedCount unusedImage files ->imagePath store unusedImage.txt"
echo "Total $maybeUnusedCount maybeUnusedImage files ->imagePath store maybeUnusedImage.txt"

使用方法:首先把上面的代码复制到一个文件中命名为 unused-image.sh,把这个文件放在目标工程下面执行   sh unused-image.sh 命令即可。会生成两个文件 unusedImage.txt和 maybeUnusedImage.txt。

方案2的缺点就是无法判断图片名称带有数字的无法确定是否是无用资源如图片名称为bg_card_lower_1_2@2x.png,此类命名的图片输出到maybeUnusedImage.txt这个文件中,需要手动的排查删除。

原创文章,欢迎转载,转载请标注,谢谢大家!!!!!!!

原创文章,欢迎转载,转载请标注,谢谢大家!!!!!!!

原创文章,欢迎转载,转载请标注,谢谢大家!!!!!!!

================================================================

若有疑问请加本人QQ:610774281 微信:stephenli225。 一起探讨一起进步。。。。

iOS ipa包瘦身------删除无用图片资源的更多相关文章

  1. iOS ipa包瘦身,iOS8及以下text段超60MB

    前沿 很早之前写过一篇相关文章,不过博客主机上跑路了之后数据没了,凭着记忆补了下相关资料 ipa安装包瘦身 清理无用图片,图片压缩(PNG换WebP和JPG),处于某种不可抗拒的原因,导致有部分3X图 ...

  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安装包瘦身的那些事儿

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

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

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

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

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

  7. iOS - Bitcode App 瘦身中间码

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

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

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

  9. iOS UIViewController的瘦身计划

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

随机推荐

  1. Linux查看可执行程序所在路径

    首先通过命令获得进程PID:如4285,然后执行下述命令 cd /proc/4285 ls -l 或直接ls -l /proc/4285 其中exe所在行即为可执行文件的全路经.如下图所示:

  2. Oracle 收集统计信息11g和12C在差异

    Oracle 基于事务临时表11g和12C下,能看到临时表后收集的统计数据,前者记录被清除,后者没有,这是一个很重要的不同. 关于使用企业环境12C,11g,使用暂时表会造成时快时慢.之前我有帖子ht ...

  3. DBA之路

    对于一个励志要成为DBA的人,虽然还有不足,梦想还是要有的,万一实现了呢.做一个关于DBA成长之路的相关目录,作为灯塔. --------------------------------------- ...

  4. newInstance&lpar;&rpar;和new&lpar;&rpar;的区别

    转载:http://www.jobui.com/mianshiti/it/java/7148/ newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何pub ...

  5. 如何重写Java中的equals方法

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  6. 2017-10-5模拟赛T2 小Z爱排序&lpar;sorting&period;&ast;&rpar;

    Description Solution 比赛时找到了规律,但是没有证出来……(当然最后还是AC了……) 显然没有被操作的数在排好序的序列中一定是连续的一段. 所以,没有被操作的数一定从左到右连续地递 ...

  7. hibernate一对多映射文件的配置

    其中一个Customer对应多个LinkMan Customer的映射文件 Customer.hbm.xml-------------->一对多 <?xml version="1 ...

  8. Duplicate复制数据库并创建物理StandBy(pfile版本)

    1设定环境如下: Primary数据库 IP 172.17.22.16 SID orcl Standby数据库 IP 172.17.22.17 SID orcl 设置提示,以区分操作的位置 prima ...

  9. &lbrack;BJOI2014&rsqb;大融合&lpar;LCT&rpar;

    题面 luogu bzoj是权限题.. 题解 \(LCT\)维护子树信息 因为\(LCT\)中有一些虚子树,\(splay\)维护不了. 所以要新开一个数组来记录 然后注意\(link\)时 是先\( ...

  10. Linux 不杀进程的情况下,如何释放磁盘资源

    最近项目组人员反馈一个问题:即磁盘空间满了,但是并没看到有什么文件占用空间: [root@xxxx home]# df -h Filesystem Size Used Avail Use% Mount ...