最近項(xiàng)目功能已經(jīng)開發(fā)完成械荷,看到自己辛苦開發(fā)出來的app,apk盡然驚人的達(dá)到了60MB虑灰,再回頭想想自己做的app有哪些功能吨瞎,心里沒點(diǎn)數(shù)嘛,最后經(jīng)過自己的一番折騰穆咐,把a(bǔ)pk大小減小到了29MB颤诀。
下面看下這篇文章大致內(nèi)容
一字旭、分析APK文件
將自己編譯好的apk直接拖拽至Android 直接打開(apk實(shí)際上是壓縮文件,也可以將后綴改為zip崖叫,直接解壓)
- lib/:包含特定于處理器軟件層的編譯代碼遗淳。該目錄包含了每種平臺(tái)的子目錄,像armeabi心傀,armeabi-v7a屈暗, arm64-v8a,x86脂男,x86_64养叛,和mips。
- res/:包含未編譯到的資源 resources.arsc,主要有圖片資源文件宰翅。
-
assets/:包含應(yīng)用可以使用AssetManager對(duì)象檢索的應(yīng)用資源弃甥。
META-INF/:包含CERT.SF和 CERT.RSA簽名文件以及MANIFEST.MF 清單文件。 - resources.arsc:包含已編譯的資源汁讼。該文件包含res/values/ 文件夾所有配置中的XML內(nèi)容淆攻。打包工具提取此XML內(nèi)容,將其編譯為二進(jìn)制格式掉缺,并將內(nèi)容歸檔卜录。此內(nèi)容包括語言字符串和樣式,以及直接包含在resources.arsc文件中的內(nèi)容路徑 眶明,例如布局文件和圖像艰毒。
- classes.dex:包含以Dalvik / ART虛擬機(jī)可理解的DEX文件格式編譯的類。
- AndroidManifest.xml:包含核心Android清單文件搜囱。該文件列出應(yīng)用程序的名稱丑瞧,版本,訪問權(quán)限和引用的庫文件蜀肘。該文件使用Android的二進(jìn)制XML格式绊汹。
*這里發(fā)現(xiàn)導(dǎo)致apk文件大的文件主要是lib、res扮宠、classes.dex西乖、assets、resources.arsc這5個(gè)文件坛增,接下來我們逐個(gè)擊破获雕。
二、瘦身處理
2.1 lib目錄處理
一個(gè)lib庫占了整個(gè)apk 52%的大小收捣,打開lib目錄發(fā)現(xiàn)存在三種CPU架構(gòu)的lib庫届案,arm64-v8a、armeabi罢艾、armeabi-v7a楣颠。
問題1:我們真的需要這三種架構(gòu)的lib庫嗎尽纽?
解答1:大多數(shù)情況下我們可以只用兩種armeabi-v7a/ arm64-v8a (因?yàn)槭忻嫔?9%的手機(jī)的CPU架構(gòu)都是這兩種中的一種,2020年開始后面出的手機(jī)CPU幾乎都是arm64-v8a架構(gòu)的)童漩。
解決方案: 在 app目錄下build.gradle 下修改 ndk配置,并且刪除armeabi目錄
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
問題2:libP2PController.so弄贿、libAMapSDK_MAP_v8_1_0.so這兩個(gè)包這么大,還有優(yōu)化空間嗎睁冬?
解答2:經(jīng)過仔細(xì)分析挎春,libP2PController是項(xiàng)目引入IM功能加入的lib庫看疙,而這個(gè)lib庫主要是語音豆拨、視屏通過需要用到的庫,剛好目前需求沒有語音視屏功能能庆,所以大膽刪除庫施禾,并在loadLibrary的時(shí)候做好tryCatch保證程序不報(bào)錯(cuò)即可;
libAMapSDK_MAP_v8_1_0庫相信大家都很熟悉搁胆,大家在集成高德地圖的時(shí)候弥搞,只需要定位功能,則集成定位sdk根據(jù)需求來渠旁,不需要集成全量SDK攀例,不然就會(huì)增加apk大小。
做完lib庫優(yōu)化后顾腊,apk大小縮小了20M粤铭,主要是刪除了armeabi(10MB)文件夾和libP2PController arm64、armeabi-v7a兩個(gè)so包約(10MB)杂靶,現(xiàn)在apk是40MB梆惯。
2.2 res目錄處理
展開res目錄發(fā)現(xiàn)如下截圖
發(fā)現(xiàn)問題:
- 大部分是png圖,大家都是png是帶透明度的大文件圖片吗垮,相比jpg要大很多垛吗;
- 有個(gè)別圖片尺寸特別大,這些圖片大多是大尺寸的背景圖烁登;
解決辦法
-
所有圖片可以用webp格式代替怯屉,操作如下截圖(Android Studio選中圖片單擊右鍵,選擇Convert To WebP即可)饵沧;
-
-
2.大圖盡量用jpg圖片代替锨络,并且讓UI不要設(shè)計(jì)顏色復(fù)雜度過高的圖片,比如下圖捷泞;
3.能用shape文件絕不用UI設(shè)計(jì)的圖片文件足删;
4.一些需要拉伸的不規(guī)則圖片盡量使用.9圖;
2.3 assets文件處理
打開如下圖:結(jié)果發(fā)現(xiàn)锁右,都是第三庫攜帶的一些資源文件失受,這個(gè)則無需處理
2.4 resources.arsc文件處理
這個(gè)文件打不開讶泰,但知道這個(gè)文件里面是包含res/values/ 文件夾所有配置中的XML內(nèi)容,包括colors.xml,ids.xml, string.xml, styles.xml等等資源文件拂到;
心想痪署,這文件咋優(yōu)化呢,只需要去掉不需要使用的資源文件兄旬,包括id即可狼犯;
2.4.1去除無用資源 gradle配置
buildTypes {
release {
//去除無用資源
shrinkResources true
/開啟混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
2.4.2使用lint工具掃描資源
使用Lint去除無用的資源文件,操作步驟是Analyze -> Run Inspection by Name -> 輸入框輸入 Unused resources 就可以掃描工程找到未使用的資源了
左邊掃描出來的資源文件领铐,全選后點(diǎn)擊右邊的 Remove All Unused Resources 按鈕
2.5 classes.dex文件處理
眾所周知悯森,dex文件是源碼編譯后的運(yùn)行字節(jié)碼文件,反編譯工具dex2Jar得到j(luò)ava源碼就是反編譯dex文件的绪撵。
那么源碼是通過以下幾點(diǎn)來優(yōu)化的:
- 1.刪除無用的import(項(xiàng)目單機(jī)右鍵瓢姻,點(diǎn)擊 Optimize Imports即可)
- 2.刪除無用的成員變量
- 3.刪除無用的方法
- 4.刪除無用的類文件
- 5.刪除重復(fù)代碼(有些程序員喜歡copy,不善于封裝所帶來的冗余代碼)
- 6.重命名長變量名為短而美的變量
- 7.刪除不必要的空行
以上6點(diǎn)可以通過 inspaction過濾unused resources音诈,和通過阿里的Java Coding Guidelines工具掃碼出來并逐一處理即可 - 8.代碼混淆處理(常規(guī)混淆配置即可)