Android AdMob内存使用情况

时间:2013-01-29 13:25:00

标签: android memory admob

我对 AdMob SDK 似乎正在使用的内存量以及此内存的实际位置感到困惑。让我解释一下。

我的应用程序有两种风格:免费和付费。免费版有AdMob广告,否则代码几乎相同(使用常见的Android lib)。

我在Nexus 4(Android 4.2.1)上运行应用程序并比较内存使用情况。 我查看应用程序在设备设置中使用的系统内存>应用>运行。 我还查看GC logcat消息报告的Dalvik堆内存,并使用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 比付费版本更容易被操作系统杀死,以防万一 内存压力。或者Android操作系统是否只考虑在内 Dalvik堆用于决定杀死哪个应用程序?
  2. 有没有办法调整AdMob SDK以选择它的内存量 允许分配?
  3. 非常感谢

2 个答案:

答案 0 :(得分:13)

AdMob使用WebView加载广告。这是一个非常复杂的对象,它使用本机库,并且容易崩溃。 AdMob SDK非常难以使其易于管理,但您实际上无法控制其工作方式。此外,内存使用情况可能因广告类型而异:HTML文本与带图片的横幅等。

所以,除非你愿意二进制补丁AdMob(它不是开源的),否则你只需要忍受它。你可以主动删除和销毁AdView以减少任何泄漏,但你可以做的更多。

答案 1 :(得分:8)

使用2个不同的AdMob实现测试我的应用程序后,我发现通过Java代码而不是XML实现它对应用来说更轻松。

更新No1:

您还可以在一段时间后添加自定义侦听器以进行销毁,并重新创建以便更好地处理它。 Serverside还有一个参数告诉应用广告应该多久要求新广告,我不确定它是否存在于所有情况下,但它适用于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);

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

上面提到的here方法有许多有用的内存版本!


更新No2:更新No1 的改进)

对建议的处理程序方式的改进。 使用这种方式可以避免(我希望)在发送延迟消息之前故意创建/销毁活动时可能堆叠的处理程序回调。如果您决定增加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处,不要忘记“释放”处理程序:

adHandler.removeCallbacksAndMessages(null); 

null删除所有回调,请参阅doc