从第三方库中删除未使用的资产

Had*_*des 9 java android proguard

我遇到过这个问题,minifyEnabled和shrinkResources在某种意义上给出了次优的结果; 当我包括,

'com.google.android.gms:play-services-places:9.6.1'
Run Code Online (Sandbox Code Playgroud)

我还没有使用Google Sign In API,我收到大量登录图片. sign_in_images

如何从我的APK中删除它们?他们似乎添加了相当多的KB.

我正在使用proguard缩小和缩小资源,如上所述.

Abh*_*uri 5

有一个细节主题在这里,在Android开发者用户指南。

基本上,您有很多选择可以通过缩小资源来实际减小 apk 的大小。我已经简要地讨论过它们,我认为下面讨论的启用严格引用检查应该可以解决您的问题,但是您可以查看所有可用选项以进一步减小您的 apk 大小。


自定义要保留的资源

正如文档所说,使用 res/raw/keep.xml 中的以下 xml,来决定保留什么和不保留什么:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />
Run Code Online (Sandbox Code Playgroud)

其余的将由构建系统处理(这在使用不同的构建变体时很有用)。


启用严格的参考检查

如果您的代码或库引用如下资源:

getResources().getIdentifier("image1", "drawable", getPackageName())
Run Code Online (Sandbox Code Playgroud)

然后,在这种情况下,默认情况下资源收缩器会采取防御性行为,并将具有匹配名称格式的所有资源标记为可能使用且不可移除。

因此,将以下内容添加到 res/raw/keep.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />
Run Code Online (Sandbox Code Playgroud)

添加这个应该可以解决你的问题。


删除未使用的替代资源

Resource Shrinker 不会删除替代资源,例如不同屏幕密度的替代可绘制资源、不同语言的替代字符串资源等。

因此,您可以自己从构建文件中选择要保留的内容,例如,要保留 'en' 语言环境中的字符串:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以显着减小尺寸。


如果资源收缩器仍然保留资源,则使用第一个讨论的方法手动排除它们,并查看是否正确编译和构建,如果没有,那么资源收缩器保留资源的原因将从构建时抛出的异常中明确。

希望能帮助到你 !