Android APK瘦身實踐

本文記錄自己之前做的一些apk瘦身措施叁巨,都是在網上搜索整理的通用方法

依據(jù)官方文檔進行瘦身

參考文章:
壓縮代碼和資源

  • 啟用代碼壓縮
    build.gradle文件中添加如下類似片段:
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

每次構建后ProGuard 都會輸出下表的文件。它們都保存在 <module-name>/build/outputs/mapping/release/目錄下蛆楞。

文件名 作用
dump.txt APK 中所有類文件的內部結構
mapping.txt 提供原始與混淆過的類、方法和字段名稱之間的轉換
seeds.txt 列出未進行混淆的類和成員
usage.txt 列出從 APK 移除的代碼
  • 壓縮資源
    壓縮資源將shrinkResources 屬性設置為 true即可傅蹂。gradle片段如下:
android {
    ...
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
}

通過以上方式兵迅,apk降低至35967969KB,減少了約1M的大小松嘶。

PS.
之前項目采用過該方式,但發(fā)現(xiàn)打開shrinkResources后挎扰,出現(xiàn)了OOM增多的現(xiàn)象翠订。雖然沒有明確與shrinkResources相關,但推測相關性極大遵倦。后續(xù)重新開啟shrinkResources后尽超,需要多做測試,先灰度小部分用戶梧躺,觀察反饋日志橙弱。在決定是否全面開啟。

利用AndResGuard瘦身

參考文章:

  1. Android資源混淆AndResGuard使用說明
  2. 安裝包立減1M--微信Android資源混淆打包工具
    該方案出自微信燥狰,gradle配置微信也提供了棘脐,具體如下:
apply plugin: 'AndResGuard'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'
    }
}


andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    use7zip = true
    useSign = true
    // 打開這個開關,會keep住所有資源的原始路徑龙致,只混淆資源的名字
    keepRoot = false
    whiteList = [
        // for your icon
        "R.drawable.icon",
        // for fabric
        "R.string.com.crashlytics.*",
        // for google-services
        "R.string.google_app_id",
        "R.string.gcm_defaultSenderId",
        "R.string.default_web_client_id",
        "R.string.ga_trackingId",
        "R.string.firebase_database_url",
        "R.string.google_api_key",
        "R.string.google_crash_reporting_api_key"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.2.10'
         //path = "/usr/local/bin/7za"
    }

    /**
    * 可選: 如果不設置則會默認覆蓋assemble輸出的apk
    **/
    // finalApkBackupPath = "${project.rootDir}/final.apk"

    /**
    * 可選: 指定v1簽名時生成jar文件的摘要算法
    * 默認值為“SHA-1”
    **/
    // digestalg = "SHA-256"
}

通過該方式蛀缝,在官方文檔進行瘦身的基礎上apk大小減少至33552298KB,約32M目代。減少了2M屈梁,效果比較明顯。

so庫分離瘦身

參考文章:
Build Multiple APKs

Android芯片架構有多種榛了,常見的如x86,arm,arm64等在讶。如果apk本身依賴so庫,那么這些so庫勢必要適配多種芯片架構霜大,這些支持不同芯片的so庫往往會一起打包到apk中發(fā)布出去构哺。這就導致了so庫冗余。因此做到so庫分離打包也是apk瘦身的一種方案战坤。
gradle片段如下:

android{
...
    splits {
        abi {
            enable true
            reset()
            include "x86", "armeabi-v7a", "arm64-v8a"
            // Specifies that we do not want to also generate a universal APK that includes all ABIs.
            universalApk false
        }
    }
}

這種方式如果so庫本身比較大曙强,瘦身效果明顯。應用減少到了26929590kb途茫,約26M.

壓縮圖片資源

參考文章:
Create WebP Images
PNG 圖片壓縮對比分析
android打包本身會對png進行無損壓縮碟嘴,而圖片資源是apk"肥胖"的一大原因。
依據(jù)官方提供的WebP image壓縮指南囊卜,可非常方便的在AS內進行壓縮圖片操作娜扇。
操作步驟如下圖:


最終AS會將原有的png圖片進行刪除错沃,保留壓縮后的webp.
通過該方案apk減小到26284239kb,約25M雀瓢,在之前的基礎上減小了1M大小捎废。

另外還有tinypng跟pngquant壓縮方案,但它們在批量處理時都需要自己提供封裝調用方法致燥。如果感覺AS 提供的webp壓縮方案無法滿足要求,可以在選擇這兩種方案排截。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嫌蚤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子断傲,更是在濱河造成了極大的恐慌脱吱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件认罩,死亡現(xiàn)場離奇詭異箱蝠,居然都是意外死亡,警方通過查閱死者的電腦和手機垦垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門宦搬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劫拗,你說我怎么就攤上這事间校。” “怎么了页慷?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵憔足,是天一觀的道長。 經常有香客問我酒繁,道長滓彰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任州袒,我火速辦了婚禮揭绑,結果婚禮上,老公的妹妹穿的比我還像新娘郎哭。我一直安慰自己洗做,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布彰居。 她就那樣靜靜地躺著诚纸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陈惰。 梳的紋絲不亂的頭發(fā)上畦徘,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天毕籽,我揣著相機與錄音,去河邊找鬼井辆。 笑死关筒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的杯缺。 我是一名探鬼主播蒸播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萍肆!你這毒婦竟也來了袍榆?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塘揣,失蹤者是張志新(化名)和其女友劉穎包雀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲铡,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡才写,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奖蔓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赞草。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吆鹤,靈堂內的尸體忽然破棺而出房资,到底是詐尸還是另有隱情,我是刑警寧澤檀头,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布轰异,位于F島的核電站,受9級特大地震影響暑始,放射性物質發(fā)生泄漏搭独。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一廊镜、第九天 我趴在偏房一處隱蔽的房頂上張望牙肝。 院中可真熱鬧,春花似錦嗤朴、人聲如沸配椭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽股缸。三九已至,卻和暖如春吱雏,著一層夾襖步出監(jiān)牢的瞬間敦姻,已是汗流浹背瘾境。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镰惦,地道東北人迷守。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像旺入,于是被迫代替她去往敵國和親兑凿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355