I get the same error
It seems like we have some difference between Windows and MacOS bundling pipeline in 1.2.157.
I added a ticket Issue-4215
(#4215)
I’ve updated res packaging in the extension. Now it builds with facebook extension on macOS. On Windows it fails with the Theme.IAPTheme res error.
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.
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.
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
)
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
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:
- Download pompom script by @britzl (Thanks!)
- 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
andcom.google.firebase:firebase-core:16.0.7
- 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
- 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
- Check what we already have in the engine (folder
firebase
andplay_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.
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.
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
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:
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
With the released Defold 1.2.162, please add now extension-gps to the dependencies.
https://github.com/defold/extension-gps/archive/master.zip
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? 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.
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.