Android AdMob内存使用情况

mus*_*ikk 21 memory android 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以选择允许分配多少内存?

非常感谢

Nik*_*kov 13

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

因此,除非您愿意对AdMob进行二进制修补(它不是开源),否则您只需要使用它.你可以AdView主动删除和销毁,以减少任何泄漏,但你可以做的更多.


mad*_*mad 8

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

更新1号:

您还可以在一段时间后添加自定义侦听器以进行销毁,并重新创建以便更好地处理它.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);
Run Code Online (Sandbox Code Playgroud)

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

这里提到上面的方法,有很多有用的内存发布!


更新No2 :( 更新No1的改进)

对建议的处理程序方式的改进.使用这种方式可以避免(我希望)在发送延迟消息之前故意创建/销毁活动时可能堆叠的处理程序回调.如果您决定增加1000毫秒,则更有可能发生这种情况:

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

private adHandler;
Run Code Online (Sandbox Code Playgroud)

在你的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);
Run Code Online (Sandbox Code Playgroud)

在你onDestroy不要忘记"释放"处理程序:

adHandler.removeCallbacksAndMessages(null); 
Run Code Online (Sandbox Code Playgroud)

null删除任何回调,请参阅doc