android app性能优化_Android性能优化之Apk 瘦身优化
瘦身
APK 分析工具
ApkTool 反編譯工具
官網:https://ibotpeaches.github.io/ApkTool apktool d students.apk
Analyze apk
Android studio 2.2之后使用 - 查看apk組成大小,各資源占比 - 查看dex文件組成 - 可以進行apk對比
通過Analyze app分析(打開方式:Android Studio下 ——> Build——> Analyze app)
classyshark 二進制檢查工具
https://github.com/google/android-classyshark 支持多種格式:apk,jar,class,so等
nimbledroid app 性能指標系統
https://nimbledroid.com/ 可以通過上傳apk得知: - 文件大小及排行 - Dex方法數、SDK方法數 - 啟動時間、內存等
APK 組成
APK包結構如下:
- lib/:包含特定于處理器軟件層的編譯代碼。該目錄包含了每種平臺的子目錄,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多數情況下我們可以只用一種armeabi-v7a。
- assets/:包含應用可以使用AssetManager對象檢索的應用資源。
- res/:包含未編譯到的資源 resources.arsc,主要有圖片資源文件。
- META-INF/:包含CERT.SF和 CERT.RSA簽名文件以及MANIFEST.MF 清單文件。
- resources.arsc:包含已編譯的資源。該文件包含res/values/ 文件夾所有配置中的XML內容。打包工具提取此XML內容,將其編譯為二進制格式,并將內容歸檔。此內容包括語言字符串和樣式,以及直接包含在resources.arsc文件中的內容路徑 ,例如布局文件和圖像。
- classes.dex:包含以Dalvik / ART虛擬機可理解的DEX文件格式編譯的類。
- AndroidManifest.xml:包含核心Android清單文件。該文件列出應用程序的名稱,版本,訪問權限和引用的庫文件。該文件使用Android的二進制XML格式。
對lib文件目錄進行瘦身
往往進行NDK開發的時候,so文件都比較大,將ndk修改為如下:
ndk{//設置支持的so庫架構abiFilters "armeabi-v7a"}armeabi-v7主要不支持ARMv5(1998年誕生)和ARMv6(2001年誕生).
而許多基于 x86 的設備也可運行 armeabi-v7a 和 armeabi NDK 二進制文件。對于這些設備,主要 ABI 將是 x86,輔助 ABI 是 armeabi-v7a。
如果適配版本高于4.1版本,可以直接上面這樣寫,當然,如果armeabi-v7a不是設備主要ABI,那么會在性能上造成一定的影響。
優化res,assets文件
手動lint檢查,手動刪除無用資源
在Android Studio中打開“Analyze” 然后選擇"Inspect Code...",范圍選擇整個項目,然后點擊"OK"。
使用tinypng等圖片壓縮工具對圖片進行壓縮。
打開網址,將大圖片導入到tinypng,替換之前的圖片資源。
大部分圖片使用Webp格式代替。
可以給UI提要求,讓他們將圖片資源設置為Webp格式,這樣的話圖片資源會小很多。當然,如果對圖片顏色通道要求不高,可以考慮轉jpg,最好用webp,因為效果更佳。
盡量不要在項目中使用幀動畫
一個幀動畫幾十張圖片,再怎么壓縮都還是占很大內存比重的。所以建議是讓UI去搞,這里可以參考使用lottie-android,如果項目中動畫效果多的話效果更加明顯。
使用gradle開啟shrinkResources
每1000行代碼在apk當中才會占用5kb的空間
設置shrinkResources true移除無用資源文件
要通過 ProGuard 啟用代碼壓縮,請在 build.gradle 文件內相應的構建類型中添加 minifyEnabled true:對無用的代碼進行刪除
- minifyEnabled 這個是用來開啟刪除無用代碼,比如沒有引用到的代碼
- shrinkResources 用來開啟刪除無用資源,也就是沒有被引用的文件(經過實測是drawable,layout,實際并不是徹底刪除,而是保留文件名,但是沒有內容,等等),但是因為需要知道是否被引用所以需要配合mififyEnable使用,只有當兩者都為true的時候才會起到真正的刪除無效代碼和無引用資源的目的
同樣的資源代碼測試
- 只有minififyEnable false或者 minififyEnable false && shrinkResources true
APK大小為1.39M 資源文件和layout都存在且是有內容的
- 只有minifyEnable true
866K 資源文件和layout都存在且是有內容的
- minifyEnable true && shrinkResources true
資源文件在但是沒有內容大小都變成67字節,layout文件內容被清空
減少chasses.dex大小
classes.dex中包含了所有的java代碼,當你打包時,gradle會將所有模板力的.class文件轉換成classes.dex文件,當然,如果方法數超過64K,將要新增其他文件進行存儲。可以通過multidexing分多個文件,比如這里的classes2.dex。換句話說,就是減少代碼量。我們可以通過以下方法來實現:
- 盡量減少第三方庫的引用,這個在上面我們已經做過優化了。
- 避免使用枚舉,可能幾十個枚舉的內存占有量才相當一張圖片這樣子,優化效果也不會特別明顯。當然,如果你是個追求極致的人,我不反對你用靜態常量替代枚舉。
- 如果你的dex文件太大,檢查是否引入了重復功能的第三方庫(圖片加載庫,glide,picasso,fresco,image_loader,如果不是你一個人單獨開發完成的很容易出現這種情況),盡量做到一個功能點一個庫解決。
第三方庫處理
- 基礎庫統一
- 選擇更小的庫,Android Methods Count
- 僅引入需要的部分代碼:Fresco的webp支持
圖片壓縮
- https://tinyjpg.com/
- TinyPngPlugin
- 選擇不同的圖片格式
其他
- 用7zip代替壓縮資源。
- 刪除翻譯資源,只保留中英文
- 嘗試將andorid support庫徹底踢出你的項目。
- 嘗試使用動態加載so庫文件,插件化開發。
- 將大資源文件放到服務端,啟動后自動下載使用。
- Facebook的redex優化字節碼 redex是facebook發布的一款android字節碼的優化工具,需要按照說明文檔自行配置一下。
redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>
總結
以上是生活随笔為你收集整理的android app性能优化_Android性能优化之Apk 瘦身优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java - 菱形输出
- 下一篇: 乱码的解决