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

依据官方文档进行瘦身

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

  • 启用代码压缩
    build.gradle文件中添加如下类似片段:
android {    buildTypes {        release {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android.txt'),                    'proguard-rules.pro'        }    }    ...}

每次构建后ProGuard 都会输出下表的文件。它们都保存在 /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压缩方案无法满足要求,可以在选择这两种方案。

更多相关文章

  1. 高级Redis应用进阶课 一站式Redis解决方案
  2. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  3. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  4. 【摘录】Android(安卓)重新编译资源文件
  5. Android(安卓)rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)
  6. Android(安卓)Studio - local path doesn't exist
  7. Android(安卓)finish()自动回调时机,Activity资源释放逻辑放在onD
  8. android 3.0 ationbar使用总结
  9. Android(安卓)Studio优化内存配置

随机推荐

  1. Cocos2d-x的Android配置以及相关参考文档
  2. [android]导出apk报错 Conversion to Dal
  3. Android编程之关闭当前程序
  4. 利用adb 在macOS上 为Nexus Android(安卓
  5. Android(安卓)Fragment 基本介绍
  6. Android学习笔记(十七)——使用意图调用内
  7. Android下LineLayout实现View自动换行
  8. Mac中对android apk进行反编译(apktool d
  9. Android(安卓)persistent属性研究
  10. Android中BroadcastReceiver(异步接收广