Android APK瘦身实践

本文记录自己之前做的一些apk瘦身措施,都是在网上搜索整理的通用方法

依据官方文档进行瘦身

参考文章:
压缩代码和资源

  • 启用代码压缩
    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.
之前项目采用过该方式,但发现打开shrinkResources后,出现了OOM增多的现象。虽然没有明确与shrinkResources相关,但推测相关性极大。后续重新开启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中发布出去。这就导致了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"肥胖"的一大原因。
依据官方提供的WebP image压缩指南,可非常方便的在AS内进行压缩图片操作。
操作步骤如下图:


最终AS会将原有的png图片进行删除,保留压缩后的webp.
通过该方案apk减小到26284239kb,约25M,在之前的基础上减小了1M大小。

另外还有tinypng跟pngquant压缩方案,但它们在批量处理时都需要自己提供封装调用方法。如果感觉AS 提供的webp压缩方案无法满足要求,可以在选择这两种方案。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258