0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Android apk三大瘦身步驟

張康康 ? 來源:xx ? 2019-06-07 17:35 ? 次閱讀

為什么apk越來越大?

1.項(xiàng)目不斷發(fā)展,功能越多,代碼量增加的同時(shí),資源文件也在不斷的增多。

2.app支持的主流dpi越來越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,間接導(dǎo)致資源增多。

3.引入的第三方sdk或開源庫越來越多,增加了很多重復(fù)的資源或方法以及無效代碼。

4.用于體驗(yàn)要求高,圖片資源為保證清晰度會(huì)使用分辨率更高的圖片。

apk瘦身的切入點(diǎn)

解壓一個(gè)沒有加固過的apk文件我們會(huì)看到下邊的內(nèi)容,相信你對(duì)這些文件或目錄的含義都已經(jīng)清楚,接下來我們將會(huì)從三個(gè)方面進(jìn)行apk的瘦身操作:

1.Java代碼,對(duì)應(yīng)classes.dex文件,我們要剔除無效代碼,減小dex文件大小。

2.資源文件,對(duì)應(yīng)res文件夾,assets目錄。

3.減小lib中引入的so大小。

開始瘦身

接下來我們將分別針對(duì)上邊的三個(gè)切入點(diǎn)進(jìn)行apk瘦身。

一.減小Java代碼的體積

有人認(rèn)為這個(gè)方面的處理很雞肋,因?yàn)槊恳恍写a都對(duì)應(yīng)相應(yīng)的功能,這里能有多大的精簡空間,其實(shí)并非完全如此,隨著項(xiàng)目的不斷推進(jìn),編碼過程中會(huì)產(chǎn)生很多的冗余代碼,比如該刪掉的沒有刪掉,過多的重復(fù)性功能的工具類,無效的引用等,這還是其次,比較大的一個(gè)問題是,隨著你引入的開源庫不斷增多,無效代碼的出現(xiàn)幾乎是必然事件,過多的重復(fù)方法還會(huì)導(dǎo)致64k方法數(shù)的問題。接下來進(jìn)入正題。

開啟minifyEnable

它的作用不僅僅是混淆代碼,還有壓縮優(yōu)化的功能,他會(huì)遍歷所有代碼并找出沒有引用到的代碼,這些代碼不會(huì)生成在apk中;另外混淆的效果是使用簡短的字母替代原來的類名屬性名等,一定程度上也可以減小代碼體積。

定期review重構(gòu)代碼

對(duì)代碼的不斷優(yōu)化是提升個(gè)人能力的有效手段,同時(shí)優(yōu)化的結(jié)果也會(huì)間接的對(duì)apk進(jìn)行精簡。

慎重選擇你使用的開源庫

很多開源庫針對(duì)不同平臺(tái)提供了精簡版,目的就是移除在本平臺(tái)上不需要的代碼,例如fastJson,我們選擇精簡版就可以使開源代碼縮小一倍左右,另外針對(duì)沒有精簡版的開源庫,需要根據(jù)場景考慮是否使用源碼依賴,手動(dòng)移除不必要的文件資源。

二.資源文件瘦身

優(yōu)先采用WebP圖片

資源文件是apk中體積占用較大的一部分,尤其是圖片資源,所以我們首要以圖片的瘦身為主。首先要對(duì)圖片編碼格式有簡單了解。Android平臺(tái)支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0開始支持WebP),但是Android應(yīng)用開發(fā)中,Bitmap所支持的只有三種JPEG,PNG,WebP,從Bitmap類的CompressFormat枚舉可以看出(詳見源碼)。

JPEG:有損壓縮,不支持透明通道和多幀動(dòng)畫(RGB)

PNG:無損壓縮,支持透明通道(ARGB),PNG大小大于JPEG

WebP:支持有損和無損壓縮,支持透明通道和多幀動(dòng)畫,4.0以上是開發(fā)首選,Google官方測試,WebP比PNG能減少45%大小,即便PNG經(jīng)過壓縮,也能相比PNG減小28%

PNG格式圖片盡量使用NinePatch格式

9圖具有體積小,拉伸不變形的特點(diǎn),并且Android studio可以一鍵轉(zhuǎn)換,使用起來相當(dāng)方便。

Lint查找無效資源

Lint可以檢查res目錄下的無效資源(無法檢查assets),然后將其刪除,但是有一點(diǎn)要注意,如果資源文件是通過反射機(jī)制調(diào)用的,Lint是無法知道的,所以使用lint檢查出的每一個(gè)資源都需要人工進(jìn)行確認(rèn),防止發(fā)生異常刪除。

開啟shrinkResources功能

shrinkResources標(biāo)識(shí)是否去除無用的resource文件,它需要配合minifyEnable使用,同樣存在反射機(jī)制引用的問題,這種情況會(huì)被誤刪

```

android {

buildTypes {

release {

minifyEnable true

shrinkResources true

}

}

}

```

resConfigs剔除第三方庫或者SDK中的資源

第三方庫中包含的無效資源通常包含以下兩點(diǎn):

dpi目錄,第三方庫通常會(huì)提供所有的dpi目錄以及對(duì)應(yīng)的資源文件,因?yàn)樗轻槍?duì)大眾使用的,而我們未必都需要,這時(shí)候需要選擇性的移除。

很多第三方sdk是做了國際化,而我們可能用不到,此時(shí)也需要?jiǎng)h除國際化資源。

```

defaultConfig {

。。。

resConfigs "zh" //表示只使用中文

resConfigs "xxhdpi" // 表示只是用xxhdpi目錄下的資源文件

}

```

三.libs目錄瘦身

so文件最終會(huì)被打包到libs目錄中,我們針對(duì)libs目錄的瘦身主要是去除不必要的平臺(tái)ABI的so文件,例如我們只保留v7a和x86平臺(tái)的so

```

defaultConfig {

ndk {

abiFilters "armeabi-v7a","x86"

}

}

```

四.其他的一些優(yōu)化

1.不涉及透明圖層的圖片可以轉(zhuǎn)換為jpg格式,比如歡迎頁的圖片。

2.使用shape(Vector)替換圖片。

3.刪除或者替換兼容包中無用的一些圖(v4.v7.v13)。

4.刪除第三方aar庫中使用的大圖。

5.把so文件放置在網(wǎng)上或者sd卡內(nèi)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3903

    瀏覽量

    126628
  • apk
    apk
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    4815
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Android Gerber 查看軟件.apk

    ` 本帖最后由 yuanqing17 于 2013-5-6 11:25 編輯 Android Gerber 查看軟件.apk大家覺得好,就評(píng)分.......`
    發(fā)表于 05-03 11:11

    Android 串口訪問的問題,包括eclipse編譯、打包成apk,對(duì)apk重新簽名以獲取system權(quán)限、關(guān)閉selinux等

    Android 串口訪問的問題下載源代碼:https://github.com/friendlyarm/android_SerialPortDemo.git以前下載過的,用git pull命令更新
    發(fā)表于 09-02 14:45

    Snapdragon NPE SDK配置模型文件的轉(zhuǎn)換和apk用例

    ./setup_models.sh #對(duì)Alexnet 例子(DLC、labels、imputs)進(jìn)行打包來作為android源文件。2.用Android studio創(chuàng)建apk(1)打開
    發(fā)表于 09-28 11:49

    CYW20706 Mesh APP“MeshLighting.apk”在Android 7.0中強(qiáng)制終止

    平臺(tái):Android 7演示:所有網(wǎng)格問題工具:Wice 6;Mesh Health.APK;在Android 7測試示例中,我遇到了力關(guān)閉問題;我不知道其他Android版本是否有這
    發(fā)表于 11-09 15:05

    請(qǐng)問有藍(lán)牙模塊APKAndroid源碼項(xiàng)目文件嗎?

    原子哥有沒有藍(lán)牙模塊APKAndroid源碼項(xiàng)目文件???最近做畢設(shè)寫Android代碼碰到大問題了,希望能參考解決下
    發(fā)表于 04-18 06:36

    Vivado工程源碼大瘦身

    `特權(quán)同學(xué)原創(chuàng),轉(zhuǎn)載請(qǐng)保留署名Vivado的工程文件包含了源碼、IP、設(shè)置和各種編譯的中間文件,動(dòng)輒上百M(fèi)B甚至上GB,非常占硬盤。可以通過以下步驟對(duì)編譯過的工程進(jìn)行瘦身,只預(yù)留必要的設(shè)置、IP
    發(fā)表于 08-17 08:41

    APK文件直接傳到Android模擬器

    Graphic and Macintosh應(yīng)用程序的聲音格式ANI:Windows系統(tǒng)中的動(dòng)畫光標(biāo)APKAndroidPackage /Android(安卓)安裝包,APK是類似S
    發(fā)表于 08-20 06:18

    RK3326 android10.0(Q)系統(tǒng)精簡瘦身該怎樣去實(shí)現(xiàn)呢

    RK3326 android10.0(Q)系統(tǒng)精簡瘦身該怎樣去實(shí)現(xiàn)呢?
    發(fā)表于 02-17 07:48

    怎樣在Android源碼編譯時(shí)的Makefile里添加自己的APK名字呢

    怎樣在Android源碼編譯時(shí)的Makefile里添加自己的APK名字呢?有哪些基本步驟?
    發(fā)表于 02-17 06:16

    Android APK下載地址分享

    Android APK 下載地址
    發(fā)表于 09-14 08:25

    永華APK20-4N APK25-5N APK30-6N A

    永華APK20-4N APK25-5N APK30-6N APK35-7N開敝式換氣扇電路圖
    發(fā)表于 02-27 21:23 ?1110次閱讀
    永華<b class='flag-5'>APK</b>20-4N <b class='flag-5'>APK</b>25-5N <b class='flag-5'>APK</b>30-6N A

    MiCo Android V2.04 APK開發(fā)環(huán)境免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MiCo Android V2.04 APK開發(fā)環(huán)境免費(fèi)下載。
    發(fā)表于 12-06 14:57 ?15次下載

    你知道Android Apk的反編譯和加密原理?

    Android的應(yīng)用程序APK文件說到底也是一個(gè)壓縮文件,那么可以通過解壓縮得打里面的文件內(nèi)容,不過很顯然,當(dāng)你去解壓完去查看的時(shí)候,發(fā)現(xiàn)里面的很多東西和你想象中的不太一樣。
    發(fā)表于 04-24 13:50 ?2396次閱讀
    你知道<b class='flag-5'>Android</b> <b class='flag-5'>Apk</b>的反編譯和加密原理?

    Java代碼加密支持Android App Bundle動(dòng)態(tài)化框架

    。 App 瘦身新姿勢:Android App Bundle Android App Bundle是借助Split Apk完成動(dòng)態(tài)加載,使用AAB動(dòng)態(tài)下發(fā)方式,可以大幅度減少應(yīng)用體積,
    的頭像 發(fā)表于 07-29 16:13 ?2210次閱讀
    Java代碼加密支持<b class='flag-5'>Android</b> App Bundle動(dòng)態(tài)化框架

    應(yīng)用程式:AS3460_App_EnvironmentalNoise_pAndroid_v1-1-0.apk

    AS3460_App_EnvironmentalNoise_pAndroid_v1-1-0.apk
    發(fā)表于 01-21 10:18 ?28次下載
    應(yīng)用程式:AS3460_App_EnvironmentalNoise_p<b class='flag-5'>Android_v1-1-0.apk</b>