Android的APPT工具會優化PNG嗎?

轉載請註明出處:http://www.jianshu.com/p/cc17d18c3447

本篇文章翻譯自谷歌出的優化視頻裏面的光頭佬(Colt McAnlis),原文地址需翻牆, 以下正文:

Dan的問題:Android程序在構建期間會對PNG圖片進行優化嗎?

答案是:會的,安卓的工具鏈確實會在構建期間對PNG做一些優化。你可以看看官方文檔

AAPT工具可能會在構建期間自動對res/drawable/文件夾下的圖片資源做無損壓縮。例如,一張真彩色(RGB)的PNG圖片,如果它實際需要的顏色不大於256種,那麼就有可能會被轉換成一張8位的調色板圖片(PNG8)。轉換之後的圖片質量未減卻只佔用更小的內存。所以需要注意一點,在這個目錄下的二進制圖像在構建期間可能會被改變。

Hmm..這倒不錯,<256顏色的的圖片會被轉換成索引模式,但這就完了嗎?欲知詳情,閱讀源碼才知道。

APPT工具對PNG圖片做了什麼

Android系統其中的一個好處是它的大部分工具都是開源的,我們可以直接看AAPT的源碼,看看它到底做了什麼。在png.cpp文件裏定位到analyze_image方法,我們可以看到它會做三個優化檢查:

  1. 每個像素都是 R == G == B (grayscale 灰度)
  2. 每個像素都是 A == 255 (opaque 全透明)
  3. 是否有超過256種不同的RGBA顏色

所以APPT會加載PNG圖片,判斷它是否可以被轉成灰度格式的圖片,判斷它是否是全透明的,或判斷它是否可以被轉成一張索引圖。這就是AAPT乾的事。

這些檢測是很有意義的,因爲實際上APK裏的大部分PNG文件通常都是灰度圖,全透明,或有限顏色的圖片。在有能力知道這些圖片的格式,並把它們轉成更小的PNG文件,何樂而不爲呢。

能否讓APPT做得更多?

可能更有趣的是,APPT有哪些事它沒有做:

A: 那些會改變圖片視覺效果的處理(可能會降低圖片的質量)
B: 那些比改變色彩模式更先進的處理

這就是爲什麼我上一篇文章討論使用更先進的工具的原因。使用這些先進的工具幫你減少PNG文件的大小,這是AAPT沒辦法幫你做的。

警告

重要的事情說三遍:當今的數據壓縮算法,遞歸數據壓縮是不可能的!!!遞歸數據壓縮是不可能的!!!遞歸數據壓縮是不可能的!!!。如果你對數據壓縮過一次,然後想再壓縮一次,最好的情況是數據大小不變,但通常情況會得到一個更大的數據。

所以,如果你在把PNG圖片扔給AAPT前已經做了一次優化,那麼最終可能會變得更大,大概大10%。這似乎不太正常:你都已經花了那麼多時間壓縮了你的PNG圖片了,它們後來怎麼還能變大呢:\

解決這個問題的辦法是在Gradle文件裏用cruncherEnabeled選項去掉對PNG文件的處理:

aaptOptions {
    cruncherEnabled = false
}

這個選項會關掉APPT對你APK裏非.9圖片的優化。(我還沒發現APPT會對.9圖片做什麼處理…)

最後總結,你可以用自己的優化工具儘可能的把PNG優化得更小,然後記得關掉APPT工具的處理就好。

PS:由於文人水平有限,如有翻譯得不好的地方,請留言討論。
PPS:CSDN的圖片註釋沒顯示出來,可以到我簡書的博客看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章