zoukankan      html  css  js  c++  java
  • iOS ipa包瘦身---删除无用图片资源

         随着客户端业务的增多和业务的更新,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/
    / /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。 一起探讨一起进步。。。。

  • 相关阅读:
    EasyNVR RTSP转RTMPHLS流媒体服务器前端构建之:使用BootstrapPagination以分页形式展示数据信息
    EasyNVR H5无插件直播方案前端构建之:videojs初始化的一些样式处理
    EasyNVR H5无插件直播方案前端构建之:如何播放HLS
    EasyNVR RTSP转RTMP/HLS流媒体服务器前端构建之:bootstrap弹窗功能的实现
    EasyNVR H5无插件直播方案前端构建之:如何区分PC端和移动端
    EasyNVR RTSP转RTMPHLS流媒体服务器前端构建之:通过接口获取实时信息
    实现RTSP摄像机进行网页直播和微信直播的技术方案
    EasyNVR RTSP转RTMPHLS流媒体服务器前端构建之:bootstrapdatepicker日历插件的实时动态展现
    EasyNVR H5无插件直播方案前端构建之:播放界面添加实时云台控制界面
    EasyNVR H5无插件直播方案前端构建之:实时直播的四分屏的前端展示
  • 原文地址:https://www.cnblogs.com/lidaojian/p/7533441.html
Copyright © 2011-2022 走看看