1. 程式人生 > >APP效能優化系列:apk體積優化

APP效能優化系列:apk體積優化

一.APK檔案格式

/assets
/lib
  /armeabi
  /armeabi-v7a
  /x86
  /mips
/META-INF
  MANIFEST.MF
  CERT.RSA
  CERT.SF
/res
AndroidManifest.xml
classes.dex
resources.arsc

我們可能對上面大部分的檔案和目錄都很熟悉。它們和我們在實際開發app的時候所看到得專案結構一樣,包含了: /assets, /lib, /res, AndroidManifest.xml. 還有一些檔案可能是我們第一次看到。一般說來,classes.dex, 它包含了我們所寫的Java程式碼經過編譯後class檔案;resources.arsc 包含了預編譯之後的資原始檔(比如values檔案,XML drawables 檔案等。)

lib:目錄下的子目錄armeabi存放的是一些so檔案。

classes.dex :java原始碼編譯後生成的java位元組碼檔案

resources.arsc:編譯後的二進位制資原始檔

res:目錄存放資原始檔。包括圖片、字串、raw資料夾下面的音訊檔案、各種xml檔案等等。

assets:目錄存放配置檔案,如webview本地html檔案、圖片資源等。
通過api來訪問資源。

classes.dex:可以通過程式碼混淆,刪掉不必要的jar包和程式碼實現該檔案的優化;

lib:一個硬體裝置對應一個架構(mips、arm或者x86),只保留與裝置架構相關的庫資料夾(主流的架構都是arm的,mips屬於小眾,預設也是支援arm的so的,但x86的不支援),這樣可以大大降低lib資料夾的大小;

資原始檔:通過Lint工具掃描程式碼中沒有使用到的靜態資源。

二.如何減少APK檔案的大小

資原始檔

Android Lint檢查程式碼及資源

Lint可以對res下面的資源進行了充分的優化,並提供一份報告,可以知道哪些資源
沒有被用到,剔除這些資源是可以減少apk體積的。
這些資源包括res資料夾下所有的內容,比如圖片、字串、尺寸等等。
現在Android Lint已經整合到了Android Studio中,用法很簡單。進入Android Studio的選單中
選擇Analyze->Inspecting Code即可

清理資源兩個步驟:
1.找到未用到的資源
2.按需清理這些資源

用程式碼代替圖片

開發的時候有些地方能用程式碼做出來的就儘量不用圖片來渲染,這樣子可以減少圖片資源的數量從而減少體積,這裡舉幾個例子。
用shape代替背景圖
用RotateDrawable代替僅僅是方向不同的“內容相同”的圖片
用layer-list來製作多層圖片從而達到複用
使用屬性動畫而不是多圖片連續播放的幀動畫
用shape代替背景圖
很多背景圖比如按鈕的背景、純色背景都是可以用shape來製作的,這樣子僅用xml程式碼就代替了png資源。比如這麼要給按鈕背景圖(純色背景、帶邊框、圓角)可以用shape而不是Png圖片來製作

多解析度適配

一個APK儘量只用一套圖片,從記憶體佔用和適配的角度考慮,這一套圖建議放在xhdpi資料夾下;

使用tinypng優化大部分圖片資源

tinypng是一個支援壓縮png和jpg圖片格式的網站,通過其獨特的演算法(通過一種叫“量化”的技術,把原本png檔案的24位(RGB,2^24)真彩色壓縮為8位的索引演示,是一種向量壓縮方法,把顏色值用數值123等代替。)可以實現在無失真壓縮的情況下圖片檔案大小縮小。

因為 TinyPNG 將 PNG 圖片壓縮成 8 位(2^8)的 PNG(而不是24位),所以它的壓縮比例非常高,至少都有 3、50% 以上的壓縮比例,有些甚至可以達到70%,並且壓縮之後的圖片和原圖人眼基本看不出區別。

tinypng支援png和jpg圖片的壓縮,並且也支援9圖的壓縮。

tinypng的缺點是在壓縮某些帶有過渡效果(帶alpha值)的圖片時,圖片會失真,這種圖片可以將png圖片轉換為下面介紹的webP格式,可以在保證圖片質量的前提下大幅縮小圖片的大小。

WebP

WebP 是穀人希 (谷歌!人類的希望!) 推行的自造輪子,它的特點是,支援半透明的有失真壓縮,像是 PNG 和 JPEG 的雜交品種。它號稱可以比 png 小 45%,比 JPEG 小 30% 。目前很多公司已經將webP技術運用到Android APP中,比如FaceBook、騰訊、淘寶。webP相比於png最明顯的問題是載入稍慢,不過現在的智慧裝置硬體配置越來越高。在 App 中使用 WebP,除了 Android4.0 以上提供的原生支援外,其他版本以可以使用官方提供的解析庫webp-android-backport編譯成so使用。

通常UI提供的圖片都是png或者jpg格式,我們可以通過智圖或者isparta將其它格式的圖片轉換成webP格式,isparta可實現批量轉換.

isparta:可以將圖片進行有失真壓縮和無失真壓縮。
智圖:在對圖片處理的時候可以選擇畫質10~95.


缺點:
WebP格式影象的編碼時間“比JPEG格式影象長8倍”。
在Android Studio中,不能檢視圖片的預覽效果。

去掉多餘的.so庫

如果專案中引用第三方庫,其中包含很多so檔案,so檔案佔了很多大體積,如果不加控制,所有的so都會打包到apk了。
我們可以通過配置gradle來制定只打包某些so,在defualtConfig中:


defaultConfig {
        ndk {
            //設定支援的SO庫架構
            abiFilters 'arm64-v8a', 'armeabi' //, 'x86', , 'x86_64', 'arm64-v8a'
        }
    }

對第三方開源庫進行重新定製(重新打jar包)

開發中引入大量的第三方開發庫也是一個增加apk體積的重要原因,因為把別人的程式碼和資源全給包含進來了。但是那些jar中的程式碼,並不一定全要的,是否可以只引入一部分程式碼,而不是在build.gradle中僅僅新增一行“compile”來全部依賴呢?如果在build.gradle裡面加一句:
dependencies {
compile ‘com.xxx.xxx’
}

這要把庫中內容全給引用過來了。想到他們是開源的,程式碼可以編輯,所以我們僅僅我們所用到的程式碼給剝離出來,單獨打包了一個jar包引入到我們的專案裡面,就OK了,這樣可以減少了大量的無用依賴程式碼!

ProGuard程式碼混淆

Proguard是Android很早就使用的程式碼混淆工具,除了用於混淆程式碼提高安全性以外,在程式碼編譯的時候也會通過遍歷程式碼的方式來發現沒有被呼叫的程式碼,從而將其在打包成apk時剔除,對程式碼進行優化,最終一定程度上降低了apk的大小。

三.分析工具推薦

NimbleDroid

參考資料

相關推薦

APP效能優化系列apk體積優化

一.APK檔案格式 /assets /lib /armeabi /armeabi-v7a /x86 /mips /META-INF MANIFEST.MF CERT.RSA CERT.SF /res AndroidManifes

APP效能優化系列ViewPager載入大圖出現OOM優化

  最近公司的app有一些醫生反饋說:預覽患者傳送的圖片載入的特別慢,並且經常載入不出來。   仔細分析這個問題的由來,之前客戶端預覽大圖頁載入圖片設定的畫素數是1024*720,即一張圖片佔用的記憶體為:1024*720*2=1.4M(大概).大圖預覽頁面採

APP效能優化系列記憶體優化-記憶體洩露詳解

  做了較長時間的android開發了,發現其實android應用開發入門容易,但是進階或者成為高階工程師,需要具備的基礎能力還是非常高的:效能優化、記憶體洩露、apk瘦身、熱修復等等,這些都非常的考驗一個人的能力。android成長之路還很長,自己會持續的走下

APP效能優化系列UI效能優化

○ 種一棵樹最好的時間是十年前,其次是現在 ○ 堅持輸出,堅持書寫,才可以持續成長 ○ 所有美好事物的成長都是緩慢的 ○ 既往不戀,未來不迎,當下不雜 ○ 業精於勤,荒於嬉,行成於思,毀於隨 ○將軍趕路 不追小兔 ○不要拘泥於語言,同樣也不要拘泥於行業,眼光放遠一點

Web效能優化系列藉助響應式圖片來改進網站圖片顯示

開始使用 <picture> 元素 響應式網頁設計太棒了,它改變了我們向手機端使用者呈現內容的方式,無論使用者使用何種尺寸的手機,我們都能夠為其提供定製化的體驗。響應式網頁設計使用起來很靈活,也容易上手。然而,如果沒有正確使用,它會對網頁效能帶來負面影響。 用於在

MongoDB效能優化系列檢視當前正在執行的操作

檢視MongoDB正在執行哪些操作 rs1:PRIMARY> db.currentOp() { "inprog" : [ { "desc" : "conn111911",

日常代碼優化系列(一)獲取url參數

分別是 對象 https 結果 font 被調用 undefined span repl 最近刷牛客網的時候,看到某大神寫的 獲取url參數 的簡潔寫法,正則用的那叫一個6,頓時心生敬佩,趕緊來學習膜拜一下~~ 題目描述:獲取 url 中的參數 1. 指定參數名稱,返回該

Android Apk體積優化

Android Apk體積優化 原文地址:How you can decrease application size by 60% (In only 5 minutes)? 看到這個標題,你可能很感興趣,當我看到這個標題的時候,我也很感興趣。其實也就是減小應用體積的一些技巧

Android-APK體積優化與dex方法數超出解決

一、Android APK體積優化 1 開啟混淆 則可以去除一些不需要的檔案 minifyEnabled 開啟混淆 shrinkResources 刪除無效的Resource shrinkResources依賴於minifyEnabled,必須和minifyEnabled一起用

Spark優化(八)使用Kryo優化序列化效能

使用Kryo優化序列化效能   在Spark中,主要有三個地方涉及到了序列化:   在運算元函式中使用到外部變數時,該變數會被序列化後進行網路傳輸(見“Spark優化(七):廣播大變數”中的講解)。 將自定義的型別作為RDD的泛型型別時(比如Ja

Java效能優化二併發程式設計優化,開發必備優化技巧!

一、JDK 併發資料結構: 1、併發 List : Vector 或者 CopyOnWriteArrayList 是兩個執行緒安全的 List 實現。 CopyOnWriteArrayList 很好的利用了物件的不變性,在沒有對物件進行寫操作之前,由於物件未發生改變,因此不需要加鎖。而在試圖

Android RxJava 實戰系列聯想搜尋優化

前言 Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。 RxJava如此受歡迎的原因,在於其提供了豐富 &

Android效能優化系列之Bitmap圖片優化

在Android開發過程中,Bitmap往往會給開發者帶來一些困擾,因為對Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError - 記憶體溢位),本篇部落格,我們將一起探討Bitmap的效能優化。 為什麼Bitmap

JVM效能優化系列-(5) 早期編譯優化

5. 早期編譯優化 早起編譯優化主要指編譯期進行的優化。 java的編譯期可能指的以下三種: 前端編譯器:將.java檔案變成.class檔案,例如Sun的Javac、Eclipse JDT中的增量式編譯器(ECJ) JIT編譯器(Just In Time Compiler):將位元組碼變成機器碼,例如

數據庫性能優化程序操作優化

變量 全局 new href 客戶端程序 color 聚合 ont delete   數據庫優化包含以下三部分,數據庫自身的優化,數據庫表優化,程序操作優化.此文為第三部分   數據庫性能優化三:程序操作優化 概述:程序訪問優化也可以認為是訪問SQL語句的優化,一個好的

【SQL server初級】數據庫性能優化程序操作優化

地球 解釋 spa 記錄 employ it168 等於 bsp 實現   數據庫優化包含以下三部分,數據庫自身的優化,數據庫表優化,程序操作優化.此文為第三部分   數據庫性能優化三:程序操作優化 概述:程序訪問優化也可以認為是訪問SQL語句的優化,一個好的SQL語句是

性能優化指南性能優化的一般性原則與方法

ase disk 測試 RM mongodb baby 並發 shard 操作系統   作為一個程序員,性能優化是常有的事情,不管是桌面應用還是web應用,不管是前端還是後端,不管是單點應用還是分布式系統。本文從以下幾個方面來思考這個問題:性能優化的一般性原則,性能優化的層

Android之測量APP效能-分析和除錯 APK(二)

分析和除錯預構建 APK Android Studio 3.0 允許您分析和除錯 APK,無需先從 Android Studio 專案構建這些 APK。 不過,您需要確保使用可除錯版本的 APK。 要開始除錯 APK,請在 Android Studio Welcome 歡迎螢幕中點選&nbs

移動app效能測試工具Emmagee使用介紹

Emmagee 簡介 Emmagee是網易杭州研究院QA團隊開發的一個簡單易上手的Android效能監測小工具,主要用於監控單個App的CPU,記憶體,流量,啟動耗時,電量,電流等效能狀態的變化,且使用者可自定義配置監控的頻率以及效能的實時顯示,並最終生成一份效能統計

移動app效能測試工具GT

(隨身調)是APP的隨身調測平臺(騰訊開發的),它是直接執行在手機上的“整合調測環境”(IDTE,Integrated Debug Environment)。利用GT,僅憑一部手機,無需連線電腦,您即可對APP進行快速的效能測試(CPU、記憶體、流量、電量、幀率/流暢度等等)、開發日誌的檢視、Crash日誌