のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

AdMobサンプルの丸コピは止めて、アプリ起動時間を少しでも短縮する方法

どうものらぬこです。

 

今日はandroidアプリ開発の話です。

 

2014年の夏ごろにリリースした「appSelector.web」というアプリの Ver.2.0を先日リリースさせていただきました。

満を期してリリースしたはずの Ver.2.0 で、android 8.0以降で動作しないという大罪を犯したりと、ちょっとやらかしてしまいましたが、現在はしっかりと安定したものがリリースされているはずでございます。

 

https://play.google.com/store/apps/details?id=com.house.noranuko.easyapplauncher

 

さて、このアプリ、収益源は広告収入となっており(インストール数が少ないので収益額は尺取り虫の涙程度なんですけど)、アプリを立ち上げると下の方にバナー広告がでーんっと居座っているような形になっております。

 

ちなみに、広告配信は AdMobを利用させていただいております。 

一応今回は開発向け記事なんですが、AdMobの利用開始手順等は、特に書きたい話でもないので、このへんはサクッと省略させていただきます。

 

AdMobの実装サンプルサイトに掲載されている初期化コードはこんな感じです。


public class MainActivity
    extends AppCompatActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        MobileAds.initialize(this, "ca-app-pub-1234567890");
        AdRequest adRequest =
            new AdRequest.Builder()
            .addTestDevice("1234567890ABCDEF").build();
    AdView adView = dataBinding.adBanner;
    adView.loadAd(adRequest);
}

 

パブリッシャーIDを自分のアカウントと紐づいた値に置き換えるだとか、AndroidManifest.xmlになんか書かなきゃいけないだとか、build.gradleに依存関係追記しないといけないだとか、やることはほかにもいくつかありますが、Javaコードの実装はこれだけです。


公式サンプルも大体こんな感じだったと思います。

 

広告を表示するための下準備は非常に簡単なのですが、最初に必ず呼び出さなければならないMobileAds.initialize(); のメソッド呼び出し、こいつが結構重いのです。

実行時間を計ってみたところ、僕の環境では約0.8秒から1.0秒、さらにその下の AdViewの初期化も合わせると1.5秒くらいかかっている印象です。

もちろん、起動時に行う初期化処理は広告表示のための処理以外にもいろいろあるわけで、「appSelector」の場合、起動に約2秒以上はかかっていました。

 

ユーザがアプリを立ち上げたら、すぐに画面が表示され、すぐに操作できる状態にしたいようなツール系アプリで、起動に2秒は結構致命的かなと。

 

ということで、どうにかする方法を考えました。

 

起動時間を短縮したい。

一番時間がかかっているのは広告の初期化。

onCreateから広告初期化ロジックを削除して、代わりに AsyncTaskLoader あたりでバックグラウンドで実行。loadFinished で adView.loadAd() すればいいんじゃないかな?

 

やってみた。


public class MainActivity
    extends AppCompatActivity
    implements LoaderManager.LoaderCallbacks {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getLoaderManager().initLoader(0, new Bundle(), this);
    }
    
    public static class MobileAdsInitializer
            extends AsyncTaskLoader {

        public MobileAdsInitializer(Context context) {
            super(context);
        }

        @Override
        public Void loadInBackground() {
            MobileAds.initialize(
                getContext(), "ca-app-pub-1234567890");
            return null;
        }

        @Override
        protected void onStartLoading() {
            forceLoad();
        }
    }

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {
        return new MobileAdsInitializer(this);
    }

    @Override
    public void onLoadFinished(Loader loader, Void v) {
        AdRequest adRequest =
            new AdRequest.Builder()
            .addTestDevice("1234567890ABCDEF").build();
        AdView adView = dataBinding.adBanner;
        adView.loadAd(adRequest);
    }

    @Override
    public void onLoaderReset(Loader loader) {
    }
}

 Loaderの実装がかなり適当で恐縮ですが、大体こんな感じです。

 

結果。

 

ログを取って検証してみました。

f:id:noranuk0:20181127230556p:plain

Application.onCreate の処理が開始された時間から、MainActivity.onCreate 処理の完了時間の差分を取って初期化処理の実行時間を測定してみたところ、起動時間が 2.1秒から0.6秒に短縮されたことがわかります。

 

アプリ起動後、広告が表示されるまでに若干時間が空いてしまったりといった弊害(?)もありますが、起動時間を短縮させることによってユーザビリティーは向上したと考えてよいと思います。

 

今回は、アプリケーションの主要機能とは無関係の個所の処理(広告表示まわり)を遅延することで、アプリの起動時間を短縮してみたお話でした。

 

今回の記事がどなたかのご参考になりましたら幸いです。

 

 

 

 

お読みいただいてありがとうございました。