热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

随着客户端业务的增多和业务的更新,App包大小越来越大,优化包大小的事情迫在眉睫,客户端需要优化的地方也有很多,本期主要讲如何查找无用图片并且删除无用图片的方法。方案1
     随着客户端业务的增多和业务的更新,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。 一起探讨一起进步。。。。


推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
koglum
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有