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() {