Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用google-play-services_lib添加admob广告后,Android应用程序大小增加_Android_Admob_Proguard - Fatal编程技术网

在使用google-play-services_lib添加admob广告后,Android应用程序大小增加

在使用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广告)。
除了我在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.+'