diff --git a/.gitignore b/.gitignore
index 496cc5ab96f..8a798081394 100644
--- a/.gitignore
+++ b/.gitignore
@@ -166,10 +166,8 @@ routing_common/car_model_coefs.hpp
tools/android/mapswithme.keystore
tools/android/yota.keystore
android/secure.properties
-android/fabric.properties
android/pushwoosh.properties
android/libnotify.properties
-android/res/values/google-service.xml
server
*.li
diff --git a/android/.gitignore b/android/.gitignore
index 2ef3eade3bd..26cfd7af117 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -40,3 +40,4 @@ res/drawable-mdpi/uk_scotland.png
res/drawable-mdpi/uk_wales.png
res/xml/network_security_config.xml
+google-services.json
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 4bb9f8b6671..0eceb8744c7 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -76,10 +76,6 @@
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
-
-
diff --git a/android/build.gradle b/android/build.gradle
index 9e82e8852b7..6b4372f8606 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -2,17 +2,12 @@ buildscript {
repositories {
google()
jcenter()
- maven {
- url 'https://maven.fabric.io/public'
- }
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.2'
- // Don't update Fabric plugin until they fix OOM problem during native symbols upload.
- // The latest version 1.31.2 https://docs.fabric.io/android/changelog.html#october-15-2019
- // still consists OOM issue.
- classpath 'io.fabric.tools:gradle:1.27.0'
+ classpath 'com.android.tools.build:gradle:4.0.0'
+ classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
+ classpath 'com.google.gms:google-services:4.3.3'
}
}
@@ -38,8 +33,9 @@ repositories {
}
apply plugin: 'com.android.application'
+apply plugin: 'com.google.gms.google-services'
+apply plugin: 'com.google.firebase.crashlytics'
apply from: 'secure.properties'
-apply plugin: 'io.fabric'
dependencies {
@@ -65,15 +61,16 @@ dependencies {
// statistics
implementation 'com.flurry.android:analytics:12.1.0@aar'
// crash reporting
- implementation('com.crashlytics.sdk.android:crashlytics:2.9.4@aar') { transitive = true }
- implementation('com.crashlytics.sdk.android:crashlytics-ndk:2.0.4@aar') { transitive = true }
+ implementation 'com.google.firebase:firebase-analytics:17.4.3'
+ implementation 'com.google.firebase:firebase-crashlytics:17.1.0'
+ implementation 'com.google.firebase:firebase-crashlytics-ndk:17.1.0'
+
// 3-party
implementation 'com.facebook.android:facebook-android-sdk:5.15.0'
implementation 'com.facebook.android:audience-network-sdk:5.6.1'
implementation 'com.mopub.mediation:facebookaudiencenetwork:5.6.1.0'
implementation 'com.google.code.gson:gson:2.6.1'
implementation 'com.pushwoosh:pushwoosh:5.19.7'
- implementation 'com.pushwoosh:pushwoosh-gcm:5.12.1'
implementation 'com.my.tracker:mytracker-sdk:1.5.3'
implementation ('com.my.target:mytarget-sdk:5.2.2') {
exclude group: 'com.google.android.exoplayer', module:'exoplayer-core'
@@ -118,11 +115,6 @@ def osName = System.properties['os.name'].toLowerCase()
project.ext.versionCodes = ['armeabi-v7a': 30, 'x86': 40, 'arm64-v8a': 50, 'x86_64' : 60]
project.ext.appId = 'com.mapswithme.maps.pro'
-crashlytics {
- enableNdk true
- androidNdkLibsOut "./build/intermediates/stripped_native_libs"
-}
-
configurations.all {
if (it.getName().contains("lint"))
return
@@ -166,6 +158,10 @@ configurations.all {
force "com.google.code.gson:gson:2.8.5"
force "com.google.guava:guava:27.0.1-jre"
force "com.android.installreferrer:installreferrer:1.1"
+ force "com.google.firebase:firebase-iid:16.0.0"
+ force "com.google.firebase:firebase-measurement-connector:18.0.0"
+ force "com.google.firebase:firebase-iid-interop:17.0.0"
+ force "com.google.firebase:firebase-common:19.3.0"
failOnVersionConflict();
}
@@ -191,12 +187,6 @@ android {
buildConfigField 'String', 'REVIEW_URL', '"market://details?id=com.mapswithme.maps.pro"'
buildConfigField 'int', 'RATING_THRESHOLD', '5'
- // Crashlytics API key
- Properties props = new Properties()
- props.load(new FileInputStream("${projectDir}/fabric.properties"));
- manifestPlaceholders = ['FABRIC_API_KEY': props['apiKey']]
- buildConfigField 'String', 'FABRIC_API_KEY', /"${props['apiKey']}"/
-
// PushWoosh keys
Properties pwProps = new Properties()
pwProps.load(new FileInputStream("${projectDir}/pushwoosh.properties"));
@@ -221,7 +211,7 @@ android {
cFlags '-ffunction-sections', '-fdata-sections',
'-Wno-extern-c-compat'
arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static',
- "-DOS=$osName", '-DSKIP_TESTS=ON', "-DUSE_PCH=$pchFlag"
+ "-DOS=$osName", '-DSKIP_TESTS=ON', "-DUSE_PCH=$pchFlag", '-DANDROID_LD=lld'
}
}
@@ -466,6 +456,9 @@ android {
shrinkResources true
proguardFile('proguard-mwm.txt')
resValue 'string', 'app_id', android.defaultConfig.applicationId
+ firebaseCrashlytics {
+ nativeSymbolUploadEnabled true
+ }
}
beta {
@@ -475,6 +468,9 @@ android {
android.sourceSets.beta.setRoot('flavors/beta')
matchingFallbacks = ['debug', 'release']
resValue 'string', 'app_id', android.defaultConfig.applicationId + applicationIdSuffix
+ firebaseCrashlytics {
+ nativeSymbolUploadEnabled true
+ }
}
}
@@ -500,12 +496,6 @@ android {
}
packagingOptions {
- exclude 'lib/armeabi/libcrashlytics-envelope.so'
- exclude 'lib/armeabi/libcrashlytics.so'
- exclude 'lib/mips64/libcrashlytics-envelope.so'
- exclude 'lib/mips64/libcrashlytics.so'
- exclude 'lib/mips/libcrashlytics-envelope.so'
- exclude 'lib/mips/libcrashlytics.so'
exclude 'lib/armeabi/libVkLayer_core_validation.so'
exclude 'lib/armeabi/libVkLayer_threading.so'
exclude 'lib/armeabi/libVkLayer_image.so'
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index ad752dc4524..74356ac6951 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Feb 28 11:02:45 MSK 2020
+#Mon Jun 29 15:29:23 MSK 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/android/jni/com/mapswithme/core/logging.cpp b/android/jni/com/mapswithme/core/logging.cpp
index a5d6f37f2d8..301ec99af81 100644
--- a/android/jni/com/mapswithme/core/logging.cpp
+++ b/android/jni/com/mapswithme/core/logging.cpp
@@ -12,9 +12,6 @@
#include
#include
-
-extern crashlytics_context_t * g_crashlytics;
-
namespace jni
{
@@ -41,8 +38,6 @@ void AndroidMessage(LogLevel level, SrcPoint const & src, std::string const & s)
std::string const out = DebugPrint(src) + " " + s;
jni::TScopedLocalRef msg(env.get(), jni::ToJavaString(env.get(), out));
env->CallStaticVoidMethod(g_loggerFactoryClazz, logCoreMsgMethod, pr, msg.get());
- if (g_crashlytics)
- g_crashlytics->log(g_crashlytics, out.c_str());
}
void AndroidLogMessage(LogLevel level, SrcPoint const & src, std::string const & s)
diff --git a/android/multidex-config.txt b/android/multidex-config.txt
index 1fff02ce92d..5ffac17be2a 100644
--- a/android/multidex-config.txt
+++ b/android/multidex-config.txt
@@ -1,3 +1,4 @@
+com/google/firebase/iid/Registrar.class
com/mapswithme/maps/ads/Banner.class
com/mapswithme/maps/bookmarks/data/Bookmark.class
com/mapswithme/maps/bookmarks/data/ElevationInfo.class
diff --git a/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java b/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java
index 5266a2e1ccc..fdd9fae9fd5 100644
--- a/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java
+++ b/android/src/com/mapswithme/maps/analytics/ExternalLibrariesMediator.java
@@ -10,12 +10,10 @@
import androidx.annotation.UiThread;
import com.appsflyer.AppsFlyerConversionListener;
import com.appsflyer.AppsFlyerLib;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.core.CrashlyticsCore;
-import com.crashlytics.android.ndk.CrashlyticsNdk;
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
+import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
@@ -31,7 +29,6 @@
import com.mopub.common.SdkConfiguration;
import com.mopub.common.privacy.PersonalInfoManager;
import com.my.target.common.MyTargetPrivacy;
-import io.fabric.sdk.android.Fabric;
import java.io.IOException;
import java.util.ArrayList;
@@ -41,8 +38,6 @@
public class ExternalLibrariesMediator
{
- private boolean mCrashlyticsInitialized;
-
private static final String TAG = ExternalLibrariesMediator.class.getSimpleName();
private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC);
@@ -67,7 +62,6 @@ public ExternalLibrariesMediator(@NonNull Application application)
public void initSensitiveDataToleranceLibraries()
{
initMoPub();
- initCrashlytics();
initAppsFlyer();
}
@@ -98,30 +92,7 @@ private void initAppsFlyer()
AppsFlyerLib.getInstance().startTracking(mApplication);
}
- public void initCrashlytics()
- {
- if (!isCrashlyticsEnabled())
- return;
-
- if (isCrashlyticsInitialized())
- return;
-
- Crashlytics core = new Crashlytics
- .Builder()
- .core(new CrashlyticsCore.Builder().disabled(!isFabricEnabled()).build())
- .build();
-
- Fabric.with(mApplication, core, new CrashlyticsNdk());
- nativeInitCrashlytics();
- mCrashlyticsInitialized = true;
- }
-
public boolean isCrashlyticsEnabled()
- {
- return !BuildConfig.FABRIC_API_KEY.startsWith("0000");
- }
-
- private boolean isFabricEnabled()
{
String prefKey = mApplication.getResources().getString(R.string.pref_opt_out_fabric_activated);
return MwmApplication.prefs(mApplication).getBoolean(prefKey, true);
@@ -133,11 +104,6 @@ public EventLogger getEventLogger()
return mEventLogger;
}
- public boolean isCrashlyticsInitialized()
- {
- return mCrashlyticsInitialized;
- }
-
public boolean setInstallationIdToCrashlytics()
{
if (!isCrashlyticsEnabled())
@@ -149,7 +115,8 @@ public boolean setInstallationIdToCrashlytics()
if (TextUtils.isEmpty(installationId))
return false;
- Crashlytics.setString("AlohalyticsInstallationId", installationId);
+ FirebaseCrashlytics.getInstance().setCustomKey("AlohalyticsInstallationId", installationId);
+ FirebaseCrashlytics.getInstance().setUserId(installationId);
return true;
}
diff --git a/android/src/com/mapswithme/maps/settings/SettingsPrefsFragment.java b/android/src/com/mapswithme/maps/settings/SettingsPrefsFragment.java
index 720b95e462f..5becd131ce7 100644
--- a/android/src/com/mapswithme/maps/settings/SettingsPrefsFragment.java
+++ b/android/src/com/mapswithme/maps/settings/SettingsPrefsFragment.java
@@ -26,6 +26,7 @@
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
+import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.mapswithme.maps.Framework;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
@@ -290,6 +291,7 @@ private boolean onToggleOptOut(Object newValue)
{
boolean isEnabled = (boolean) newValue;
Statistics.INSTANCE.trackSettingsToggle(isEnabled);
+ FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(isEnabled);
return true;
}
diff --git a/android/src/com/mapswithme/util/CrashlyticsUtils.java b/android/src/com/mapswithme/util/CrashlyticsUtils.java
index 898e42b2850..6527b6d17b2 100644
--- a/android/src/com/mapswithme/util/CrashlyticsUtils.java
+++ b/android/src/com/mapswithme/util/CrashlyticsUtils.java
@@ -1,8 +1,9 @@
package com.mapswithme.util;
-import androidx.annotation.NonNull;
+import android.util.Log;
-import com.crashlytics.android.Crashlytics;
+import androidx.annotation.NonNull;
+import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.mapswithme.maps.MwmApplication;
public final class CrashlyticsUtils
@@ -12,7 +13,7 @@ public static void logException(@NonNull Throwable exception)
if (!checkCrashlytics())
return;
- Crashlytics.logException(exception);
+ FirebaseCrashlytics.getInstance().recordException(exception);
}
public static void log(int priority, @NonNull String tag, @NonNull String msg)
@@ -20,18 +21,33 @@ public static void log(int priority, @NonNull String tag, @NonNull String msg)
if (!checkCrashlytics())
return;
- Crashlytics.log(priority, tag, msg);
+ FirebaseCrashlytics.getInstance().log(toLevel(priority) + "/" + tag + ": " + msg);
}
private static boolean checkCrashlytics()
{
MwmApplication app = MwmApplication.get();
- if (!app.getMediator().isCrashlyticsEnabled())
- return false;
+ return app.getMediator().isCrashlyticsEnabled();
+ }
- if (!app.getMediator().isCrashlyticsInitialized())
- app.getMediator().initCrashlytics();
- return true;
+ @NonNull
+ private static String toLevel(int level)
+ {
+ switch (level)
+ {
+ case Log.VERBOSE:
+ return "V";
+ case Log.DEBUG:
+ return "D";
+ case Log.INFO:
+ return "I";
+ case Log.WARN:
+ return "W";
+ case Log.ERROR:
+ return "E";
+ default:
+ throw new IllegalArgumentException("Undetermined log level: " + level);
+ }
}
private CrashlyticsUtils() {}
diff --git a/android/src/com/mapswithme/util/log/LoggerFactory.java b/android/src/com/mapswithme/util/log/LoggerFactory.java
index d26de0fd002..fab86b57a6e 100644
--- a/android/src/com/mapswithme/util/log/LoggerFactory.java
+++ b/android/src/com/mapswithme/util/log/LoggerFactory.java
@@ -2,14 +2,15 @@
import android.app.Application;
import android.content.SharedPreferences;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.mapswithme.maps.BuildConfig;
import com.mapswithme.maps.MwmApplication;
import com.mapswithme.maps.R;
+import com.mapswithme.util.CrashlyticsUtils;
import com.mapswithme.util.StorageUtils;
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
@@ -179,6 +180,7 @@ private static void logCoreMessage(int level, String msg)
default:
logger.v(CORE_TAG, msg);
}
+ CrashlyticsUtils.log(level, CORE_TAG, msg);
}
private static native void nativeToggleCoreDebugLogs(boolean enabled);
diff --git a/configure.sh b/configure.sh
index 1275c2778b8..4be9c801701 100755
--- a/configure.sh
+++ b/configure.sh
@@ -18,9 +18,9 @@ PRIVATE_CAR_MODEL_COEFS="$BASE_PATH/routing_common/car_model_coefs.hpp"
DEFAULT_PRIVATE_CAR_MODEL_COEFS="$BASE_PATH/routing_common/car_model_coefs_default.hpp"
PRIVATE_PROPERTIES="$BASE_PATH/android/secure.properties"
-PRIVATE_FABRIC_PROPERTIES="$BASE_PATH/android/fabric.properties"
PRIVATE_PUSHWOOSH_PROPERTIES="$BASE_PATH/android/pushwoosh.properties"
PRIVATE_NETWORK_CONFIG="$BASE_PATH/android/res/xml/network_security_config.xml"
+PRIVATE_GOOGLE_SERVICES="$BASE_PATH/android/google-services.json"
SAVED_PRIVATE_REPO_FILE="$BASE_PATH/.private_repository_url"
SAVED_PRIVATE_BRANCH_FILE="$BASE_PATH/.private_repository_branch"
TMP_REPO_DIR="$BASE_PATH/.tmp.private.repo"
@@ -45,16 +45,13 @@ setup_opensource() {
spropKeyPassword = "12345678"
}
' > "$PRIVATE_PROPERTIES"
-
- echo 'apiSecret=0000000000000000000000000000000000000000000000000000000000000000
-apiKey=0000000000000000000000000000000000000000
-' > "$PRIVATE_FABRIC_PROPERTIES"
echo 'pwAppId=XXXXX
pwProjectId=A123456789012
' > "$PRIVATE_PUSHWOOSH_PROPERTIES"
echo '
' > "$PRIVATE_NETWORK_CONFIG"
+ echo '{}' > "$PRIVATE_GOOGLE_SERVICES"
}
setup_private() {