在使用google-play-services_lib添加admob广告后,Android应用程序大小增加
我将以两个版本发布我的应用程序,付费和免费(使用AdMob广告)。在使用google-play-services_lib添加admob广告后,Android应用程序大小增加,android,admob,proguard,Android,Admob,Proguard,我将以两个版本发布我的应用程序,付费和免费(使用AdMob广告)。 除了我在AdMob服务的免费版本中使用的google-play-service_库之外,这两个版本完全相同 使用proguard后的最终apk尺寸为: 付费版本为1.301.435字节 1.946.634字节用于ads版本 在免费版本中,我只显示插页广告 以下是我的proguard设置与google-play-service_库的关系 -keep class * extends java.util.ListResourceBun
除了我在AdMob服务的免费版本中使用的google-play-service_库之外,这两个版本完全相同 使用proguard后的最终apk尺寸为:
付费版本为1.301.435字节
1.946.634字节用于ads版本
在免费版本中,我只显示插页广告 以下是我的proguard设置与google-play-service_库的关系
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
public static final *** NULL;
}
-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
@com.google.android.gms.common.annotation.KeepName *;
}
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
我可以做些什么来减少文件大小,比如删除一些-keep标志或者什么
编辑
通过使用,我发现Google Play服务包中的所有类都没有缩减(包括com.Google.android.gms.maps.*
,com.Google.android.gms.games.*
以及我认为广告管理不需要的许多其他类)
如何强制缩小一个类或一个类组
编辑(再次)
看起来Eclipse没有保存Proguard输出,至少我在任何地方都看不到它。然后,我将我的项目和库配置为使用Ant构建,以查看一些输出,但这几乎是不真实的,有两种情况:
-whyareyoukeeping class com.google.android.gms.maps.GoogleMap
[proguard] Explaining why classes and class members are being kept...
[proguard] Printing usage to [...../bin/proguard/usage.txt]...
[proguard] com.google.android.gms.maps.GoogleMap
[proguard] is not being kept.
(至少我读到这个类没有被保留,尽管我可以使用apktool看到它!)并且
这里没有关于给定类的内容
我放弃了,因为我的应用程序只增加了一个间隙,使他的尺寸增加了50%,尽管声明:
如果使用ProGuard作为一部分,则客户端库的占用空间很小
您的构建过程,所以它不会对您的
应用程序的文件大小
我在哪里也找不到它的向导 proguard配置的其他部分导致GPS类被保留 看看这个选项 -为什么要遵守船级社规范
你可以用它来告诉你,如果你自己不能发现,为什么要保留特定的类。这与proguard无关。 正如你们所知,谷歌play服务是近源的。proguard无法在没有来源的情况下处理它 代码。但是你可以手动缩小它 1、从jar文件中删除未使用的类 在google play service文件夹中,通常为sdk\extras\google\google\u play\u services \libproject\google-play-services\u lib\libs\, 使用zip文件管理器(如7zip)打开google play services.jar,您可以找到很多 文件夹,如地图,游戏等是没有用的,如果你只使用广告。所以只是 删除它们。小心保存广告、普通、动态、内部和位置文件夹,否则在显示广告时您将获得NoClassDefFoundError的fc 2、如果您只使用ads,请从res文件夹中删除未使用的资源 google-play-services_lib\res文件夹中的许多资源对您没有用处,您可以将其删除。例如值af、值am等。。。。您需要保留的是颜色、可绘制、可绘制hdpi和值文件夹 3,现在刷新并在eclipse中构建google-play-services_lib项目,然后刷新 然后重新构建您的项目。现在你应该发现apk的大小变小了。我的尺寸
apk在proguard之前从902kb下降到480kb,在proguard之后从330kb下降。您在build.gradle文件中使用了这一行吗
compile 'com.google.android.gms:play-services:6.+'
如果是,则用该行进行补充
compile 'com.google.android.gms:play-services-ads:6.+'
它将应用程序大小减少了约600kb。thanx,我来看看。现在我的问题是:如何知道我实际上不需要的保留类是什么?你需要特别保留任何可能通过反射构造的类。Ie活动或从XML引用的其他类。其余部分可以由Proguard在创建依赖关系图时计算出来。好吧,我只需要显示AdMob Interstitutials广告,不要使用任何XML。我将com.google.android.gms.ads.*导入到我的代码中,没有其他内容。我尝试将proguard与-whyareyoukeeping class com.google..android.gsm.*一起使用。。。从eclipse->file->export,我在哪里可以找到输出?控制台没有显示任何新功能…不是真正的解决方案,只是一些可能有用的功能:您可能可以删除可绘制的XXXX文件夹。它们仅包含登录/退出和+1按钮图像。我会检查图书馆许可证,以验证谷歌是否同意。@sagis+1!Thanx,这是一个有趣的观点。你确定proguard没有源代码就不能处理JAR文件吗?我认为它只使用了.class文件而不是.java文件。这是一个很好的解决方案,推荐使用,并且可以正常工作。这会导致com.android.dx.cf.iface.ParseException:类名(com/google/ads/AdRequest$ErrorCode)与路径(google play services/com/google/ads/AdRequest$ErrorCode.class)不匹配。有什么想法吗?
compile 'com.google.android.gms:play-services-ads:6.+'