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/\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。 一起探討一起進步。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM