前言
之前我簡單介紹了關於svg圖片瘦身的問題,在公司,瘦身這個問題是我提出來的,所以這鍋我背了。公司專案是32.6M,我給自己的要求就是低於20M。上週花了一個星期瘦身,至於為什麼花了一週,主要是svg適配問題我被搞矇蔽了。然後發現還要改大量程式碼,想想也就算了,又換了另一種瘦身方法。 很多人是因為這標題而來的,怎麼可能,32.6M的居然可以變成13.6M。下面容我慢慢道來。
APK結構介紹
classes.dex
classes.dex是Java原始碼編譯後生成的java位元組碼檔案。但由於Android使用的dalvik虛擬機器與標準的java虛擬機器是不相容的,dex檔案與class檔案相比,不論是檔案結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex檔案。Android模擬器中提供了一個dex檔案的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要檢視的dex檔案用adb push上傳的模擬器中,然後通過adb shell登入,找到要檢視的dex檔案,執行dexdump xxx.dex。另,有人介紹到Dedexer是目前在網上能找到的唯一一個反編譯dex檔案的開源工具,需要自己編譯原始碼。
clases2.dex
同上,上面的是對你的java檔案的編譯,這個是對你所匯入的jar檔案的編譯。
resources.arsc
編譯後的二進位制資原始檔
AndroidMainfest.xml
該檔案是每個應用都必須定義和包含的,它描述了應用的名字、版本、許可權、引用的庫檔案等等資訊,如要把apk上傳到Google Market上,也要對這個xml做一些配置。
assets
assets目錄可以存放一些配置檔案(比如webview本地資源、圖片資源等等),這些檔案的內容在程式執行過程中可以通過相關的API獲得。
lib
lib目錄下的子目錄armeabi存放的是一些so檔案。
這個地方多講幾句,都是在開發過程中摸索出來的。eclipse在打包的時候會根據檔名的命名規則(lib**.so)去打包so檔案,開頭和結尾必須分別為“lib”和“.so”,否則是不會打包到apk檔案中的。其他非eclipse開發環境沒有測試過。如果你是用SDK和NDK開發的話,這部分很重要,甚至可以通過把一些不是so檔案的檔案通過改名打包到apk中,具體能幹些什麼那就看你想幹什麼了!
META-INF
META-INF目錄下存放的是簽名資訊,用來保證apk包的完整性和系統的安全。
Res目錄
這是我們存放xml drawable string color等等一些資原始檔。
32.6M——13.6M
首先,我先宣告下,不然我怕會被打,目前13.6M的還在測試中,因為機型問題,目前沒法測試。現在穩定包的大小是在19.8M——20.4M。
混淆和去除無用資源 在gradle使用minifyEnabled進行Proguard混淆的配置,可大大減小APP大小
刪除無用圖片資源
我們公司專案到現在逸代了2年了。可想而知,程式碼的冗餘太多了。版本更新會導致很多資源用不到,然後依舊存在包中。這事我是交給老大的做的,畢竟專案他最熟。於是乎刪了差不多100多張圖片。因為做了圖片適配。所以刪除的圖片資源差不多是在400張的樣子。這樣。我們的app包從32.6M變成了26.8M。記得剛打包測試的時候,測試經理來個句。你們這包不對啊,怎麼少了6、7M。然後就回了是正常的,說我這邊搞完差不多會在20M左右。測試經理:什麼?在瘦個20M。這麼誇張。我:……..好了,不扯了,跑題了。
刪除無用resource資源 這個和上面的肯定不一樣的。我這邊主要還是指xml。首先,我們需要點選Analyze——>Run Inspection by Name…
繼續輸入:unused resource
直接點ok,然後等待:
看來公司專案還能少個300k~。你們對比著你們的專案一個個的刪就行了。
圖片瘦身之熊貓大法
前面我也說了。用svg適配改的程式碼量太大了。於是乎我轉用了熊貓瘦身,也就是tinypng。官方網站:https://tinypng.com。下面我從官網給大家介紹下tinypng:
TinyPNG有什麼作用?
TinyPNG使用智慧有失真壓縮技術來減小 PNG檔案的檔案大小。通過選擇性地減少影像中的顏色數量,需要較少的位元組來儲存資料。效果幾乎不可見,但它使檔案大小有很大的差別!
為什麼要使用TinyPNG?
PNG是有用的,因為它是唯一廣泛支援的格式,可以儲存部分透明的影像。格式使用壓縮,但是檔案仍然可能很大。使用TinyPNG縮小您的應用程式和網站的影像。它將使用更少的頻寬和更快的載入。
它是如何工作的?
當您上傳PNG(行動式網路圖形)檔案時,影像中的相似顏色會合並。這種技術被稱為“量化”。通過減少顏色數量,24位PNG檔案可以轉換為更小的8位索引彩色影像。所有不必要的後設資料也會被刪除。結果:更好的PNG檔案100%支援透明度。有你的蛋糕,吃它了!
它支援到處嗎?
TinyPNG生成的檔案在所有現代瀏覽器(包括移動裝置)上完美顯示。仍然需要支援Internet Explorer 6?它通常忽略PNG透明度並顯示實心背景顏色。使用TinyPNG的背景變得透明瞭。二進位制透明度沒有任何解決方法!
你為什麼建立Tinypng?
我們經常使用PNG影像,但對載入時間感到失望。我們建立TinyPNG在我們的使命,使我們自己的網站更快,更有趣的使用最好的壓縮。在2014年,我們新增了JPEG影像的智慧壓縮,並在2016年,我們新增了對動畫PNG的支援。
使用方法
我們看到官網的介紹,在這邊上傳你的jpg或者png 一次最多20張,每張最大5MB。接下來我們隨便來個測試:
從1.4M變成570k。縮了60%。可想而知,熊貓的強大。想要一次上傳全部,這tm就尷尬了。一年25美元。你們可以讓你們的UI給你們圖片的時候就用Tinypng壓縮在發過來。不過有的公司就給你個設計稿。那就得自己親自下手咯~
熊貓大法VS SVG大法
我對比了熊貓和svg的壓縮,前者app'大小是在20.4M,後者是在19.8M。下面上圖給你們對比下:
19.8M——13.6M
前面我也說了,這個目前還在測試機型。所以穩定性還沒保證。先說說是如何做的把。我們公司專案用到了百度地圖SDK。所有用到了so庫。
mips、armeabi、armeabi-v7a和x86到底是什麼
mips:MIPS是世界上很流行的一種RISC處理器。MIPS的意思是“無內部互鎖流水級的微處理器”(Microprocessor without interlocked piped stages), 其機制是儘量利用軟體辦法避免流水線中的資料相關問題。
armeabi:預設選項,將建立以基於 ARM* v5TE 的裝置為目標的庫。 具有這種目標的浮點運算使用軟體浮點運算。 使用此 ABI (二進位制介面) 建立的二進位制程式碼將可以在所有 ARM* 裝置上執行。所以armeabi通用性很強。但是速度慢
armeabi-v7a:建立支援基於 ARM* v7 的裝置的庫,並將使用硬體 FPU 指令。armeabi-v7a是針對有浮點運算或高階擴充套件功能的arm v7 cpu。 x
86:支援基於硬體的浮點運算的 IA-32 指令集。x86是可以相容armeabi平臺執行的,無論是armeabi-v7a還是armeabi,同時帶來的也是效能上的損耗, 另外需要指出的是,打包出的x86的so,總會比armeabi平臺的體積更小。
小結
如果專案只包含了 armeabi,那麼在所有Android裝置都可以執行; 如果專案只包含了 armeabi-v7a,除armeabi架構的裝置外都可以執行; 如果專案只包含了 x86,那麼armeabi架構和armeabi-v7a的Android裝置是無法執行的; 如果同時包含了 armeabi, armeabi-v7a和x86, 所有裝置都可以執行,程式在執行的時候去載入不同平臺對應的so,這是較為完美的一種解決方案,同時也會導致包變大。 所以,這個還是需要根據使用者的機型來判斷,目測我這邊還在測試中,如果沒問題。大小基本就在13.6M左右了。
總結
我們需要對APP瘦身的時候需要了解他的結構,就像我第一次做瘦身的時候,雖然解決了,不過對各種問題都是屬於一臉矇蔽的情況。所以,我們需要要了解apk包下每個檔案都是幹嘛的,做了什麼,是否有用。只要你用心去做,就一定可以解決。就像我當初給自己的目標是小於20M一樣。雖然現在和20M差不多。不過如果那邊測試可以通過。那便是13.6M而不是20M。希望我的方法能幫助到你們。
本文寫於一年半前,作者:馬雲飛,原文連結:https://blog.csdn.net/sw950729/article/details/64919051
更多文章請關注我的公眾號: