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

时间:2016-11-20 16:22:16

标签: java android proguard

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

'com.google.android.gms:play-services-places:9.6.1'

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

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

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

3 个答案:

答案 0 :(得分:4)

在android开发者用户指南中有一个详细主题here

基本上,您有很多选项可以通过缩小资源来实际减小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" />

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

启用严格参考检查

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

getResources().getIdentifier("image1", "drawable", getPackageName())

然后,在这种情况下,资源缩减器默认情况下会采取防御措施,并将所有具有匹配名称格式的资源标记为可能已使用且无法删除。

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

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict" />

添加此项可以解决您的问题。

删除未使用的替代资源

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

所以,您可以自己选择要保留的内容,例如,您希望在“en”语言环境中保留字符串:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}

这可以显着减小尺寸。

如果仍有资源由资源缩减器保留,那么使用第一个讨论的方法手动排除它们,看看是否编译和构建正确,如果没有,那么通过资源缩减器保留资源的原因将从抛出的异常中变得清晰建设时。

希望它有所帮助!

答案 1 :(得分:3)

如果没有其他方法可以使构建系统自动检测未使用的资源,您可能希望尝试通过packagingOptions DSL明确排除这些资源,如:

android {
    packagingOptions {
        exclude '/**/common_google_signin*.png'
    }
}

答案 2 :(得分:3)

可能会有一些减少应用程序大小和删除未使用资产的可能性。

您可以从(':lib')项目库中删除未使用的资产。

如果您导入@aar文件,则可以执行此类操作

compile ('com.facebook.android:facebook-android-sdk:3.22.0@aar'){
    exclude module: 'support-v4'
}

我们仍然在@aar文件中有未使用的文件,而不是找到将@aar替换为(':lib')的替代方法,从中移除资源。