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

标签 android admob proguard

我将发布我的应用的两个版本,付费版和免费版(带有 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状态:

The client library has a light footprint if you use ProGuard as part of your build process, so it won't have an adverse impact on your app's file size.

而且我找不到它的指南!

最佳答案

与proguard无关。 如您所知,Google Play 服务是封闭源代码。没有源码proguard无法处理 代码。但您可以手动缩小它。

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

在google play service的文件夹下,一般是sdk\extras\google\google_play_services \libproject\google-play-services_lib\libs\, 用 7zip 等 zip 文件管理器打开 google-play-services.jar,你可以找到很多 如果您只使用广告,则诸如 map ,游戏之类的文件夹对您毫无用处。所以就 删除它们。小心保留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

关于使用 google-play-services_lib 添加 admob 广告后 Android 应用程序大小增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21555662/

相关文章:

android - AdMob 未在 ionic /Angular 应用中加载广告

java - 如何配置 ProGuard 以尊重 Jackson 模型?

android - nfc p2p 通信 arduino 到 arduino

java - 为什么即使在 settings.xml 文件中声明了 PreferenceCategory 的摘要也没有得到它?

Android AdMob addTestDevice 没有在 logcat 中获取 deviceID

java - Proguard while Butterknife 库和其他警告

android - Dexguard vs Android 插件 - 中断构建过程

在 ListView 中带有选取框的 Android TextView 第一次显示时不会设置动画

java - JNI 将字符串从 java 传递到 c++,然后将 c++ 字符串传递给字符串数组

swift - 在真实设备上展示测试广告