轉載請註明出處:http://www.jianshu.com/p/cc17d18c3447
本篇文章翻譯自谷歌出的優化視頻裏面的光頭佬(Colt McAnlis),原文地址需翻牆, 以下正文:
答案是:會的,安卓的工具鏈確實會在構建期間對PNG做一些優化。你可以看看官方文檔。
AAPT工具可能會在構建期間自動對res/drawable/文件夾下的圖片資源做無損壓縮。例如,一張真彩色(RGB)的PNG圖片,如果它實際需要的顏色不大於256種,那麼就有可能會被轉換成一張8位的調色板圖片(PNG8)。轉換之後的圖片質量未減卻只佔用更小的內存。所以需要注意一點,在這個目錄下的二進制圖像在構建期間可能會被改變。
Hmm..這倒不錯,<256顏色的的圖片會被轉換成索引模式,但這就完了嗎?欲知詳情,閱讀源碼才知道。
APPT工具對PNG圖片做了什麼
Android系統其中的一個好處是它的大部分工具都是開源的,我們可以直接看AAPT的源碼,看看它到底做了什麼。在png.cpp文件裏定位到analyze_image方法,我們可以看到它會做三個優化檢查:
- 每個像素都是 R == G == B (grayscale 灰度)
- 每個像素都是 A == 255 (opaque 全透明)
- 是否有超過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的圖片註釋沒顯示出來,可以到我簡書的博客看。