2016-11-20 21 views
9

我遇到了这个问题,其中minifyEnabled和shrinkResources给我次优的结果,当我包括,从第三方库中删除未使用的资产

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

我没有使用谷歌登录API的,但我得到负载的登录图像。 sign_in_images

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

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

+0

请参考此链接您将得到答案http://stackoverflow.com/a/40742213/4069985 –

+1

没有什么内置的。你可以试试[这个Gradle脚本](https://stackoverflow.com/a/34525498/115145),尽管我还没有给它一个镜头。 – CommonsWare

+0

@SrinivasKeerthiprakasam谢谢 – Hades

回答

4

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

基本上,你有很多选择,通过收缩你的资源来减少apk的大小。我已经在他们的简短介绍中讨论过了,我认为启用严格的参考检查应该解决您的问题,但您可以查看所有可用选项以进一步缩小您的apk大小。


定制,以保持其资源

正如医生说,使用在RES /生/ 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 /生/ keep.xml

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

添加这应该解决您的问题。


删除未使用的替代资源

资源收缩机不会删除替代资源,比如,替代绘图资源针对不同屏幕密度,替代字符串资源为不同的语言,等等

所以,你可以自己选择要保留的东西,从你的构建文件中说,你想保留在'en'语言环境中的字符串:

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

这可以显着减小尺寸。


如果仍然资源由资源收缩机不停,然后使用手动首先讨论的方法排除,然后看看是否被编译并建立适当的,如果没有,那么原因为资源收缩机保持资源,将变得清晰从构建时抛出的异常。

希望它有帮助!

+0

我试过所有这些方法兄弟。没有工作。 – Hades

3

如果没有别的工作自动进行构建系统检测未使用的资源,你可能想尝试明确通过排除这些的packagingOptions DSL类似:

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

可能有一定的可能性,以减少应用程序的大小,并删除未使用的资产。

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

如果导入@aar文件比你可以做这样的事情

compile ('com.facebook.android:facebook-android-sdk:[email protected]'){ 
    exclude module: 'support-v4' 
} 

我们仍然有@aar文件比找到替换@aar(':lib'),从那里取出资产替代方式未使用的文件。