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