Apple Spider (Casual arcade action)

Congratulations!

What was the effect of localisation on revenue from Brazil, if you don’t mind?

1 Like

Congratulations!

Could you share some details on these crashes?

1 Like

Brazil is consistently in the top 2 countries for ad views and downloads. Unfortunately the eCPM for those ads is low, so they haven’t impacted my revenue much.

The united states provides most of my revenue, with far fewer ad views. Japan is #2 for revenue in the last 90 days.

I still think it was the right thing to do, of course. I think it’s really neat that the people of Brazil continue to enjoy the game in their native language! They’re friendly, and most give me good reviews.

3 Likes

I’ll be happy to send you what I can. The Play Console is light on details, unfortunately.

With Instant apps, they must wrap your code in their own libraries, since some of the crashes appear to be Google’s fault.

Screenshot below of the top offenders. I’ve been plagued by most of these for months, with really useless stack traces. I never know if it is Defold or one of my dependencies (like unity ads, GPGS).

@britzl

Here’s an example stack trace that I’ve been getting since I released to production last year.

This one happened on Android 11, affecting a few hundred people yesterday. The devices are quite varied. The usual mix of Chinese ones, but also several Samsung models.

java.lang.NoClassDefFoundError: 
  at androidx.core.view.ViewCompat.<clinit> (ViewCompat.java:1199)
  at androidx.core.view.ViewCompat.dispatchUnhandledKeyEventBeforeHierarchy (ViewCompat.java:3802)
  at androidx.core.view.KeyEventDispatcher.dispatchBeforeHierarchy (KeyEventDispatcher.java:63)
  at androidx.core.app.ComponentActivity.dispatchKeyEvent (ComponentActivity.java:137)
  at com.android.internal.policy.DecorView.dispatchKeyEvent (DecorView.java:403)
  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent (ViewRootImpl.java:6090)
  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:5958)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5451)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5508)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5474)
  at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:5626)
  at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5482)
  at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:5683)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5455)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5508)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5474)
  at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5482)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5455)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5508)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5474)
  at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:5659)
  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent (ViewRootImpl.java:5819)
  at android.view.inputmethod.InputMethodManager$PendingEvent.run (InputMethodManager.java:3210)
  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback (InputMethodManager.java:2752)
  at android.view.inputmethod.InputMethodManager.finishedInputEvent (InputMethodManager.java:2743)
  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished (InputMethodManager.java:3187)
  at android.view.InputEventSender.dispatchInputEventFinished (InputEventSender.java:143)
  at android.os.MessageQueue.nativePollOnce (Native Method)
  at android.os.MessageQueue.next (MessageQueue.java:335)
  at android.os.Looper.loop (Looper.java:193)
  at android.app.ActivityThread.main (ActivityThread.java:7861)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:600)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:967)

One more that I get all the time. Feels like it’s the OS’s fault, but it’s hard to say.

android.os.BadParcelableException: 
  at android.os.Parcel.readParcelableCreator (Parcel.java:3376)
  at android.os.Parcel.readParcelable (Parcel.java:3284)
  at android.os.Parcel.readValue (Parcel.java:3186)
  at android.os.Parcel.readArrayMapInternal (Parcel.java:3579)
  at android.os.BaseBundle.initializeFromParcelLocked (BaseBundle.java:292)
  at android.os.BaseBundle.unparcel (BaseBundle.java:236)
  at android.os.Bundle.filterValues (Bundle.java:394)
  at android.os.Bundle.filterValues (Bundle.java:404)
  at android.content.Intent.removeUnsafeExtras (Intent.java:9228)
  at android.app.ActivityThread.handleRequestAssistContextExtras (ActivityThread.java:4116)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2264)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:246)
  at android.app.ActivityThread.main (ActivityThread.java:8587)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)

Hmm, not sure what’s going on. What is the exact setup you have? Extensions. Defold version.

I’ve been seeing that same error across Defold versions.

I believe the current production release is 1.2.185.

The instant app version is older, last updated on May 27, and was probably using the latest Defold at the time.

Full dependencies below. The first 5 have been in my game since it was released, and I’ve seen similar errors the whole time. Just getting a lot more right now thanks to the increased plays from being featured. Nice problem to have?

dependencies#0 = https://github.com/rgrams/rendercam/archive/v1.0.2.zip
dependencies#1 = https://github.com/AGulev/DefVideoAds/archive/3.7.2.zip
dependencies#2 = https://github.com/defold/extension-gpgs/archive/2.2.0.zip
dependencies#3 = https://github.com/subsoap/defsave/archive/v1.2.1.zip
dependencies#4 = https://github.com/defold/extension-iap/archive/2.0.2.zip
dependencies#5 = https://github.com/defold/extension-review/archive/3.0.1.zip
dependencies#6 = https://github.com/subsoap/defglot/archive/master.zip

Feature Followup

It’s been quite a fun two weeks since the game was featured on the Play Games app! I’ve basically been glued to the Google Play and Unity Ads dashboards.

Prior to being featured, I had a pretty small amount of players, and therefore small daily revenue from ads & IAP. I never put any effort into advertising or promotion, so that was expected.

During the feature, I was blown away. Now that it’s over, I’m really curious about the long term effects. The daily downloads and amount of ratings shot way up, so my suspicion is this will help the game be more discoverable by the Play Store algorithms.

Fun numbers:

  • Day 1 of being featured: Over 100,000 instant game launches! :astonished:
  • Over 6,400 active installs on Android (only had 450 before)
  • 180 ratings on the Play Store (I think I only had 40 before)
  • Rewarded Ad videos are 91.4% of the ad revenue.
  • USA has given the most ad revenue, despite being 4th in the impressions ranking
  • Brazil has the most ad impressions in the last 30 days, but ranks 5th for revenue (low eCPM). Translating to Portuguese has definitely paid back the small investment by now.

Most of the graphs look like below. Huge spike, then a gradual drop to what I hope is the new normal for a while, significantly higher than before. I’m really excited, and see real potential now in this silly game.
image

Game Updates

I received some helpful feedback in one or two of the user reviews, so I am going to make a few updates.

First requested update: When you reach the maximum number of spiders, give the player a few seconds to “save” the run. As it was, the game immediately went to Game Over when you reached the maximum spiders, but with all of the chaos and coordination involved to user the rain or bug spray, it can be unforgiving.

To implement this, I’m effectively starting a 3 second timer after you reach the max spiders, and enabling some UI cues.

  • Big WARNING! label, which animates the scale slightly
  • Full screen GUI box node, set to partly transparent red, with Additive blending. Animated from red to transparent for that classic game warning feel.

10 Likes