天天看点

性能优化-apk瘦身

作为应用的使用者而言,apk的体积越小当然是越喜欢的。这样不仅能节省手机的存储空间,并且在应用市场下载的速度也快加快。所以,对于开发者来说,了解常用的apk瘦身技术是不可避免的。

一、图片瘦身

1、webP使用

先看一张截图

性能优化-apk瘦身

原始图片为png格式,大小为38.5kb,经过转换后大小为6.7kb,仅仅是原图的17%。但是使用webP要求手机最低支持版本为api18 计版本4.3。如果你需要从4.0版本开始,就不用了考虑方式了,高于4.3版本,这样图片格式应该优先选择。

webP批量转换工具下载地址:谷歌官网webp转换工具需要翻墙。其他方式可以自行百度。

2、png压缩

png图片相当于jpg图片多了透明通道,所以它会占用更大的内存,可以借助工具对它压缩

  • 可以采用ImageOptim或者Pngyu对png进行压缩;
  • aapt会使用内置的压缩算法来优化res/drawable/目录吓的PNG图片,单也可能会导致本来已经优化过的图片体积变大,这里需要禁用aapt优化png图片。
aaptOptions{
        cruncherEnabled = false
    }
           
3、jpg压缩

使用packJPG或者guetzli工具压缩jpg图片。

4、使用shape

对于纯色背景可以使用shape替换,萌购用代码实现的,尽量用代码实现

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="0dp"/>
    <solid android:color="#f00"/>
</shape>
           

二、res资源压缩

1、开启代码混淆和去除无用资源
buildTypes {
        release {
            shrinkResources true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
           
2、使用微信开源框架AndResGuard工具,对资源进一步混淆

配置参考github,微信AndResGuard资源混淆。

三、冗余代码优化

  • 使用工具,可以使用PMD等
  • 下载PMD 地址:pmd代码冗余检测下载地址。
  • 配置及使用截图如下,可以根据官方指导
    性能优化-apk瘦身

四、Lint使用

打开android studio。依次选择 Analyze-》Run Inspection By Name-》输入要检测的内容。

比如检测无用资源,输入unused resources

性能优化-apk瘦身

比如检测无用代码,输入unused declaration

性能优化-apk瘦身

五、其他优化

1、压缩存储文件

比如存放在assets下的文件可以采用7Zip压缩,在使用的时候进行解压。

2、语言资源优化

在build.gradle中配置指定需要的语言类型

defaultConfig {
...
...
// 只保留指定和默认资源 ,中文和英文
        //当应用不需要支持几十种语言时,可以通过配置 resConfigs 去除无用的语言资源。
        resConfigs('zh-rCN', 'en')
}
           
3、指定abi
defaultConfig {
...
...
	ndk{
       abiFilter("armeabi-v7a","x86")
    }
}
           
4、减少Enum使用

没减少一个Enum的使用,可以减少1KB的大小,可以使用定义常量的替换方式。

六、split

使用split拆分包。比如我们的项目中在mdpi、hdpi、xhdpi…都有一份图片,当然这样做就是为了适配不同的屏幕尺寸,防止图片变形。但是如果我们需要对特定的屏幕尺寸,我们可能就只需要一个目录下的图片,这样就需要借助split了。如下,根据分辨率进行适配

android {
  ...
  splits {
    density {
      enable true
      exclude "ldpi", "hdpi", "xxxhdpi"
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }
  ...
}
           
  • exclude :包含的资源目录
  • compatibleScreens :适配的屏幕尺寸

除了能够适配资源外,还可以根据支持cpu架构的so进行拆分。 如果你的apk中引入了第三方库比如推送类的服务,demo中一般会提供不同cpu架构的so库,我们一般的做法是把所有的so都放到libs下,这样做发现apk的体积瞬间暴涨。这样就需要使用split了。

android {
  ...
  splits {
    abi {
      enable true
      reset()
      include 'x86', 'armeabi-v7a', 'mips'
      universalApk true
    }
  }
}

           

七、总结:

针对以上优化,优化效率最高的应该是图片的压缩,所以图片的选择对于apk的大小影响很大。另外第三方库,so库的合理使用同样影响它的体积。针对混淆能够避免我们的代码没有那么容易被别人窃取。