【问题标题】:Android app size increased after adding admob ads using google-play-services_lib使用 google-play-services_lib 添加 admob 广告后,Android 应用程序大小增加
【发布时间】:2014-02-04 14:50:59
【问题描述】:

我将以两个版本发布我的应用,包括付费版和免费版(带有 AdMob 广告)。
除了我在 AdMob 服务的免费版本中使用的 google-play-service_lib 之外,这两个版本完全相同。

使用 proguard 后的最终 apk 大小为:
付费版 1.301.435 字节
广告版本为 1.946.634 字节

在免费版本中,我只显示插页式广告。

这是我相对于 google-play-service_lib 的 proguard 设置

-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 标志或什么?

编辑

使用apktool,我发现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 看到它!)和

 -whyareyoukeeping class com.google.android.gms.games.Games

 [proguard] Explaining why classes and class members are being kept...
 [proguard] Printing usage to [...../bin/proguard/usage.txt]...

这里没有提到给定的类。

我放弃了,对于一个插页式广告,我的应用程序将其大小增加了 50%,尽管 Google about GPS 声明:

如果您使用 ProGuard 作为一部分,客户端库的占用空间很小 你的构建过程,所以它不会对你的 应用的文件大小。

而且我找不到它的指南!

【问题讨论】:

  • 不是一个真正的解决方案,只是可能有所帮助:您可能可以删除 drawable-XXXX 文件夹。它们仅包含登录/退出和 +1 按钮图像。我会检查库许可证以验证 Google 是否可以。
  • @sagis +1!谢谢,这是一个有趣的观点。

标签: android admob proguard


【解决方案1】:

这与proguard无关。 如您所知,google play 服务是封闭源代码。 proguard 无源无法处理 代码。但你可以手动缩小它。

1、从jar文件中删除未使用的类

在 google play 服务的文件夹中,通常是 sdk\extras\google\google_play_services \libproject\google-play-services_lib\libs\, 用 7zip 等 zip 文件管理器打开 google-play-services.jar,你会发现很多 如果您只使用广告,诸如地图,游戏等女巫的文件夹对您毫无用处。所以就 删除它们。注意保留ads、common、dynamic、internallocation文件夹,否则在展示广告时会收到NoClassDefFoundError的fc。

2,如果您只使用广告,请从 res 文件夹中删除未使用的资源。

google-play-services_lib\res 文件夹中的许多资源对您没有用处,您可以将其删除。比如 values-af, values-am, .... 你需要保留的是 color, drawable, drawable-hdpivalues 文件夹。

3,现在刷新并在你的 Eclipse 中构建 google-play-services_lib 项目,然后刷新 并再次构建您的项目。现在你会发现 apk 的大小变小了。我的大小 apk在proguard之前从902kb下降到480kb,在proguard之后下降到330kb

【讨论】:

  • 你确定 proguard 不能处理没有源代码的 JAR 文件吗?我认为它只使用 .class 文件而不是 .java 文件。
  • 很好的解决方案,推荐和工作。比为依赖项或多 dex 设置 Gradle 快得多。
  • 这会导致 com.android.dx.cf.iface.ParseException: 类名 (com/google/ads/AdRequest$ErrorCode) 与路径不匹配 (google-play-services/com/google /ads/AdRequest$ErrorCode.class)。有什么想法吗?
【解决方案2】:

你是否在 build.gradle 文件中使用了这一行?

compile 'com.google.android.gms:play-services:6.+'

如果是,则补充这一行

compile 'com.google.android.gms:play-services-ads:6.+'

它将应用程序的大小减少了大约 600kb。

【讨论】:

    【解决方案3】:

    您的 proguard 配置的其他部分导致 GPS 类被保留。

    看看Proguard Usage 尤其是选项

    -whyareyoukeeping class_specification

    如果你自己无法发现,你可以用它来告诉你为什么要保留特定的课程。

    【讨论】:

    • 谢谢,我去看看。
    • 现在我的问题是:如何知道我实际上不需要的保留类是什么?
    • 您需要专门保留任何可能通过反射构造的类。即活动或从 XML 引用的其他类。其余的可以由 Proguard 在创建它的依赖图时计算出来。
    • 好吧,我只需要展示 AdMob 插页式广告,不要使用任何 XML。我将 com.google.android.gms.ads.* 导入到我的代码中,仅此而已。
    • 我尝试使用带有 -whyareyoukeeping 类 com.google..android.gsm.*... 的 proguard 来自 eclipse->file->export,我在哪里可以找到输出?控制台没有显示任何新内容...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多