安卓AdMob内存使用情况

22

我对 AdMob SDK 使用的内存量及其实际位置感到困惑。让我解释一下。

我的应用有两个版本:免费版和付费版。免费版有AdMob广告,其他代码与付费版几乎相同(使用常见的Android库)。

我在 Nexus 4 上运行应用程序(Android 4.2.1),并比较内存使用情况。

  • 我查看了设备设置 > 应用程序 > 运行中 的应用程序使用的系统内存。
  • 我还查看了 Dalvik 堆内存,这是通过 GC logcat 消息和使用 HPROF 文件报告的。

当我运行付费版时,可以看到:

  • 系统内存:约为 16MB
  • Dalvik 堆大小:约为 10MB

当我运行免费版时,可以看到:

  • 系统内存:约为 29MB
  • Dalvik 堆大小:约为 11MB

换句话说,Dalvik 堆大小对于两个版本都很相似。但实际使用的 系统内存较高10MB+

经过花费时间学习内存分析 (http://www.youtube.com/watch?feature=player_embedded&v=_CruQY55HOk),以及数小时查看 HPROF 文件以消除任何可能的泄漏后,我只能得出一个结论:

AdMob 使用的额外的 10MB 系统内存实际上是本地内存,使用 malloc 分配,在 dalvik 堆之外分配!

现在我想知道两件事:

  1. 由于免费版系统内存比付费版大 10MB,我认为它更容易在内存压力下被操作系统关闭。或者安卓操作系统只考虑 Dalvik 堆来决定杀掉哪个应用程序?
  2. 有没有一种方法可以调整 AdMob SDK 以选择允许分配多少内存?
感谢您的支持。

嗨,由于我遇到的一个错误,我对建议的处理程序方式进行了更新!请查看我的帖子中的更新2! - madlymad
2个回答

14
AdMob使用WebView加载广告。这是一个相当复杂的对象,它利用本地库,并容易崩溃。 AdMob SDK非常努力地尝试使其可管理,但您实际上无法控制其工作方式。此外,内存使用可能会因广告类型而异:HTML文本广告与带有图像的横幅广告等。因此,除非您愿意二进制修补AdMob(它不是开源的),否则您只能接受它。您可以主动删除和销毁AdView以减少任何泄漏,但没有更多可以做的了。

9

我测试了两种不同的AdMob实现方式,发现通过Java代码实现而非XML对应用程序更加轻量级。

更新1:

您还可以添加自定义监听器以在一定时间后销毁并重新创建,以更好地处理它。服务器端还有一个参数告诉应用程序广告需要多快请求新广告,我不确定它是否存在于所有情况下,但DFP账户中确实存在该参数。

建议实现广告的一个不错的方法是:

new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
    if (!isBeingDestroyed) {
        final AdRequest adRequest = new AdRequest();
        final AdView adView = (AdView) findViewById(R.id.ad);
        adView.loadAd(adRequest);
    }
}).sendEmptyMessageDelayed(0, 1000);

不要忘记在onDestroy()活动中调用adView.destroy(),或者当您不再需要它时!

上述方法在此处提到,其中包含许多有用的内存释放信息!


更新2:(对更新1进行改进)

对建议的处理程序方式进行了改进。使用该方式可以避免(希望如此)当有意创建/销毁延迟消息之前,处理程序回调可能会被堆叠的情况。如果您决定增加1000毫秒,则更有可能发生这种情况:

为处理程序创建一个字段:

private adHandler;

在你的onCreate方法中:

adHandler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        if (!isBeingDestroyed) {
            final AdRequest adRequest = new AdRequest();
            final AdView adView = (AdView) findViewById(R.id.ad);
            adView.loadAd(adRequest);
        }
        return false;
    }
});
adHandler.sendEmptyMessageDelayed(0, 1000);

在您的onDestroy方法中不要忘记 “释放” handler:
adHandler.removeCallbacksAndMessages(null); 

null会删除所有回调函数,请参考文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接