每到夏日我们就因为增长的体重而拼命瘦身,那么在面对越发庞大的APK,你又是如何进行APK瘦身呢?

APK文件结构

META-INF\(Jar文件中常可以看到)

res\(存放资源文件的目录)

AndroidManifest.xml(程序全局配置文件)

classes.dex(Dalvik字节码)

resources.arsc(编译后的二进制资源文件)

AndroidStudio分析APK文件大小


使用AS的Build-Analyze APK

查看APK包内各个文字资源大小

APK瘦身思路


1.图片处理

1)使用一套图

一般市场上使用一套图就能够适应大部分需求,使用720dp分辨率,放置于xhdpi

2)使用TinyPng压缩图片

官网

图片压缩后对视觉影响不大,但体积显著减小

3)使用webp

4)使用jpg替代png

使用jpg替换不需要保留透明区的png

5)使用矢量图

VectorDrawable

AnimatedVectorDrawable

6)使用shape背景

7)使用selector文件

8)使用tintColor

9)使用.9图

2.去除多余资源

1)Andorid Studio Lint

AS的Analyze Run Inspection By Name

输入unused resources查找多余的资源

2)shrinkResources

使用资源缩减器,去除无用资源

buildTypes { 
    release { 
    shrinkResources true
    minifyEnabled true 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
}
复制代码

3)resConfigs

通过resConfig属性指定语言(未指定的语言的任何资源都会被删除)

android {
    defaultConfig { 
        ... resConfigs " zh","en"
    }
}
复制代码

3.缩小资源AndResGuard

微信资源混淆打包工具AndResGuard

“AndResGuard是一个帮助你缩小APK大小的工具,

他的原理类似Java Proguard,但是只针对资源。

它会将原本冗长的资源路径变短,

例如将res/drawable/wechat变为r/d/a”

官网

4.去除多余包依赖

第三方库里包含了你所需的引用包,则无需额外引入

使用Android Studio查看包依赖

android studio 终端terminal输入

gradlew  :Your Module Name:dependencies 
复制代码

或者使用

gradlew  :Your Module Name:dependencies --configuration compile(或者implementation)
复制代码

可以查看到详细的包依赖关系

5.去除冗余代码

Proguard

ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。

可以删除没用的注释,最大限度地优化字节码文件。

它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。

buildTypes {
    release {
    minifyEnabled true //开启混淆
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置文件
    }
}
复制代码

6.APK分割splits

android {
    ...
    splits {
        density {
            enable true //打开apk分割功能
            exclude "ldpi", "tvdpi", "xxxhdpi" //exclude排除
            compatibleScreens 'small', 'normal', 'large', 'xlarge' //将注入到mainfest配置compatible-screens中
        }
        abi { 
            enable true
            reset() //重置列表,与include搭配使用,指定生成include包含的apk
            include 'x86', 'armeabi-v7a', 'mips' //include包括
            universalApk false // 不打包一个通用版本(包含所有的ABI)
        }
}
复制代码

7.在线资源&H5

在线资源替代本地资源或者使用h5