aswww log

Webエンジニアの技術録。Linuxとかウェブ制作・ソフト開発とか

AdMob実装で大いにハマった備忘録

AdMobに関係あるのからないのまで。
何日もハマった上にいろんな設定を色々いじって何やったか忘れてしまったので、雑な感じですが備忘録的な感じでなにとぞ。

1).AdMobの実装を一通り終えてbuildしようとしたら以下のエラーが出た。

java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[dex file "/data/data/[パッケージ名].debug/files/instant-run/dex/slice-com.google.firebase-firebase-iid-9.6.1_17f9eed5e9c1fe52c568855cb2090871a90f4031-classes.dex", dex file "/data/data/[パッケージ名].debug/files/instant-run/dex/slice-com.google.android.gms-play-services-ads-9.6.1_1aa317fdb75c8fb2b8ae8bfdfb55c4013d6bc40a-classes.dex"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64, /vendor/lib64, /system/lib64]]

よくわからないけどDexファイルがなんとか?
メモによると以下のとおりMultiDexを設定ファイルに書き加えたらエラー解消したらしい。

build.gradle

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
・・・
        android:name="android.support.multidex.MultiDexApplication"
・・・
    >

参考:
http://qiita.com/nshmura/items/c7e8faa05c5ad4a66b3d#_reference-91cadc916c4dc5fe7d87
https://developer.android.com/studio/build/multidex.html?hl=ja#dev-build


2.)メソッド数が64k(65536)を超えるとビルドエラーになる

具体的なログはロストしてしまったが、65536という数字が出たらきっとこのエラー。
以下のとおり対処を調べた。このうちの1,2,4を実施。
どれかでエラーが解消された。(4かな)

[対処1]. メソッド数の確認
以下、リンク先より抜粋

http://qiita.com/konifar/items/d98c78facbaae63badca
実際どのくらいのメソッド数なのかを確認します。dex-method-countというツールを使うと、簡単にapkのメソッド数を確認できます。

$ git clone https://github.com/mihaip/dex-method-counts.git
$ ./gradlew assemble # ビルド
$ ./dex-method-counts path/to/app.apk # or .zip or .dex or directory
こんな感じで出力されます。まずは出力してみると、節約できるところが見つかるかもしれません。
Read in 60366 method IDs.
<root>: 60366
    : 8
    android: 10815
        accessibilityservice: 6
        accounts: 8
        animation: 2
        app: 351
        bluetooth: 2
        content: 303

...(略)...

    com: 39448

...(略)...

        google: 18513
            ads: 165
                mediation: 134
                    admob: 24
                    customevent: 40
                    jsadapter: 38

[対処2].google playSDKのインストールはやめる
以下、リンク先より抜粋
http://qiita.com/garlicG/items/fac54cf96d66cfcb4b8d

play-service全体のライブラリは少し巨大なので、AdMobだけが必要であれば以下のような記述でおKです。
build.gradle(AndroidStudio利用時)

compile 'com.google.android.gms:play-services-ads:7.3.0'

[対処3].ProGuardを導入する
もうしてました。(デフォルトでそうなってる?)

[対処4]. gradleでjumboModeオプションを有効にする
また以下のリンク先のとおりに修正。
http://qiita.com/konifar/items/d98c78facbaae63badca


3).support-appcompat-v7のFile size 0 byteエラー
buildも通るようになったので、Android Studioからエミュレータ(ADV)起動して確認しようとしたらエラーった。

10-28 22:38:19.568 2306-2306/[パッケージ名].debug E/System: Unable to load dex file: /data/data/[パッケージ名].debug/files/instant-run/dex/slice-com.android.support-appcompat-v7-23.3.0_e72ec210e17d195522eaa56b35521a9733e3c94a-classes.dex
10-28 22:38:19.569 2306-2306/[パッケージ名].debug E/System: java.io.IOException: Failure to verify dex file '/data/data/[パッケージ名].debug/files/instant-run/dex/slice-com.android.support-appcompat-v7-23.3.0_e72ec210e17d195522eaa56b35521a9733e3c94a-classes.dex': Bad file size (32768, expected 550080d)
                                                                         at dalvik.system.DexFile.openDexFileNative(Native Method)


                                                                      Caused by: java.io.IOException: Failed to find dex file 'x-classes.dex' in oat location 'x': Failed to find existing oat file at x: File size of 0 bytes not large enough to contain ELF header of 52 bytes: '/data/data/[パッケージ名].debug/cache/slice-com.android.support-appcompat-v7-23.3.0_e72ec210e17d195522eaa56b35521a9733e3c94a-classes.dex'
	

原因不明。Android Studioの設定から見なおしたけど一向に治らなかった。
AVDを新規作成したらこのエラーが出なくなった。(ソースとかのせいとかじゃなかった。)
こんなのに2日も振り回されて私ってホント馬鹿。

4.)AdMobの実装エラー
やっとまともに起動したAVDで出たエラー。

java.lang.IllegalStateException: The ad size can only be set once on

ad size がなんたら。
以下のとおり、content_main.xml(active_main.xml)とソース内両方でAdsizeを指定したのがまずかった。

content_main.xml

    <com.google.android.gms.ads.AdView
	・・・
        ads:adSize="SMART_BANNER" //これと
	・・・

MainActivity.java

        MobileAds.initialize(this, getString(R.string.banner_ad_unit_id));
        adView=(AdView) findViewById(R.id.adView);
        adView.setAdSize(AdSize.SMART_BANNER);   //これ
	・・・

ソースの方をコメントアウトしたら表示できたよ!
http://stackoverflow.com/questions/23337802/ad-size-and-ad-unit-id-must-be-set-before-loadad-is-called

広告表示でここまで大変なんだなー。AdMob仕様変わらないでほしいな。。。もうやりたくない。。。