AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: androidmapsapi-ZoomTableManager - PullRequest
138 голосов
/ 23 апреля 2020

Мое приложение, использующее Google Maps SDK (v2), только что начало сбой, за исключением этого:

Process: com.currentlocation.android, PID: 7328
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.maps.api.android.lib6.gmm6.vector.ct.<init>(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):9)
        at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):23)
        at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):14)
        at java.lang.Thread.run(Thread.java:919)

В бета-версии SDK v3 трассировка стека:

2020-04-23 15:59:06.064 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 22717
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.android.libraries.maps.bv.zzbs.<init>(ZoomTable.java:24)
        at com.google.android.libraries.maps.bv.zzbv.zza(ZoomTableQuadTree.java:57)
        at com.google.android.libraries.maps.br.zzd.zza(Unknown Source:4)
        at com.google.android.libraries.maps.hi.zzas.zza(Suppliers.java:7)
        at com.google.android.libraries.maps.br.zza.zzh(SharedMapComponentImpl.java:58)
        at com.google.android.libraries.maps.gu.zzat.zza(RendererFactoryImpl.java:88)
        at com.google.android.libraries.maps.it.zzav.zza(GoogleMapImpl.java:59)
        at com.google.android.libraries.maps.it.zzci.zza(MapFragmentDelegateImpl.java:3)
        at com.google.android.libraries.maps.it.zzcg.zza(MapFragmentDelegateImpl.java:15)
        at com.google.android.libraries.maps.SupportMapFragment$zza.onCreateView(SupportMapFragment.java:15)
        at com.google.android.gms.dynamic.zae.zaa(com.google.android.gms:play-services-base@@17.1.0:4)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(com.google.android.gms:play-services-base@@17.1.0:9)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreateView(com.google.android.gms:play-services-base@@17.1.0:25)
        at com.google.android.libraries.maps.SupportMapFragment.onCreateView(SupportMapFragment.java:34)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2222)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1995)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1951)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2621)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432)
        at android.app.Activity.performStart(Activity.java:7848)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
2020-04-23 15:59:06.064 E/AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Что это причина?

Ответы [ 9 ]

90 голосов
/ 23 апреля 2020

Редактировать : следующее официальное решение от Google ( ссылка )

Сводка

Тема Google Maps SDK вылетает приложение (ArrayIndexOutOfBoundsException) - предлагаемое решение

Описание

В 23 апреля 2020 года, начиная с 11:30 PDT , Google работал в течение 4 часов обновить конфигурацию мобильного компонента Maps, вызывая сбои в Maps SDK для Android и iOS. Приложения на устройствах, которые загрузили эту версию конфигурации (в период простоя), были уязвимы для cra sh. Обходные решения предлагаются для SDK для карт для Android и iOS.

SDK для карт для Android

SDK для карт для Android v2 (включено в Сервисы Google Play)

Обновления Сервисов Google Play для исправления cra sh были опубликованы на всех устройствах с Сервисами Google Play версии 17.4.55 и новее. После установки обновления номер версии Служб Google Play на устройстве не изменяется. От разработчиков или конечных пользователей не требуется никаких действий для получения обновленного модуля Карт; однако разработчики могут проверить наличие модуля на данном устройстве с помощью следующей команды adb:

adb shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider

Вы должны увидеть строку Module Set ID: maps, указанную в разделе Module Sets.

Module Set ID: maps, Module Set Version: 2015120015120000

Скорость sh использования Maps SDK для Android v2 вернулась к норме.

На данный момент, если вы не обновили свое приложение с помощью обходных путей кода на стороне клиента, указанных ниже, вам не нужно предпринимать дальнейших действий.

Если вы уже обновили свое приложение с помощью обходных путей, вы можете удалить обходной путь в последующем обновлении вашего приложения (но сохранить обходной путь безопасно).

Premium Plan Maps SDK для Android v2 или Maps SDK для Android v3 beta (stati c библиотеки)

Если ваше приложение использует Premium Plan Maps SDK для Android v2 или Maps SDK для Android v3 beta (stati c библиотеки) и все еще возникают сбои, мы по-прежнему настоятельно рекомендуем вам развернуть нижеприведенные обходные пути через обновление вашего приложения. Поскольку ваше приложение загружает стати c версию SDK, которая уязвима для плохих данных, хранящихся на некоторых устройствах, только обновление вашего приложения может решить эту проблему.

Обзор Play Store согласования

Если вы обновляете свое приложение, но испытываете задержки одобрения проверки в Play Store, отправьте заявку в службу поддержки с идентификатором пакета вашего приложения: ⁠ Свяжитесь со службой поддержки . Наша служба поддержки внутренне обработает ваш запрос и ускорит одобрение.

Отрицательные отзывы в Google Play Store

Некоторые разработчики приложений спрашивали о 1-звездочных отзывах в Google Play Store, оставленный конечными пользователями из-за сбоев. Только комментарии, нарушающие политику Google Play [1], могут быть удалены. Вы также можете пометить оскорбительные отзывы в консоли Play [2]. Приложения не будут автоматически удалены из магазина Google Play из-за отрицательных отзывов. Стоит также отметить, что подсчет общего рейтинга ваших обзоров приложений благоприятствует последним обзорам, что означает, что ваш рейтинг со временем восстановится до уровня, предшествующего инциденту.

[1] ⁠ Рейтинги и обзор на Play Store

[2] ⁠ Сообщить о неуместных отзывах

Карты SDK для iOS

Cra sh ставки по iOS вернулись к норме. Если ваше приложение по-прежнему испытывает сбои, вам необходимо обновить и опубликовать sh ваше приложение с указанными здесь обходными путями кода.

По вопросам развертывания или ускорения работы приложения в Apple App Store обращайтесь напрямую в Apple. .


С этим обновлением мы закрываем эту проблему. Спасибо всем за терпение. Наша команда проводит углубленное внутреннее расследование этого инцидента; как можно скорее, мы опубликуем sh наш анализ (примерно через неделю). Тем временем, если у вас есть какие-либо вопросы или у вас все еще есть проблемы, пожалуйста, please подайте заявку в службу поддержки .

Обходные пути:

  • Конечные пользователи Android могут очистить данные уязвимого приложения (а не только кэш).

  • Конечные пользователи на iOS могут удалить и переустановить уязвимые приложения.

  • Разработчики приложений могут применять обходные пути кода, приведенные ниже в Чтобы решить эту проблему для всех своих конечных пользователей.

Обход кода для iOS:

Рекомендуемое размещение кода перед GMSServices инициализация в приложении (_: didFinishLaunchingWithOptions :) (Swift) или в приложении: didFinishLaunchingWithOptions: (Objective- C). В частности:

Swift:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Объектив- C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL];
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Код Обходной путь для Android:

Рекомендуемое размещение кода в Application.onCreate ():

Java

try {
  SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
  if (!hasFixedGoogleBug154855417.contains("fixed")) {
    File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
    File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
    File corruptedClientParametersData =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data."
              + getBaseContext().getPackageName());
    File corruptedClientParametersDataV1 =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data.v1."
              + getBaseContext().getPackageName());
    corruptedZoomTables.delete();
    corruptedSavedClientParameters.delete();
    corruptedClientParametersData.delete();
    corruptedClientParametersDataV1.delete();
    hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
  }
} catch (Exception e) {

}

Kotlin

try {
    val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!sharedPreferences.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data")
        val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
        val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
        val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
        corruptedZoomTables.delete()
        corruptedSavedClientParameters.delete()
        corruptedClientParametersData.delete()
        corruptedClientParametersDataV1.delete()
        sharedPreferences.edit().putBoolean("fixed", true).apply()
    }
} catch (exception: Exception) {

}

Обходные пути, представленные здесь, охватывают все доступные варианты и версии наших SDK для Android. Для уточнения (в случае, если вы выпустили более раннюю версию обходного пути, который не удалял столько файлов):

  • Приложения, использующие Карты Android SDK v2, должны удалять только один файл: ZoomTables .data.
  • Приложения, использующие Maps Android SDK v3 beta, должны удалять только один файл: либо

    DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) или

    DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

46 голосов
/ 24 апреля 2020

Похоже, что в каждом приложении Google Map создает файл ZoomTables.data.

enter image description here

Этот файл был искажен, искажена его версия, которую можно было загрузить из комментарий . Чтобы воспроизвести проблему, удалите ZoomTables.data из пакетов приложений на устройстве и вставьте поврежденный. Приложение должно создать sh.

. В настоящее время проблема была решена на стороне Google, но приложения все еще содержат кэшированную версию этого файла данных. Чтобы решить эту проблему, мы должны удалить этот файл прямо при запуске приложения в Application onCreate Method.

private void fixGoogleMapBug() {
  try {
    SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
    if (!hasFixedGoogleBug154855417.contains("fixed")) {
      File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
      File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
      File corruptedClientParametersData =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data."
                + getBaseContext().getPackageName());
      File corruptedClientParametersDataV1 =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data.v1."
                + getBaseContext().getPackageName());
      corruptedZoomTables.delete();
      corruptedSavedClientParameters.delete();
      corruptedClientParametersData.delete();
      corruptedClientParametersDataV1.delete();
      hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
    }
  } catch (Exception e) {

  }
}

Обновление 1

Я обновил обходной путь, основываясь на последние разработчики Google комментарий :

Обходные пути, представленные здесь, охватывают все доступные варианты и версии наших SDK для Android. Чтобы уточнить далее (в случае, если вы выпустили более раннюю версию обходного пути, который не удалял столько файлов):

Приложения, использующие Карты Android SDK v2, должны удалить только один файл: ZoomTables.data. Приложения, использующие бета-версию Maps Android SDK v3, должны удалять только один файл: DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) или DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

11 голосов
/ 24 апреля 2020

Это решение сработало для меня

  1. Сначала откройте «Информация о приложении»
  2. Выберите «Хранилище»
  3. Нажмите «Очистить данные»
  4. Снова откройте приложение и проверьте, устранена ли проблема.

    Ниже приведены рекомендации, которые помогут вашим клиентам.

  5. Отправьте всем своим пользователям электронное письмо за причиненные неудобства. и опишите им проблему, с которой они столкнулись, и дайте им вышеупомянутые шаги для решения их проблемы.

  6. Вы также можете отправить Уведомление Pu sh всем своим пользователям с помощью Firebase Pu sh Уведомления , если в вашем приложении есть служба уведомлений pu sh.

Демонстрация снимков экрана:

enter image description here

enter image description here

enter image description here

7 голосов
/ 24 апреля 2020

Недостатки решений, приведенных выше:

  • ZoomTables.data удаляется на каждом устройстве, независимо от того, подвержено ли устройство воздействию cra sh или нет
  • Обходной путь работает только однажды, уверен ли, что эта проблема больше никогда не повторится?

Недостатки моего решения:

  • при первом выполнении действия карт на затронутой карте устройства пусто. После отображения ротации устройства или второй карты выполнения

Мое решение перехватывает исключение, выданное SDK для карт, вызовите его в onCreate класса приложения:

public static void catchGoogleMapsException(final Context context)
{
  final Thread.UncaughtExceptionHandler defaultHandler =
    Thread.getDefaultUncaughtExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(
    (@NonNull final Thread thread, @NonNull final Throwable ex) ->
    {
      if (thread.getName().contains("ZoomTableManager"))
      {
        new File(context.getFilesDir(), "ZoomTables.data").delete();
        Log.w("Maps Bug 154855417", "Caught exception and deleted ZoomTables.data");
      }
      else
        if (defaultHandler!=null)
          defaultHandler.uncaughtException(thread, ex);
        else
          throw new RuntimeException(
            "No default uncaught exception handler.", ex);
    });
}
7 голосов
/ 24 апреля 2020

Для Android несколько разработчиков упомянули обходной путь, заключающийся в удалении файла ZoomTable.data непосредственно из их приложения. После проверки это исправление кажется безопасным, и вы можете попробовать его в своем приложении.

Пожалуйста, обратитесь к https://issuetracker.google.com/154855417#comment179

Если вы хотите, чтобы ваши пользователи продолжали использовать ваше приложение без переустановки, образец кода скопирован сюда для вашего удобства , В Application.onCreate () :

SharedPreferences googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
if (!googleBug.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
}

ссылка: Сбой Google Maps SDK - частично разрешено

4 голосов
/ 26 апреля 2020

Полный и официальный ответ для всех:

Диагноз: Cra sh мобильных SDK Google Maps Platform (iOS & Android) при загрузке.

Обходной путь: * Очистите данные уязвимого приложения (не только кеш) или удалите, а затем переустановите уязвимое приложение.

  • Обход кода для iOS:

Рекомендуемое размещение код перед инициализацией GMSServices в приложении (_: didFinishLaunchingWithOptions :) (Swift) или в приложении: didFinishLaunchingWithOptions: (Objective- C). В частности:

Swift:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Objective- C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL]);
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

После развертывания в приложении вы можете подать заявку в службу поддержки Карт. если вы хотите, чтобы мы помогли ускорить его утверждение. Обязательно укажите идентификатор своего приложения, идентификатор комплекта и версию, которую вы хотите просмотреть в вашем случае.

  • Обход кода для Android:

    Рекомендуемое размещение код находится в Application.onCreate ():

    Java

    try {
      SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
      if (!hasFixedGoogleBug154855417.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
        File corruptedClientParametersData =
            new File(
              getFilesDir(),
              "DATA_ServerControlledParametersManager.data.v1."
                  + getBaseContext().getPackageName());
        corruptedZoomTables.delete();
        corruptedSavedClientParameters.delete();
        corruptedClientParametersData.delete();
        hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
      }
    } catch (Exception e) {
    
    }
    

    Kotlin

    try {
        val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
        if (!sharedPreferences.contains("fixed")) {
            val corruptedZoomTables = File(filesDir, "ZoomTables.data")
            val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
            val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
            corruptedZoomTables.delete()
            corruptedSavedClientParameters.delete()
            corruptedClientParametersData.delete()
            sharedPreferences.edit().putBoolean("fixed", true).apply()
        }
    } catch (exception: Exception) {
    
    }
    

Источник: https://issuetracker.google.com/issues/1548554

4 голосов
/ 24 апреля 2020

Решение, предлагаемое для iOS & Android:

https://issuetracker.google.com/issues/154855417#comment509

Карты SDK для Android v2 (включены в Сервисы Google Play)

Обновления Сервисов Google Play для исправления cra sh были опубликованы на всех устройствах с Сервисами Google Play версии 17.4.55 и новее. После установки обновления номер версии Служб Google Play на устройстве не изменяется. От разработчиков или конечных пользователей не требуется никаких действий для получения обновленного модуля Карт; однако разработчики могут проверить наличие модуля на данном устройстве с помощью следующей команды adb:

adb shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider

Вы должны увидеть строку Module Set ID: maps, указанную в разделе Module Sets.

Module Set ID: maps, Module Set Version: 2015120015120000

Скорости sh SDK Maps для Android v2 вернулись к норме.

На данный момент, если вы не обновили свое приложение с помощью клиента, Обходные пути для побочного кода, упомянутые ниже, вам не нужно предпринимать дальнейших действий.

Если вы уже обновили свое приложение с помощью обходных путей, вы можете удалить обходной путь в последующем обновлении вашего приложения (но оставить это решение safe).


Обход кода для Android:

Продуктивная версия была исправлена ​​(на стороне Google), но если у вас все еще есть проблемы с вашим эмулятором, вы должны выполните следующий код только один раз.

Рекомендуемое размещение кода в Application.onCreate ():

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    fixGoogleMapBugTemp()   //TODO: Then clean this line

//  ...  

}

/**
 * Observation: Invoke this method only once
 */
private fun fixGoogleMapBugTemp() {
    val googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!googleBug.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
    }
}

Обходной путь : Очистить данные приложения (не только кэш).

Примечание : копия проблемного c файла из пакетов приложений на устройстве, если кому-либо требуется для воспроизведения.

Block

Источник

GL

2 голосов
/ 28 апреля 2020

Вы должны вызвать следующий метод в onCreate вашего Android приложения, чтобы избежать взлома sh.

private fun clearCorruptedGMapsPreference() {
        try {
            val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
            if (!sharedPreferences.contains("fixed")) {
                val corruptedZoomTables = File(filesDir, "ZoomTables.data")
                val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
                val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
                val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
                corruptedZoomTables.delete()
                corruptedSavedClientParameters.delete()
                corruptedClientParametersData.delete()
                corruptedClientParametersDataV1.delete()
                sharedPreferences.edit().putBoolean("fixed", true).apply()
            }
        } catch (exception: Exception) {
            LogUtil.e(this@CourierApplication::class.java.name, "An error has happened. Error: ".plus(exception.cause?.message
                    ?: ""))
        }
    }
2 голосов
/ 27 апреля 2020

Это рабочий код для Xamarin. Вам необходимо установить пакет Nuget Xamarin.Essentials.

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...