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