Android包体积优化方向

931 阅读3分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

一:Analyze APK查看各目录大小

在Android Studio里双击APK即可查看APK里各资源的情况

image.png

文件/目录描述
lib存放对应CPU架构的so库,有armeabi、armeabi-v7a、arm64-v8a、X86、x86_64 等;其中armeabi-v7a 和 arm64-v8a 是主流平台
res存放资源文件,如布局和图片等
assets存放能够通过AssetManager获取的资源
class.dex.java-》.class-》.dex,dex文件是能被Dalvik/ART 虚拟机理解的格式文件
resources.arsc资源映射表,包含了res/value目录下所有配置的xml内容。根据R.java中记录的id,可以在resources.arsc中找到对应资源的位置
其他

优化数据参考(不同应用效果不一样)

状态大小备注
未优化前79.7 MB
图片压缩,多余资源清除,代码压缩69.8MB
图片压缩,多余资源清除,代码不压缩71.5MB
图片压缩72.2 MB只压缩了一部分图片及移除字体

二、图片优化

1: 图片压缩 tinify.cn/ 能有效降低图片大小却看不大出来失真

2: 图片格式更换成webp,svg可以更小 .png > .jpg > .webp > .svg

Android Studio创建svg icon

image.png

Android Studio将图片转换成webp

image.png

对透明通道没有要求的高保真大图要存储到磁盘的图片,优先使用 jpg一般 UI 给我们的都是 jpg 或 png 格式,如果是一些普通图标切图的话就使用 png如果有用到网络传输且图片比较大的场景,比如和服务器通信获取网络图片,优先使用 webp,其次是 png图片体积小要求不高的纯色小图标可以使用 svg

3: 一些图片可以放到网络上加载

4: 用一套图片资源,如xhdpi或xxhdpi,针对性做差异化适配

三、沉冗资源优化

1: 右键 -> Refractor -> Remove Unused Resources -> preview,预览找到冗余的资源,可一键去除冗余资源

2: 手动分析冗余资源的操作, Code -> Analyze Code -> Run Inspection by Name... -> unused resources -> Whole Project

3: build.gradle 配置文件中将shrinkResources true,在打包的时候会自动清除掉冗余的资源;这里的清除并不是删除资源文件,而是将资源内的数据剔除

注:上述方式如代码中存在动态、反射加载资源的时候,会导致资源误删的情况

可以新增res/raw/keep.xml文件,在里面把需要保留的资源文件列举出

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/xxx"/>

4: 可以通过 resConfigs 配置使用哪些语言,从而让构建工具移除指定语言之外的所有资源

android {
    defaultConfig {
        resConfigs "zh-rCN"
    }
    flavorDimensions "default"
    productFlavors {
        huawei {
            resConfigs "zh-rCN"
        }
    }
}
 
android {
    defaultConfig {
        resConfigs "zh-rCN", "xhdpi" // 只需要中文字符串、xhdpi 目录下的资源
    }
    flavorDimensions "default"
    productFlavors {
        huawei {
            resConfigs "zh-rCN", "mdpi" // 只需要中文字符串、mdpi 目录下的资源
        }
    }
}

四、代码压缩:

minifyEnabled true开启代码混淆及压缩

五、SO优化:

1: 只保留指定平台CPU架构的so

android {
 defaultConfig {
      ndk   {
         abiFilters "armeabi-v7a"
      }
  }
}

2: 通过网络下载,通过插件化的方式将下载的so正常装载使用