How to properly include Google Play Services jars?

I am completely stumped with Defold’s behaviour regarding google play services.
There is an official AdMob extension, which builds fine and provides all the required JAR files (google play and support library).

However, if I copy these libs into my project, I can’t build it because of duplicate classes.

Description	Resource	Path	Location	Type
Build server output: javac -source 1.6 -target 1.6 -J-Xms2048m -J-Xmx2048m -classpath /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/android-support-v4.jar:/var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/android.jar:/tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/classes -d /tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/classes @/tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/sources.txt
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warning

jar cf /tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/R.jar -C /tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/classes .

dx -JXms2048m -JXmx2048m --dex --output /tmp/job6530680997829605849/build/classes.dex /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMIronSourceAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMAdMobAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_vungle_publisher-adaptive-id-4.0.3.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_chartboost-6.6.3.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMInMobiAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_applovin-sdk-7.2.0.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/support-v4-24.0.0.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMAppLovinAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-ads-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_tapjoyconnectlibrary.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-tasks-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/jnlua.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-ads-lite-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMChartboostAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_vungle_javax.inject-1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMFacebookAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_InMobi-6.2.4.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMVungleAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/jnlua.dummyloader.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/support-v4_impl-24.0.0.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_FacebookAudienceNetwork.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/gson-2.8.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-basement-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMTapjoyAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_TMUnityAdsAdapter.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_InMobi_picasso-2.5.2.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_ironsource-mediationsdk-6.6.4.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_UnityAds-2.1.0.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-base-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-gass-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/extension.tapdaq.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/adapter_libs_vungle_dagger-2.7.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/play-services-clearcut-10.0.1.jar /tmp/job6530680997829605849/upload/tapdaq/lib/android/tapdaq.jar /tmp/job6530680997829605849/build/tmp644ce6b9-925a-4ed6-bc24-d6eb5dad0ad0rjava/R.jar  /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/facebooksdk.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/bolts-android-1.2.0.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/google-play-services.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/android-support-v4.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/in-app-purchasing-2.0.61.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/glfw_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/facebook_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/gamesys_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/iap_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/push_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/adtruth_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/sound_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/webview_android.jar /var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//share/java/iac_android.jar 
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoIcsImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoJellyBeanMr2;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoStubImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatJellyBeanMr2;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/ActionBarDrawerToggle;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/app/ActionBarDrawerToggle$1;

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
	at com.android.dx.command.dexer.Main.processAllFiles(Main.java:608)
	at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
	at com.android.dx.command.dexer.Main.run(Main.java:277)
	at com.android.dx.command.dexer.Main.main(Main.java:245)
	at com.android.dx.command.Main.main(Main.java:106)
Caused by: java.lang.InterruptedException: Too many errors
	at com.android.dx.command.dexer.Main.processAllFiles(Main.java:600)
	... 4 more

	ext.manifest	/extension-tapdaq/content/tapdaq	Unknown	Problem

If I remove the support library, I get similar errors for google play services stuff.

It’s clear that Defold adds it’s own versions of jars

/var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/google-play-services.jar
/var/extender/sdk/0dde28ca92551934cf34137e33d029cce19b2447/defoldsdk//ext/share/java/android-support-v4.jar

But at the same time the AdMob example builds fine.

Is there a secret switch I have to activate to make it work for me?

@sven, any thoughts?

2 Likes

The secret lies in the “app manifest”.
In the AdMob project, you’ll notice the game.appmanifest, which in turn is referenced in the game.project

In that file, you can specify what jars to exclude from the build.
The file supports: excludeJars, excludeSymbols, excludeLibs, excludeJsLibs
The idea is to allow the user to remove an extension completely from the game.

8 Likes

Holy Pacman! Thanks!

3 Likes