This post is for everyone using the standard Launcher version of UE4 who is stuck behind the Google Play SDK 35 wall. This guide fixes the SecurityException crashes, Duplicate Class errors, and Play Core legacy issues by manually patching the engine’s Java and XML templates.
1. The Environment (The Real Requirements)
Forget the “Auto-Setup” scripts. For SDK 35, you must have these exact versions installed:
-
Android Studio: Koala (2024.1.2) or later.
-
JDK: Adoptium Eclipse Temurin 1.8 (Java 8). (Crucial for UE4 launcher stability).
-
SDK Platform: API Level 35
-
Build-Tools: 30.0.3
-
NDK: r21d
2. Project Settings
In Project Settings > Platforms > Android, set these exact values:
-
Minimum SDK: 26 (Android 8.0).
-
Target SDK: 35 (Android 15).
-
Advanced APK Packaging: * Extra Tags for com.epicgames.ue4.GameActivity:
android:exported="true"(Required by Google for SDK 31+).
3. The Engine Patches (Manual Surgery)
Since we are on the Launcher version, we edit the templates the engine uses to build every game.
A. Fix the registerReceiver Crash (Android 14+)
File: UE_4.27\Engine\Build\Android\Java\src\com\epicgames\ue4\GameActivity.java.template Why: Android 14/15 requires a security flag (RECEIVER_EXPORTED) for all broadcast receivers. The Fix: Scroll to the bottom and override this method:
Java
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
if (Build.VERSION.SDK_INT >= 34) {
return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
}
return super.registerReceiver(receiver, filter);
}
B. Patch internal WebView
File: UE_4.27\Engine\Build\Android\Java\src\com\epicgames\ue4\WebViewControl.java Action: Find the registerReceiver calls and ensure they use the RECEIVER_EXPORTED flag.
4. Upgrading GooglePAD (Play Asset Delivery)
The default Play Core 1.10.0 crashes instantly on SDK 35. You must migrate to the split libraries.
A. Update GooglePAD_APL.xml
File: UE_4.27\Engine\Plugins\Runtime\GooglePAD\Source\GooglePAD\GooglePAD_APL.xml Action: Replace the dependencies block with this to use modern libs and force a version strategy to prevent “Duplicate Class” errors:
XML
<insert>
<![CDATA[
dependencies {
implementation 'com.google.android.play:asset-delivery:2.2.2'
implementation 'com.google.android.gms:play-services-tasks:18.1.0'
}
configurations.all {
resolutionStrategy {
force 'com.google.android.gms:play-services-tasks:18.1.0'
force 'com.google.android.gms:play-services-basement:18.3.0'
force 'com.google.android.gms:play-services-base:18.4.0'
}
}
]]>
</insert>
B. Fix the Java Imports
In the same GooglePAD_APL.xml (or related Java files), you must change the Task imports.
-
Old:
com.google.android.play.core.tasks.Task -
New:
com.google.android.gms.tasks.Task(The Play Core path is dead on SDK 35).
5. ProGuard (Shipping Build Fix)
If it works in Dev but crashes in Shipping, ProGuard is stripping your new libraries. File: UE_4.27\Engine\Build\Android\Java\proguard-project.txt Add these rules:
Code snippet
-keep class com.google.android.play.core.assetpacks.** { *; }
-keep class com.google.android.gms.tasks.** { *; }
-keep class com.google.android.gms.common.** { *; }
-dontwarn com.google.android.play.core.**
-dontwarn com.google.android.gms.**
6. Verification
-
Clean Project: Delete
Intermediate,Saved, and.gradlefolders. -
UID Logcat: Find your app’s UID (e.g.,
10241) and run:adb logcat --uid=10241 -
Confirm: You should see you game loading up