AdMobサンプルの丸コピは止めて、アプリ起動時間を少しでも短縮する方法
どうものらぬこです。
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の実装がかなり適当で恐縮ですが、大体こんな感じです。
結果。
ログを取って検証してみました。
Application.onCreate の処理が開始された時間から、MainActivity.onCreate 処理の完了時間の差分を取って初期化処理の実行時間を測定してみたところ、起動時間が 2.1秒から0.6秒に短縮されたことがわかります。
アプリ起動後、広告が表示されるまでに若干時間が空いてしまったりといった弊害(?)もありますが、起動時間を短縮させることによってユーザビリティーは向上したと考えてよいと思います。
今回は、アプリケーションの主要機能とは無関係の個所の処理(広告表示まわり)を遅延することで、アプリの起動時間を短縮してみたお話でした。
今回の記事がどなたかのご参考になりましたら幸いです。
Echo Dot (エコードット) 第3世代 (Newモデル) - スマートスピーカー with Alexa、チャコール
- 出版社/メーカー: Amazon
- 発売日: 2018/10/30
- メディア: エレクトロニクス
- この商品を含むブログを見る
お読みいただいてありがとうございました。