Although YOU may be diligent in removing resources your app won’t use, it’s not safe to assume that the LIBRARIES you’re including will do the same.
Thankfully some helpful Gradle tools can put your APK on a diet.
link

问题起因

无用的Resources存在于两部分,第一部分是项目文件中,开发者可以检查并直接移除这些文件;第二部分存在于依赖的library中。在一些情况下,我们只需要使用库里面的某一些功能,而并非全部功能。如果不加以特殊处理,其它未经使用资源文件也会被打入最终的APK中。

Gradle

Gradle可以分析资源文件的使用情况,从而删除那些不需引入的资源文件。

如果要开启这项功能,需要在gradle配置文件中将minifyEnabledshrinkResources声明为true

1
2
3
4
5
6
7
8
9
android {
buildTypes {
release {
minifyEnabled trure
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

我们也可以强制保留/删除某些文件

1
2
3
4
<resources xmlns:tools:="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c, @layout/l_used_b*"
tools:discard="@layout/unused2"
/>

Gradle并非是万能的,它不会处理多分辨率/多语言下的资源文件(笔者对这部分存疑,这些资源文件原本就不需要精简,除非APP指定了仅供某些特定用户人群使用)


====Ending====