apk瘦身的意義我就不多說(shuō)了,首先讓我們了解一個(gè)apk的組成部分,說(shuō)簡(jiǎn)單點(diǎn),一個(gè)apk文件就是包含一些文件的壓縮包。作為開(kāi)發(fā)者,我們通過(guò)使用unzip命令解壓這個(gè)apk文件一探apk的內(nèi)部結(jié)構(gòu)。下面的文件結(jié)構(gòu)就是我們使用unzip .apk1這個(gè)命令所獲得的:
了解完apk的組成部分后,apk瘦身我們大致可以從這幾方面下手: 1 減少java代碼 2 減少資源文件 3 減少native_code
所以我們得養(yǎng)成良好的編程習(xí)慣,刪除不必要的代碼和重復(fù)無(wú)用的一些資源文件,比如圖片,xml等。盡可能重用一些資源。但是如果我們是接手別人項(xiàng)目或者之前習(xí)慣不好,而導(dǎo)致太過(guò)臃腫等問(wèn)題,這時(shí)候我們可以借助一些工具。
使用 Proguard
Proguard 是一個(gè)很強(qiáng)悍的工具,它可以幫你在代碼編譯時(shí)對(duì)代碼進(jìn)行混淆,優(yōu)化和壓縮。它有一個(gè)專門用來(lái)減少apk文件大小的功能叫做 tree-shaking。Proguard 會(huì)遍歷你的所有代碼然后找出無(wú)用處的代碼。所有這些不可達(dá)(或者不需要)的代碼都會(huì)在生成最終的apk文件之前被清除掉。Proguard 也會(huì)重命名你的類屬性,類和接口,然整個(gè)代碼盡可能地保持輕量級(jí)水平。
也許現(xiàn)在你會(huì)認(rèn)為 Proguard 是一個(gè)相當(dāng)有效地工具。但是能力越大,責(zé)任也就越大。現(xiàn)在許多開(kāi)發(fā)這認(rèn)為Proguard有點(diǎn)讓人不省心,因?yàn)樗鼤?huì)重度依賴反射。哪些類或者屬性需要被處理或者不能處理都要開(kāi)發(fā)者對(duì) Proguard 進(jìn)行配置。
使用 Lint
Proguard 只會(huì)對(duì) Java 代碼起作用,那么對(duì)哪些資源文件呢?比如一張圖片my_image在res/drawable文件夾中,沒(méi)有被使用,Proguard 只會(huì)移除掉R類中的引用,但是圖片依然還在文件夾中。
Lint 一個(gè)靜態(tài)的代碼分析器,你只需通過(guò)調(diào)用./gradlew lint這個(gè)簡(jiǎn)單地命令它就能幫你檢查所有無(wú)用的資源文件。它在檢測(cè)完之后會(huì)提供一份詳細(xì)的資源文件清單,并將無(wú)用的資源列在“UnusedResources: Unused resources” 區(qū)域之下。只要你不通過(guò)反射來(lái)反問(wèn)這些無(wú)用資源,你就可以放心地移除這些文件了。
Lint 會(huì)分析資源文件(比如/res文件夾下面的文件) ,但是會(huì)跳過(guò) assets 文件 (/assets文件夾下面的文件)。事實(shí)上assets 文件是可以通過(guò)它們的文件名直接訪問(wèn)的,而不需要通過(guò)Java引用或者XML引用。因此,Lint 也不能判定某個(gè) asset 文件在項(xiàng)目中是否有用。這全取決于開(kāi)發(fā)者對(duì)這個(gè)文件夾的維護(hù)了。如果你沒(méi)有使用某個(gè)asset 文件,那么你就可以直接清除這個(gè)文件。
對(duì)資源文件進(jìn)行取舍:
這里主要涉及到屏幕適配的圖片問(wèn)題,可以根據(jù)我們產(chǎn)品用戶的層次來(lái)進(jìn)行適配,現(xiàn)在市場(chǎng)上大多數(shù)手機(jī)都是1280 * 800 以上的,我們只需適配一兩套圖片即可,我通常用的都是xhdpi。