AdMob Extension - open source now

Defold version: 1.2.157. Empty project, just init and extensions. Used native extensions: AdMob and Facebook. Builded on Mac

Attempting to use both extensions at the same time creates a crash:

2019-06-30 11:42:58.407 2633-2633/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.dragosha.fbtest, PID: 2633
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/facebook/FacebookActivity;
        at com.facebook.internal.Validate.hasFacebookActivity(Validate.java:175)
        at com.facebook.FacebookSdk.sdkInitialize(FacebookSdk.java:198)
....
full log attached below

Final AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dragosha.fbtest"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="26" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- For GCM (push) -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name="android.support.multidex.MultiDexApplication"
        android:hasCode="true"
        android:icon="@drawable/icon"
        android:label="fbtest" >

        <!-- For Local Notifications -->
        <receiver android:name="com.defold.push.LocalNotificationReceiver" >
        </receiver>

        <!-- For Google Play Services -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <!-- Disable Firebase Analytics -->
        <meta-data
            android:name="firebase_analytics_collection_deactivated"
            android:value="true" />

        <activity
            android:name="com.dynamo.android.DefoldActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:label="fbtest"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
            <meta-data
                android:name="android.app.lib_name"
                android:value="fbtest" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.defold.iap.IapGooglePlayActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="IAP"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
        </activity>

        <!-- For local and Firebase notifications -->
        <activity
            android:name="com.defold.push.PushDispatchActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="com.defold.push.FORWARD" />

                <category android:name="com.defold.push" />
            </intent-filter>
        </activity>

        <!-- For Firebase Cloud Messaging -->
        <service
            android:name="com.defold.push.FirebaseMessagingService"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <service
            android:name="com.google.firebase.messaging.FirebaseMessagingService"
            android:exported="true" >
            <intent-filter android:priority="-500" >
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <service
            android:name="com.google.firebase.components.ComponentDiscoveryService"
            android:exported="false" >
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.analytics.connector.internal.AnalyticsConnectorRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
        </service>

        <receiver
            android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="com.dragosha.fbtest" />
            </intent-filter>
        </receiver>

        <!-- For IAC Invocations -->
        <activity
            android:name="com.defold.iac.IACActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:launchMode="singleTask"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="com.dragosha.fbtest" />
            </intent-filter>
        </activity>

        <!-- For Amazon IAP -->
        <receiver android:name="com.amazon.device.iap.ResponseReceiver" >
            <intent-filter>
                <action
                    android:name="com.amazon.inapp.purchasing.NOTIFY"
                    android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY" />
            </intent-filter>
        </receiver>
        <!-- ********************* firebase ********************* -->
        <!-- Include the AdActivity and InAppPurchaseActivity configChanges and themes. -->
        <activity
            android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:theme="@android:style/Theme.Translucent" />
        <activity
            android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity"
            android:theme="@style/Theme.IAPTheme" />
        <activity
            android:name="com.google.android.gms.common.api.GoogleApiActivity"
            android:exported="false"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
            android:enabled="true"
            android:exported="false" >
        </receiver>
        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver"
            android:enabled="true"
            android:permission="android.permission.INSTALL_PACKAGES" >
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.google.android.gms.measurement.AppMeasurementService"
            android:enabled="true"
            android:exported="false" />

        <provider
            android:name="com.google.firebase.provider.FirebaseInitProvider"
            android:authorities="com.dragosha.fbtest.firebaseinitprovider"
            android:exported="false"
            android:initOrder="100" />
<!--  Internal (not exported) receiver used by the app to start its own exported services without risk of being spoofed. -->
        <receiver
            android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
            android:exported="false" />
<!--  FirebaseInstanceIdService performs security checks at runtime, no need for explicit permissions despite exported="true" -->
        <service
            android:name="com.google.firebase.iid.FirebaseInstanceIdService"
            android:exported="true" >
            <intent-filter android:priority="-500" >
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>

        <meta-data
            android:name="com.facebook.sdk.ApplicationName"
            android:value="fbtest" />

        <activity
            android:name="com.defold.facebook.FacebookActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="fbtest"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    </application>

</manifest> <!-- END_INCLUDE(manifest) -->

Test project for reproduce:
fbtest.zip (73.6 KB)
logcat.txt (24.9 KB)


works ok if used only AdMob or Fb.

1 Like

The problem on Admob extension side: it excludes internal Google Play Services and replaces them with own GPS. It seems like some of jar files wasn’t added or new GPS removed some of the deprecated methods that used in old facebook versions.
I’ve tried to add my jars in Admob NE extension instead of some Admob jar - and it works fine (it’s dirty version, I added a lot of unneeded jars, just for fast testing, pls don’t use the same set of jars in production):


I hope it helps @sergey.lerg to find the reason and fix it.

2 Likes

Thanks to @AGulev I noticed that Google Play Services have been updated inside Defold, so I can try the normal approach of just adding the missing parts instead of replacing everything.
But Defold fails to build the extension. @Mathias_Westerdahl @sven can you please look at it?
The new extension is on a new branch https://github.com/Lerg/extension-admob/tree/dev
Here is the full error message

warning: [options] bootstrap class path not set in conjunction with -source 1.6

I created an issue about uninformative error message when the extension jar files have conflicts: Issue-#3182(#3182 , old tracking number: DEF-3878)

2 Likes

In this case, instead of play-services-measurement-sdk-16.5.0.jar and play-services-measurement-sdk-api-16.5.0.jar use com-google-android-gms-play-services-measurement-sdk-api-play-services-measurement-sdk-api-16.3.0.jar

1 Like

How I found where the problem (maybe it would be useful for somebody)…
We can’t be sure, that here we have a full list of dependency because of Gradle download all dependencies. How to check them:

  1. Download pompom script by @britzl (Thanks!)
  2. From the list of includedlibraries for Android I took the main dependencies (I hope so:) ):
    com.google.android.gms:play-services-base:16.0.1 and com.google.firebase:firebase-core:16.0.7
  3. Download them using pompom:
python pompom.py --pom https://maven.google.com/com/google/android/gms/play-services-base/16.0.1/play-services-base-16.0.1.pom --out play_services poms
python pompom.py --out play_services -apv 28 deps
python pompom.py --pom https://maven.google.com/com/google/firebase/firebase-core/16.0.7/firebase-core-16.0.7.pom --out firebase poms
python pompom.py --out firebase -apv 28 deps
  1. Download dependency for AdMob:
python pompom.py --pom https://maven.google.com/com/google/android/gms/play-services-ads/17.2.1/play-services-ads-17.2.1.pom --out ads poms
python pompom.py --out ads -apv 28 deps
  1. Check what we already have in the engine (folder firebase and play_services) and what we need to add to the extension:

It looks terrible right now (it is), but for now (before we exclude GPG from the engine) it’s the one way I know, if somebody knows better, pls share with me.

3 Likes

EXTENSION UPDATE

Fixed conflicts with other extensions.
Now you don’t need to specify App Manifest file in game.project. Remove it.

At the moment, bundling for Android is not working on Windows due to resource bundling bug in Defold. It’s being worked on.

8 Likes

Recently, I noticed that GitHub is getting slower at providing the master.zip file of the repo. Sometimes it takes up to two minutes to open a project. (I don’t exclude that it might be a CDN problem related to my region).

Would it be possible to create a release on GitHub so we can reference that specific zip file (which is usually generated faster) in the game.project file?

More than that, it would allow to easily use a specific version of the extension in the future :smiley:

2 Likes

Will do that once I resolve one outstanding issue!

I added a new argument for pompom script --exclude, and now it possible to exclude libraries that already added in Defold or in some other extension automatically (example).
Defold dependencies in exceptions.json file that based on this list https://www.defold.com/manuals/extensions-details/#_android

For now this update available in separate brunch, we will merge it soon:

1 Like

Solved in Defold 1.2.160 has been released

3 Likes

The extension has been updated for Defold 1.2.160 and now you need to specify additional dependency extension:

  • https://github.com/defold/extension-firebase-core/archive/master.zip
7 Likes

With the released Defold 1.2.162, please add now extension-gps to the dependencies.

  • https://github.com/defold/extension-gps/archive/master.zip
6 Likes

Recently, I noticed that GitHub is getting slower at providing the master.zip file of the repo. Sometimes it takes up to two minutes to open a project. (I don’t exclude that it might be a CDN problem related to my region).

Would it be possible to create a release on GitHub so we can reference that specific zip file (which is usually generated faster) in the game.project file?

Any update on this? :wink: Unfortunately GitHub is still pretty slow to generate the master.zip file runtime (up to 5 minutes sometimes).

That can’t be right. It must be the download that is slow. On a decent connection it takes just a few seconds. From where and using what kind of connection does it take 5 minutes?

Oh, I just saw that you asked specifically for a release. You could fork the repo and make your own release.

1 Like

If you only worry about download speed just download the extension manually and unpack it into your project. This way it won’t be downloading at startup at all.

I think the problem is that github re-generates/doesn’t cache the master.zip but keeps static release zips? So it adds extra wait time. This would be worth testing to see if there is actually a difference.

That would be a very stupid thing not to do… Personally for me there is no wait time before the download starts.

1 Like

EXTENSION UPDATE

Added support for iOS 13. All apps for iOS must be updated.
Fixes the issue with fullscreen ads not being shown.

Google now requires to put app id into Info.plist file for iOS. See docs to add a section in game.project file.

5 Likes