Ultimate Mobile Kit for iOS & Android - Firebase

Hello joeypark,

It took so long to identify what is causing the problem as this is not regular issue. Big apologies about that but this is very complicated problem because UE 4.20 has rewritten Android build system. What’s more it depends on many factors and configuration options. We are now closer to solution and I would like to let you know that we are talking directly to Epic Games how to resolve this issue and hopefully hotfix will be released very soon…

Thank you for your patience and sorry again…

**EDIT: Problem has been fixed in new updates: 1.9.3 for UE 4.20 and 1.10.1 for UE 4.21! **:smiley:

Thank you for your appreciation! :slight_smile: It means a lot for us :slight_smile:

We are trying to integrate ML Kit into UE4 but you know - this is very complex task, it will be definitely released in the future, but we can’t provide any ETA at the current stage.

Hi,

  1. No, you should ignore this message. Ultimate Mobile Kit handles everything automatically.
  2. Please make sure application IDs in Firebase and in Fabric are both the same. If yes, please contact with Firebase support here Firebase Support as this is related directly to Firebase Dashboard.

If you have more questions, feel free to ask! :smiley:

Ultimate Mobile Kit 1.9.2 for UE 4.20 released!

We’ve just released new update for Ultimate Mobile Kit.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG:

  • Added automatic processing Info.plist nodes. No more manual adding entries in Project Settings!
  • Firebase SDK for Android updated to 16.0.4
  • Firebase SDK for iOS updated to 5.10.0
  • Firebase SDK Universal updated to 5.4.0
  • Many bugfixes and stability improvements

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

http://gamednastudio.com/plugins/images/UltimateMobileKit/Update24.png

Ultimate Mobile Kit 1.10.0 for UE 4.21 released!

We’ve just released plugin binaries for Unreal Engine 4.21.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG:

  • Compatibility updates for Unreal Engine 4.21

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

Ultimate Mobile Kit 1.10.1 and 1.9.3 released!

We’ve just released plugin binaries 1.10.1 for UE 4.21 and 1.9.3 for UE 4.20.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG OF 1.10.1 VERSION:

  • Crashlytics SDK updates
  • Fixed missing symbols in Crashlytics for Android
  • New version of Google Services Plist Generator with fixed paths on UNIX systems.
  • Fixed occassional crash in Firebase Crashlytics functions. Fix commited by 함대호 from WeMade Next.
  • Added automatic Crashlytics symbols uploading for Android.

https://gamednastudio.com/plugins/images/UltimateMobileKit/Wiki93.png

CHANGELOG OF 1.9.3 VERSION:

  • Fixed missing symbols in Crashlytics for Android

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

How to use Ultimate Mobile Kit in C++?

Add the following line to your *.Build.cs file private dependency module name:



PrivateDependencyModuleNames.AddRange(new string] { "UltimateMobileKit" });


Before you call needed plugin function you should add necessary header:



#include "UltimateMobileKit.h"


and init proper Firebase module somewhere (in this case this is Firebase Analytics):



void TestGameMode::InitFirebase()
{
    // Retrieving Ultimate Mobile Kit subsystem
    FUltimateMobileKit* UltimateMobileKit = FUltimateMobileKit::Get();

    // Checking if Ultimate Mobile Kit subsystem is valid
    if (UltimateMobileKit)
    {
        // Retrieving Firebase Analytics module (we recommend using Shared Pointers)
        TSharedPtr<FFirebaseAnalytics, ESPMode::ThreadSafe> FirebaseAnalytics = UltimateMobileKit->GetFirebaseAnalytics();

        // Checking if Firebase Analytics module is valid
        if (FirebaseAnalytics.IsValid())
        {
            // Creating delegate for Init function
            FOnFirebaseAnalyticsInitializeCompleteDelegate InitializeCompleteDelegate = FOnFirebaseAnalyticsInitializeCompleteDelegate::CreateUObject(this, &ThisClass::OnInitCompleted);

            // Calling Firebase Analytics Init function
            FirebaseAnalytics->Init(InitializeCompleteDelegate);

            return;
        }
    }
}

void TestGameMode::OnInitCompleted(bool bSuccess)
{
}


You have now access to all functions from initialized Firebase module. For example Set User Id:



FirebaseAnalytics->SetUserId(TEXT("User_Id"));


or Log Event with multiple parameters:



TArray<UFirebaseVariant*> Parameters = TArray<UFirebaseVariant*>();
UFirebaseVariant* Parameter1 = UFirebaseVariant::FirebaseStringVariant(this, TEXT("Parameter1_Name"), TEXT("Parameter1_Value"));
UFirebaseVariant* Parameter2 = UFirebaseVariant::FirebaseBooleanVariant(this, TEXT("Parameter2_Name"), true);
UFirebaseVariant* Parameter3 = UFirebaseVariant::FirebaseIntegerVariant(this, TEXT("Parameter3_Name"), 28);
UFirebaseVariant* Parameter4 = UFirebaseVariant::FirebaseFloatVariant(this, TEXT("Parameter4_Name"), 67.12f);

FirebaseAnalytics->LogEvent(TEXT("Test_Event"), Parameters);


Hi, I have a problem with Upload dSyms for Android.

version
Unreal Engine 4.20.3 / Ultimate Mobile Kit 1.9.3
androidNdkOut ‘build/intermediates/transforms/mergeJniLibs’
androidNdkLibsOut ‘build/intermediates/transforms/stripDebugSymbol’

Here is My log

Code:


> Configure project :app
Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.
Observed package id 'build-tools;25.0.3' in inconsistent location 'C:\NVPACK\android-sdk-windows\build-tools\android-7.1.1' (Expected 'C:\NVPACK\android-sdk-windows\build-tools\25.0.3')
Observed package id 'build-tools;25.0.3' in inconsistent location 'C:\NVPACK\android-sdk-windows\build-tools\android-7.1.1' (Expected 'C:\NVPACK\android-sdk-windows\build-tools\25.0.3')
registerResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)

> Task :app:processDebugGoogleServices
Parsing json file: D:\Dev_Test\Client\Intermediate\Android\APK\gradle\app\google-services.json

> Task :app:crashlyticsGenerateSymbolsDebug
ERROR - Crashlytics Developer Tools error.
java.lang.IllegalArgumentException: Multiple files matching D:\Dev_Test\Client\Intermediate\Android\APK\gradle\app\build\intermediates	ransforms\mergeJniLibs\debug\0\lib\arm64-v8a\libcrashlytics.so in D:\Dev_Test\Client\Intermediate\Android\APK\gradle\app\build\intermediates	ransforms\stripDebugSymbol were found. Is the -androidNdkLibsOut setting configured correctly?
        at com.crashlytics.tools.android.project.codemapping.csym.AndroidCSymIdStrategy.createCSymIdForFile(AndroidCSymIdStrategy.java:64)
        at com.crashlytics.tools.android.project.codemapping.csym.ElfCSymFactory.createCSymFromFile(ElfCSymFactory.java:94)
        at com.crashlytics.tools.android.project.codemapping.csym.NdkCSymGenerator.generateCodeMappings(NdkCSymGenerator.java:70)
        at com.crashlytics.tools.android.project.CSymManager.generate(CSymManager.java:96)
        at com.crashlytics.tools.android.DeveloperTools.processProperties(DeveloperTools.java:692)
        at com.crashlytics.tools.android.DeveloperTools.processArgsInternal(DeveloperTools.java:348)
        at com.crashlytics.tools.android.DeveloperTools.gradleMain(DeveloperTools.java:292)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
        at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at com.crashlytics.tools.gradle.tasks.FabricTaskBuilder.callDevtoolsWrappingRuntimeExceptions(FabricTaskBuilder.groovy:359)
        at com.crashlytics.tools.gradle.tasks.FabricTaskBuilder.this$2$callDevtoolsWrappingRuntimeExceptions(FabricTaskBuilder.groovy)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
        at com.crashlytics.tools.gradle.tasks.FabricTaskBuilder$_crashlyticsGenerateSymbols_closure10.doCall(FabricTaskBuilder.groovy:190)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
        at groovy.lang.Closure.call(Closure.java:414)
        at groovy.lang.Closure.call(Closure.java:430)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:681)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:656)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:60)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:128)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:46)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
        at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:311)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:202)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:132)
        at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:107)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78)
        at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
        at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100)
        at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
       at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:45)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:29)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
        at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:71)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:45)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:51)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
        at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
        at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:58)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:33)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:50)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
        at java.lang.Thread.run(Thread.java:745)


Hello,

we’ve just tested it again with UE 4.20 and UMA 1.9.3 and it should work good.

Could you please delete [PROJECT_FOLDER]/Intermediate, build, and try to upload symbols again? If it still fails, is this development or shipping build? Is this for architecture arm-v7a, arm64, or both?

Thank you for your patience.

I tried to upload symbol after delete Intermediate and build, but still fail. (development build / architecture armv7)
when I remove androidNdkLibsOut ‘build/intermediates/transforms/stripDebugSymbol’ line, file uploaded successfully.
In this case, androidNdkLibsOut in crashlytics.log file was ‘build\intermediates ransforms\stripDebugSymbol\debug’

I have another question.
I want to upload symbol file automatically, so added this code to UltimateMobileKit_UPL_Android.xml

But it didn’t work. What should I do?

It looks fine… When you delete androidNdkLibsOut it tries to find necessary folder automatically. Could you check if stack traces with symbols are visible on the Firebase Crashlytics Dashboard?

We added this functionality to Ultimate Mobile Kit 1.10.1 (UE 4.21) and you can integrate changes from this commit: https://github.com/gameDNAstudio/UltimateMobileKit/commit/e1a2c971bfb865814e47bfa49f530bffd9025287

Ok, I’ll Check it. Thank you.

Actually, Only part of it is displayed.
Here is My Firebase Crashlytics Dashboard Info.


Crashed: Thread: SIGSEGV  0x0000000000000000
       at My SourceCode FunctionName (FileName:Line)
       at (Missing)()
       at UFunction::Invoke(UObject*, FFrame&, void*)(Class.cpp:4728)
       at UObject::ProcessEvent(UFunction*, void*)(ScriptCore.cpp:1342)
       at UObject::FindFunction(FName) const(ScriptCore.cpp:1173)
       at (Missing)()
       at (Missing)()
       at void TScriptDelegate<FWeakObjectPtr>::ProcessDelegate<UObject>(void*) const(ScriptDelegates.h:240)
       at SCheckBox::OnMouseButtonDoubleClick(FGeometry const&, FPointerEvent const&)(SButton.cpp:249)
       at FOnButtonClickedEvent_DelegateWrapper(TMulticastScriptDelegate<FWeakObjectPtr> const&)(Button.h:17)
       at decltype ((((*this).Obj)->*((*this).MemFunPtr))()) TMemberFunctionCaller<UUserWidget, FVector2D (UUserWidget::*)() const>::operator()<>()(DelegateInstanceInterface.h:156)
       at TBaseDelegate<FReply>::Execute() const(DelegateSignatureImpl.inl:537)
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()
       at (Missing)()

It seems to be fine. All necessary info is available. Not always 100% of symbols are visible in Crashlytics.

Thank you for confirming.

I have another problem.
UMK ForceCrash, ForceException not working at Android.
I called this function using custom console command.
But there is any crash, or exception and I can’t open Unreal Console window after function call.
When I changed “throw new RuntimeException(“This is a crash”)” to Crashlytics.logException(new RuntimeException(“This is a crash”), it worked.


I modified UltimateMobileKit_UPL_Android.xml.
Now it works well



 public void AndroidThunkJava_FirebaseCrashlyticsForceCrash()
     {
          GameActivity._activity.runOnUiThread(new Runnable() {
           @Override
           public void run() {
              Crashlytics.getInstance().crash();
            }
          });
      }

      public void AndroidThunkJava_FirebaseCrashlyticsForceException()
      {
          GameActivity._activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
              throw new RuntimeException("This is a crash");
            }
          });
      }


Ultimate Mobile Kit 1.10.2 released!

We’ve just released hotfix for UE 4.21.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG:

  • Added improvements for Android 9 (Pie)
  • Added improvements for iOS 12, iPhone XS, iPhone XS Max, and iPhone XR
  • Firebase SDK for all platforms updated to 5.4.3
  • Firebase Core SDK for Android updated to 16.0.5
  • Firebase Analytics SDK for Android updated to 16.0.5
  • Firebase Database SDK for Android updated to 16.0.5
  • Firebase Auth SDK for Android updated to 16.0.5
  • Firebase Invites SDK for Android updated to 16.0.5
  • Firebase Performance Monitoring SDK for Android updated to 16.2.1
  • Firebase Storage SDK for Android updated to 16.0.5
  • Firebase Crashlytics SDK for Android updated to 2.9.6
  • Firebase Core SDK for iOS updated to 5.13.0
  • Firebase Crashlytics SDK for iOS updated to 3.12.0

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

Ultimate Mobile Kit 1.10.3 released!

We’ve just released hotfix for UE 4.21.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG:

  • Fixed SignInWithGoogle not working during second execution or next.
  • Removed unecessary WorldContextObject parameters.
  • Firebase Core SDK for Android updated to 16.0.6
  • Firebase Auth SDK for Android updated to 16.1.0
  • Firebase Analytics SDK for Android updated to 16.0.6
  • Firebase Remote Config SDK for Android updated to 16.1.2
  • Firebase Crashlytics SDK for Android updated to 2.9.8
  • Firebase Invites SDK for Android updated to 16.0.6
  • Firebase Performance Monitoring SDK for Android updated to 16.2.3
  • Firebase Core SDK for iOS updated to 5.15.0

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

https://www.gamednastudio.com/plugins/images/ExtendedFacebook/Update31.png

We decided to create Discord channel to provide better support and send realtime updates about all our products.

We strongly encourage you to join our channel: https://gamednastudio.com/discord

Ultimate Mobile Kit 1.10.4 released!

We’ve just released hotfix for UE 4.21.
You can download it from GitHub repository on releases tab or your Sellfy dashboard (for Sellfy customers). Update also was submitted for UE4 Marketplace but it needs to wait for approval.

CHANGELOG:

  • Updated Firebase SDKs for Android
  • Fixed ProGuard error when Shipping mode is enabled on Android

If you haven’t owned it yet, you can buy now on Sellfy or UE4 Marketplace.

Great plugin. Exactly what I needed to connect my app to firebase. Easy to use, great support from , I got my answers in less than 5 minutes everytime I had an issue. Strongly recommend to anyone working on mobile games!