# Resolvendo conflitos do Google Play Services

Diferentes plugins para diferentes frameworks podem usar diferentes versões da biblioteca google-play-services, fazendo com que seu projeto falhe ao compilar ou trave porque a versão da biblioteca está desatualizada.

As seções a seguir fornecem soluções para diferentes plugins.

## Localização da biblioteca

Você pode encontrar a biblioteca do Google Play Services em `<Android SDK>/extras/google`.

A biblioteca está disponível em dois formatos:

1. **Arquivo jar monolítico** (contendo todos os componentes do Google Play Services em um único arquivo):
   ```
   sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
   ```

2. **Arquivos aar modulares** (Android Archive), onde cada componente está em um arquivo separado:
   ```
   sdk/extras/google/m2repository/com/google/android/gms/…
   ```

Um arquivo **aar** pode ser reduzido a um arquivo **jar** (nem todos os frameworks suportam aar no momento) descompactando o arquivo (aar é um arquivo zip) e pegando o **classes.jar** - o código da biblioteca.

### 1. Cordova

Todos os conflitos do google play services no Cordova são resolvidos automaticamente usando o gradle. Às vezes (por exemplo, quando diferentes plugins usam diferentes versões principais da biblioteca), a resolução pode falhar e podem aparecer duas versões diferentes da mesma biblioteca na compilação resultante.

### 2. Unity, Appcelerator Titanium

Você pode encontrar a biblioteca do Google Play Services no plugin (ou projeto de exemplo). Eles são fáceis de atualizar/alterar/remover para resolver possíveis conflitos:

* Unity: [https://github.com/Pushwoosh/pushwoosh-unity/tree/master/PushwooshUnitySample/Assets/Plugins/Android](https://github.com/Pushwoosh/pushwoosh-unity/tree/master/PushwooshUnitySample/Assets/Plugins/Android)
* Unity e plugin do Google Analytics: O plugin do Google Analytics usa uma biblioteca do google play desatualizada, que precisa ser atualizada. Mais informações aqui: [https://github.com/Pushwoosh/pushwoosh-unity/issues/5](https://github.com/Pushwoosh/pushwoosh-unity/issues/5)

```bash
rm -rf Assets/Plugins/Android/google-play-services_lib/libs
rm -rf Assets/Plugins/Android/google-play-services_lib/res
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-analytics/8.4.0/play-services-analytics-8.4.0.aar Assets/Plugins/Android/
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-ads/8.4.0/play-services-ads-8.4.0.aar Assets/Plugins/Android/
```

* Appcelerator Titanium (observe que a versão do módulo pode mudar mais rápido do que este documento!): [https://github.com/Pushwoosh/pushwoosh-appcelerator-titanium/tree/master/Module-Source/android/src/com/pushwoosh/module](https://github.com/Pushwoosh/pushwoosh-appcelerator-titanium/tree/master/Module-Source/android/src/com/pushwoosh/module)

### 3. Adobe Air

Pegue a extensão ANE, extraia-a, modifique-a e reempacote-a.

Use o seguinte exemplo com **PushNotification.ane**:

```bash
unzip PushNotification.ane -d tmp
```

Este comando extrai o conteúdo do arquivo .ane para o diretório `tmp`.

Agora em _tmp/META-INF/ANE/Android-ARM/_ e _tmp/META-INF/ANE/Android-x86/_ você pode encontrar todas as bibliotecas: android-support_, play-services_, que podem ter sido modificadas/atualizadas/removidas.

Se você ainda seguir o link para o documento acima, altere `tmp/META-INF/ANE/Android-ARM/platform.xml` e `tmp/META-INF/ANE/Android-x86/platform.xml`, então compacte a extensão novamente e tudo deverá funcionar normalmente.

Se você receber o erro:

> PushNotification.ane is not a valid native extension file.

Reempacote a extensão usando os seguintes passos:

1. Exclua `tmp/META-INF/ANE/Android-ARM/platform.xml` e `tmp/META-INF/ANE/Android-x86/platform.xml`
2. Modifique conforme o guia no link acima `tmp/META-INF/ANE/Android-ARM/android-depends.xml` e `tmp/META-INF/ANE/Android-x86/android-depends.xml` em vez disso
3. Execute os seguintes comandos bash:

```bash
#rename platform.xml on iOS, required to repackage the extension
mv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml 

#pack the extension back with adt
cd tmp/META-INF/ANE/
“${flex.sdk}/bin/adt" -package -target ane PushNotification.ane extension.xml -swc ../../../../SWC-Pushwoosh/PushNotification.swc -platform iPhone-ARM -platformoptions iPhone-ARM/platform-iOS.xml -C iPhone-ARM/ . -platform Android-ARM -platformoptions Android-ARM/android-depends.xml -C Android-ARM/ . -platform Android-x86 -C Android-x86/ . -platformoptions Android-x86/android-depends.xml -platform default -C default/ .
```

Você pode encontrar PushNotification.swc aqui: [https://github.com/Pushwoosh/pushwoosh-adobe-air/blob/master/SWC-Pushwoosh/PushNotification.swc](https://github.com/Pushwoosh/pushwoosh-adobe-air/blob/master/SWC-Pushwoosh/PushNotification.swc)

### 4. Unreal Engine

O Unreal Engine e o Plugin Pushwoosh quase sempre entrarão em conflito um com o outro. Isso se explica pelo fato de o Unreal Engine conter os serviços do Google Play por padrão, e diferentes versões do Engine usarem diferentes versões dessas bibliotecas. O plugin Pushwoosh também usa essas bibliotecas, no entanto, um subconjunto diferente. Sempre tenha cuidado ao integrar o Plugin Pushwoosh para Unreal Engine. Mesmo que seu projeto pareça compilar e funcionar bem, certifique-se de que tanto o Pushwoosh quanto o Unreal Engine usem a mesma versão do Google Play Services. Usar diferentes versões do google-play-services em um projeto resulta em comportamento indefinido.

Para resolver um conflito, você deve fazer o seguinte:

**1.** Determine quais bibliotecas do Google Play services já são usadas em um projeto. Verifique os diretórios `${UNREAL_PROJECT}/Intermediate/Android/APK/JavaLibs` e `${UNREAL_PROJECT}/Intermediate/Android/APK/libs`. Por exemplo, no [projeto de exemplo](https://github.com/Pushwoosh/pushwoosh-unreal-engine) criado usando o Unreal Engine 4.15, existem as seguintes bibliotecas:

JavaLibs:

* downloader_library
* play-services-ads-lite-9.2.0
* play-services-auth-base-9.2.0
* play-services-basement-9.2.0
* play-services-drive-9.2.0
* play-services-gass-9.2.0
* play-services-plus-9.2.0
* support-v4-23.0.0
* play-services-ads-9.2.0
* play-services-auth-9.2.0
* play-services-base-9.2.0
* play-services-clearcut-9.2.0
* play-services-games-9.2.0
* play-services-nearby-9.2.0
* play-services-tasks-9.2.0
* pushwoosh-ue-plugin // Adicionado pelo plugin Pushwoosh

libs:

* SystemUtils.jar
* VrApi.jar
* play-services-gcm-9.2.0.jar // Adicionado pelo plugin Pushwoosh
* play-services-iid-9.2.0.jar // Adicionado pelo plugin Pushwoosh

**2.** Se as versões das bibliotecas play-services* usadas no Pushwoosh e no Unreal Engine não corresponderem, remova essas bibliotecas do [plugin Pushwoosh](https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/JavaLibs/pushwoosh-ue-plugin).

**3.** Determine quais bibliotecas ausentes você deve adicionar ao Plugin Pushwoosh. O plugin requer as bibliotecas android-support-v4, play-services-base, play-services-basement, play-services-gcm, play-services-iid. Para o projeto de exemplo, apenas **play-services-gcm** e **play-services-iid** não se sobrepõem, então elas são as únicas bibliotecas que devem ser adicionadas neste caso específico.

**4.** Adicione a biblioteca colocando o arquivo .jar do SDK do Android em [https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/libs](https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/libs). A localização das bibliotecas do Google Play é descrita no início deste artigo.

## Compartilhe seu feedback conosco

Seu feedback nos ajuda a criar uma experiência melhor. Se você enfrentar alguma dificuldade durante o processo de integração do SDK, compartilhe suas ideias conosco [através deste formulário](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).