Android 14, SDK 34, Black screen on startup

Hello everyone!

I want to do a closed test of my mobile game on Google Play. I use:
Source Unreal Engine 5.3.2
Android SDK 34
Samsung A54 with Android 14

After showing the start screen the game just shows a BLACK screen on this phone (NOT crashing). It’s important to clarify! The game WORKS completely with the same configuration if the game is NOT launched from Google Play. That is, if you run the Shipping build on the same phone on Android 14 directly from the engine, then everything works fine!

On SDK 33 everything works on the same phone in Google Play. On the same phone, everything worked with SDK 34 when Android 13 was installed on it. This error only occurs on Android 14! I cannot provide logs from the device, since Google Play publishes a Shipping assembly in which the logs cannot be found. I cannot rollback to SDK 33, because I previously published a build with SDK 34. Google prohibits rolling back.

There is a suspicion that this is due to the Google PAD plugin, which does not work correctly with SDK 34 if you download the game from Google Play (for my opinion). Are there any options to solve this problem?

I would be very grateful if you could help me fix this problem.

Hi there! Did you ever find a solution to this? Google has now made it mandatory to update target sdk to 34 and I’m having the exact same issue right now

For anyone else having this problem, just go over to your plugins and disable google PAD. It has some downsides, but it’s still better than being entirely broken and having a black screen :wink:

I have same issue (shipping / development). I see black screen and after 1-2s my game is crashing. On SDK 33 all working fine, but I need upgrade project to 34
I turned off Google PAD and switched to Development Build, remove Intermediate, Saved, BInaries Build folders… Same problem.


UE 5.2.1
Android Studio 4.0

Same issue on Samsung mobile with Android14

Hi, I had a similar bug when I tried to upload game to Google Play Console last year. The game launched completely normally after packaging, but after sending to the console, the game crashed at startup. I was suffering with API 33 then. Now, apparently, the same problem with API 34. If you disable Automatic Integrity Protection in the Google Play console, the game starts normally and does not crash on startup, even if the Google PAD plugin is enabled.

did anyone figure out why this occurs with googlepad? currently android studio is saying something to do with render index 1 and 2, keeps repeating this over and over, it seems maybe googlepad is interfering with the way the unreal app works?

Do u guys have any Save issue in Target SDK 34?
my save game object and files stored in internal directory are not saving

Hope the solution for black screen at startup is already known… just updating the solution for anyone that helps!
I tested it on UE 5.3.2 for Android targetAPI=34, CompileAPI=33, Build Tools=34.0.0, minAPI & NDK API=28 .

============== Add RECEIVER_EXPORTED flag in registerReceiver() ==============

…\Engine\Build\Android\Java\src\com\epicgames\unreal\GameActivity.java.template

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(consoleCmdReceiver, new IntentFilter(Intent.ACTION_RUN), RECEIVER_EXPORTED);
} else {
registerReceiver(consoleCmdReceiver, new IntentFilter(Intent.ACTION_RUN));
}

…\Engine\Build\Android\Java\src\com\epicgames\unreal\BatteryReceiver.java
…\Engine\Build\Android\Java\src\com\epicgames\unreal\HeadsetReceiver.java
…\Engine\Build\Android\Java\src\com\epicgames\unreal\VolumeReceiver.java
…\Engine\Build\Android\Java\src\com\google\android\vending\expansion\downloader\impl\DownloaderService.java

import android.os.Build;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
activity.registerReceiver(receiver, filter, android.content.Context.RECEIVER_EXPORTED);
} else {
activity.registerReceiver(receiver, filter);
}


============== Update billing library version from 6.0.0 to 7.0.0 ==============
…\Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay\Source\OnlineSubsystemGooglePlay_UPL.xml

implementation ‘com.android.billingclient:billing:7.0.0’


1 Like

I don’t see any problem with save game on targetSDK 34 on Android 14 device.

Im trying to implement this solution my app open and crash too, where number lines i need to add this code?

Hey,
@Eduardozu_six66

On all the .java files mentioned in my earlier reply, search for ‘registerReceiver’ and replace it with corresponding code snippet I shared above. That should work.

Note: import statement can be at top of the file along with other imports

And finally update the billingclient version in OnlineSubsystemGooglePlay_UPL.xml, just search and update.

@Rush_At_Games
Would you happen to know if it is possible to apply this solution on 4.27.2?

I tried it and it gave me unidentified/missing symbol errors for all of the RECEIVER_EXPORTED related additions.

It’s fine if you don’t know, I’m just desperate right now because this is the quite literally the only solution I’ve seen on this GooglePAD Android 14 subject and this is the last required fix for my game before I can roll it out.

You may try using android.content.Context.RECEIVER_EXPORTED, when android.content.Context is not already imported in your .java file

I checked all of the files and they already have the: import android.content.Context;
Do I have to rebuild the engine solution in the project’s visual studio file?

I’ll also add that I don’t have any [if (Build.VERSION.SDK_INT >=] that end with Build.VERSION_CODES.TIRAMISU

Tough, I like to assume that it doesn’t matter much when the things u need to change are in the - registerReceiver command.

Yes, please rebuild the UE for Android in Visual studio after these changes.

Conditional check is recommended as the new flag, 3rd arg of registerReceiver() is available from SDK API 33 or above running devices.

K, I tried what u said.

I added Context.RECEIVER_EXPORTED instead of RECEIVER_EXPORTED as I read somewhere else that the prefix is needed to pin point what import it belong to.

But now I only got errors from the GameActivity.java file. (not the .template one.)


UATHelper: Packaging (Android (ETC2)): Z:\app\src\main\java\com\epicgames\ue4\GameActivity.java:244: error: package com.google.android.gms.ads.identifier does not exist

UATHelper: Packaging (Android (ETC2)): import com.google.android.gms.ads.identifier.AdvertisingIdClient;

Z:\app\src\main\java\com\epicgames\ue4\GameActivity.java:245: error: package com.google.android.gms.ads.identifier.AdvertisingIdClient does not exist

UATHelper: Packaging (Android (ETC2)): import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;

UATHelper: Packaging (Android (ETC2)): ERROR: cmd.exe failed with args /c “D:\Misc\Unreal projects\ezREMAKE\Intermediate\Android\gradle\rungradle.bat” :app:bundleRelease


These errors were not here and I was able to package fine before adding all of the Context.RECEIVER_EXPORTED Lines.
I also tried with just RECEIVER_EXPORTED, and it gave me the same with more errors.

Do I have to include something in my build.cs or build.gradle files?

Hey,
I’ve additional changes for Ads support as documented at Upgrade to Google Play Services Ads v22.6.0 for Android Builds

Not sure, if this may help you… Please check it.

Note: These changes are done and tested on UE 5.3.2

Thanks

Thanks for additional help.

I added: implementation “com.google.android.gms:play-services-ads:15.0.0”
in the engine’s build.gradle file and that seems to have fixed it, but I’ll keep in mind your documentation that you’ve linked as I can imagine that outdated google ads versions may cause problems later down the line.

As for the main problem of this topic, turns out I was using SDK version 29 for compiling, so I’ll be retrying this with SDK 34, because If I’m correct, the RECEIVER_EXPORTED flag was introduced in SDK 33, that’s most likely why it couldn’t find the symbols.

Thanks, anyhow.

1 Like

Hey, so It packaged with no errors.
As shown in your solution, I added the RECEIVER_EXPORTED in the GameActivity.java.template file and added android.content.Context.RECEIVER_EXPORTED in all of the other [NAME]Receiver.java files and the DownloaderService.java file.

Also changed the billing libary version to 7.0.0

Still the same issue. My s23 get’s a black screen, the s8 launches fine.

Do I have to copy and paste all of the lines you wrote?

Because I’m just adding the RECEIVER_EXPORTED flags into the registerReceiver functions/commands.

And I also found another forum post on a similar solution.
Specifically this one where u made the last reply redirecting people to this thread:

In the reply marked as the Solution, the poster gives point that the registerReceiver get’s executed only in non-shipping builds because of the ! in the the if (!BuildConfiguration.equals(“Shipping”)) check.

So my assumption is that I have to copy and paste your full solution with the SDK checks instead of the buildConfiguration checks, as they should trigger the registerReceiver thing into the final .APK/.AAB, regardless of the build configuration.
(I thought the structure of your registerReceiver function was different because you used UE5)

Also I am now using CompileSDK 33, not 34, as 34 gave me errors and 33 still has the RECEIVER_EXPORTED stuff.

Please correct me if I’m wrong.