随着客户端业务的增多和业务的更新,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. JavaScript:int string 相互转化

    A.把int型转换成string型 (1) var   x=100    a   =   x.toString()      (2) var   x=100;    a   =   x   +&quo ...

  2. MongoDB3.4安装配置以及与Robomongo1.1的连接——解决Authentication Failed导致的不能连接问题

    本文环境:win10(64)+MongoDB(3.4.5)+Robomongo(1.1) 目录: MongoDB的安装 MongoDB的配置 Robomongo的安装以及与MongoDB的连接 一些新 ...

  3. C#使用HttpClient获取Location

    之前使用HttpWebRequest的时候,只需要设置HttpWebRequest对象的AllowAutoRedirect属性值为false即可在Respomse的Header中获取Location: ...

  4. 安装完jdk配置环境变量

    (1)新建->变量名"JAVA_HOME",变量值"C:\Java\jdk1.8.0_05"(即JDK的安装路径) (2)编辑->变量名" ...

  5. 【模板】51Nod--1085 01背包

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...

  6. java8之lambda表达式(1)-基本语法

    lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...

  7. Prerequisite check "CheckActiveFilesAndExecutables" failed.

    错误日志: [Aug , :: AM] Prerequisite check "CheckActiveFilesAndExecutables" failed. The detail ...

  8. Java框架概述

    一.框架的意义 1.什么是框架? 框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现.有了框架,我们就可以集中精力进行业务逻辑的开发而不用去关心它的技术实现以及一些辅助的业务逻辑. ...

  9. python进阶(5):组合,继承

    前两天我们认识了面向对象也对面向对象有了初步的认识今天我们先会说一点组合的进阶,今天重点是继承. 一.组合 组合只有一个例子因为组合只作为上一章的补充内容 #老师 课程 生日 class Course ...

  10. 开源社群系统ThinkSNS+安装部署演示视频!

    社群系统TS+一期版本发布之后,很多小伙伴们反馈安装部署有些困难,那么今天由我们的颜值与技术实力担当乔斌大佬通过录制视频的形式,给大家演示一下部署的整个过程,录制过程中有些杂音,请各位尽情谅解,后续我 ...