AndroidManifest.xml に Admob application ID の記述が必須になったとさ

こんなエラーメッセージ。


E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ru.balumates.balu, PID: 4409
    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException:

    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************


        at android.app.ActivityThread.installProvider(ActivityThread.java:6242)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5805)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5722)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.IllegalStateException:

    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************


        at com.google.android.gms.internal.ads.zzmn.attachInfo(Unknown Source:17)
        at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(Unknown Source:3)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6239)
        	... 10 more
Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'

Google Mobile Ads SDK v17.0.0 以降で必須だと。

Google Ads Developer Blog: Announcing v17.0.0 of the Android Google Mobile Ads SDK

このことは、


implementation "com.google.firebase:firebase-ads:17.0.0"

も同じ。

以下、AndroidManifest.xml の必須記述。


<manifest>
  <application>
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-################~##########"/>

  </application>
</manifest>

Ad Manager や NativeAppInstallAd / NativeContentAd も注意が必要な模様。


Admob firebase-ads:15.0.1 でメモリーリークする

なんか以前からよくリークしてましたよね、Admob。

今回は, 以下バージョン。


implementation "com.google.firebase:firebase-core:15.0.2"
implementation "com.google.firebase:firebase-ads:15.0.1"

Activity#finish()後、

百発百中でLeakCanaryが鳴く。

情報はないか、と探すが古いものばかり。

最新の公式サンプルを見る。

BannerExamples

advanced-APIDemo

BannerRecyclerViewExample

AndroidManifest.xmlの「INTERNET」関連の2行はもう不要だったり。

サンプル通りライフサイクル周り記述しても消えやしない。

百発百中でアウトでござる。


// Called when leaving the activity
public override fun onPause() {
    ad_view.pause()
    super.onPause()
}

// Called when returning to the activity
public override fun onResume() {
    super.onResume()
    ad_view.resume()
}

// Called before the activity is destroyed
public override fun onDestroy() {
    ad_view.destroy()
    super.onDestroy()
}

公式サンプルの中に以下を見つけた。


if (adView.getParent() != null) {
  ((ViewGroup) adView.getParent()).removeView(adView);
}

RecyclerViewAdapter.java#L146-L148

ぶら下がったままだった模様。

以下で完。


inline fun AdView.remove() {
  if (parent != null) {
    (parent as ViewGroup).removeView(this)
  }
}

最初のライフサイクル周りは、

公式マニュアル通り不要だったりしたが。


Admob メディエーション 「eCPM Floor」正式版をローンチ

6/22 で ベータ版は終了となるそうな.

admob

admob1

US版では もうかなり昔に終了していたらしいけども.

Admobメディエーションで,「Admobネットワーク」と「eCPM Floor」を併用できるようになっている.

AdMob

よって, 高価格入札を狙いつつ, 他社ネットワークと競合させることができる. ということなのか.

大丈夫かな, 純国内広告ネットワーク.

AdMob ネットワークの eCPM Floor をベータ版から更新する - AdMob ヘルプ


java.lang.NoClassDefFoundError: android/os/AsyncTask がでてるけど

こゆのでてない?

java.lang.NoClassDefFoundError: com.myapp.MyClassExtendingAsyncTask
at com.myapp.x.run(SourceFile:417)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3859)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.myapp.MyClassExtendingAsyncTask in loader dalvik.system.PathClassLoader[/data/app/com.myapp-1.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)

あたし的には, 2.x 系ででてるけど, それだけではないのか.

java.lang.NoClassDefFoundError: android/os/AsyncTask - Google グループ

Issue 81083 - android - java.lang.ClassNotFoundException: android.os.AsyncTask caused by AdMob / Google Play Services - Android Open Source Project - Issue Tracker - Google Project Hosting

解決方法としては以下が挙げられてる.

try
{
Class.forName("android.os.AsyncTask"); //it prevents AdMob from crashing on HTC with Android 4.0.x
}
catch(Throwable ignored)
{}

The AsyncTask class must be loaded on the UI thread. This is done automatically as of JELLY_BEAN.

これはどこがアナウンスするべきなのだろうか.

他にもいろいろあるような気もするけども.

java - What is the difference between NoClassDefFoundError and ClassNotFoundException? - Stack Overflow


Admob 以外の広告SDKはすべてリジェクトされるのだろうか?

Google Adsense (Admob) 以外のアプリ広告業者からメールがきました.

*** は広告業者名.

2014年8月1日より施行されるGoogle Playの新ポリシーにより、
*** の旧バージョンSDKを搭載された状態のアプリを新規及び更新アプリとしてストア申請した場合、
リジェクトの対象となる恐れが出て参りました。
つきましては ***SDK のアップデートをお願いしたく、メディアの皆さまにご連絡させて頂きました。

2014年8月1日以降、Googleの指定する"広告ID"以外のIDを広告表示に利用するアプリを、
新規もしくは更新の審査に申請した場合、Googleによりポリシー違反と判断され、
アプリがリジェクトされる可能性がございます。

Google_Play

「ID」という概念をもつ「SDK」を利用しているアプリは, 果たしてすべてリジェクトされるの?

再度, 公式ポリシーを見てみる.

Google Play

5. Android 広告 ID の使用

Google Play 開発者サービス バージョン 4.0 では、広告と分析のプロバイダが使用する新しい API と ID が導入されました。この API と ID を使用するための規約は以下のとおりです。

使用: Android 広告 ID は広告とユーザーの分析以外で使用してはいけません。ID の各アクセスで [インタレストベース広告をオプトアウト] 設定のステータスを確認する必要があります。
個人を特定できる情報またはその他の ID との関連付け: 広告 ID をユーザーの明示的な同意なしに、個人を特定できる情報にリンクしたり、永続的なデバイス ID(例: SSAID、MAC アドレス、IMEI など)に関連付けたりしてはいけません。
ユーザーの選択を優先: リセットする際にユーザーの明示的な同意なしに、新しい広告 ID を以前の広告 ID や以前の広告 ID からのデータにリンクしてはいけません。さらに、ユーザーの [インタレストベース広告をオプトアウト] 設定を遵守する必要があります。ユーザーがこの設定を有効にした場合は、広告目的でユーザーのプロフィールを作成したり、ユーザーをインタレスト ベース広告のターゲットに設定したりするために広告 ID を使用してはいけません。ただし、コンテンツ ターゲット広告、フリークエンシー キャップ、コンバージョン トラッキング、レポート、セキュリティや不正行為の検出などに使用することはできます。
ユーザーに対する透明性: 広告 ID の収集と使用、その規約への同意について、法的に適切なプライバシー通知でユーザーに公開する必要があります。
利用規約の遵守: 広告 ID はその利用規約を遵守する場合にのみ使用できます。貴社のビジネスで共有する可能性のある団体が使用する場合も同様です。2014 年 8 月 1 日から、Play ストアにアップロードされたすべての更新や新着アプリには、広告目的で使用する端末 ID として広告 ID(端末で利用可能な場合)を使用する必要があります。

要するに, 「広告に関しての情報はすべて Google が把握しますよ」ということなのか.

他にもたくさんSDKを配布している広告業者はいるはずなんだけども.

8/1 以降, どれくらい Google Play Store に変化があるのだろうか.

【 Android_ID / IMEI を使ったらアウト?! 】8/1 以降 「端末の特定」はすべて Google「広告ID」経由に