APK瘦身探索

1,017 阅读5分钟

概述

我平常在项目开发中,刚开始的APK包可能不太大,但是随着时间的变迁,项目的迭代,慢慢的就回发现打出来的APK包越来越大,包每大一点可能用户下载的欲望就小一些,所以在平常的项目迭代过程中,对APK瘦身的工作也要持续进行,这篇文章就会记录一下从几个方面对apk进行瘦身

APK构成初探

我们生成一个包,把包拖到Android studio中就可以看到包的构成了

apk的构成如上图,下面具体看下各个部分都是什么

  • lib 主要存放针对各个cpu架构的so库
  • classes.dex 是java文件编译生成的字节码文件
  • res 存放资源文件 (图片,布局等等)
  • META-INF 相关签名信息
  • AndroidManifest.xml 配置文件
  • resources.arsc 是资源文件的映射表 资源id和具体资源的路径信息 ,Strings信息直接存在里面

apk的构成我们已经有了初步的了解,接下来我们就可以对apk进行瘦身优化了

优化方案

1.使用minifyEnabled混淆代码

android {
    buildTypes {
        release {
            minifyEnabled true
        }
    }
}

在proguard-rules.pro编写混淆规则

2.使用shrinkResources 移除无用资源

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
        }
    }
}

shrinkResources和minifyEnabled必须同时开启才有效

特别注意:这里需要强调一点的是开启之后无用的资源或者图片并没有真正的移除掉,而是用了一个同名的占位符号,我们拿图片举例来看一下

(图一)

(图二)

如上面两张图所示,best.png图片并没有使用到,大小为3.3K,属于无用资源 ,在开启 shrinkResources之后,发现best.png确实打包进apk中了,但大小变成了67B,具体内容是个小黑块的占位符

3.删除项目中未使用到的资源文件

我们通过Android studio提供的lint工具去排查没有使用到的资源文件,然后让无用的资源文件删除掉 通过Analyze - Run Inspection By Name... 选项 ,然后输入 unused resources来查找无用的资源文件

如上图所示无用的资源文件就找到了就可以对其进行删除

4.删除项目中未使用到的代码

我们通过Android studio提供的lint工具去排查没有使用到的代码,然后让无用的代码删除掉 通过Analyze - Run Inspection By Name... 选项 ,然后输入 unused declaration来查找无用的代码

如上图所示无用的代码就找到了就可以对其进行删除

特别注意:通过反射引用的方法或者类,lint是识别不了的,也会给检查出来,所以在删除的时候要特别注意,通过的反射引用的方法或者类千万不能删除

5.对图片进行压缩

可以通过以下几种方式就图片进行压缩

  • png图片格式转换成jpg 将一些大图的格式转成jpg格式,将会有效减小图片的体积
  • 通过tinypng网站对图片进行压缩
  • 使用vector矢量图
  • 将图片转换成webP格式的 (右键图片-Conver To webP 进行转换特别注意:webP格式要求最低的api是18 转换之后图片会小很多,如下图所示)

6.使用shape代替图片

很多点击效果或者背景图可能会使用到图片,可以换成shape进行代替实现,能够有效的减少apk大小

7.使用resConfigs进行语言配置

Android应用本身是支持国际化的,但国内的项目好多都是在国内使用,不需要国际化,这时候可以对相关的String进行减法操作,使其只包含特定的语言(例如中文)

android {
    defaultConfig {
        ...
        //语言资源,只支持中文
        resConfigs "zh-rCN"
    }
}

如上图所示通过resConfigs配置,打包进apk的语言就只有中文了

8.使用AndResGuard对资源进行混淆

使用微信大神张绍文的AndResGuard工具对项目的资源文件进行混淆,在压缩apk大小的同时,提升了反破解难度

具体的源码和使用方法如下 github.com/shwenzhang/…

9. so库操作

我们在引入第三方sdk时,有很多sdk都有对应的so库,且给到的so库分好多架构(armeabi,armeabi-v7a,x86等等)

Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)

所有的架构设备x86、x8664、armeabi-v7a、arm64-v8a都支持armeabi架构的.so文件,所以我们可以根据自己的业务需求选择使用armeabi或者armeabi-v7a进行支持

比如 微信,QQ ,网易云音乐等很多大的应用就只保留了armeabi-v7a

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi','armeabi-v7a'
        }
    }
}

如上图所以优化完成之后apk的lib包中就只有'armeabi','armeabi-v7a'两种架构了

总结

项目瘦身是一项旷日持久的工作,也只有就apk的构成有所了解之后才能更好的对apk进行瘦身,通过上面的步骤之后你的apk一定会有不一样的变化