android - Muitas referências de campo: 70613; max é 65536




unity3d android-multidex (2)

Então, o que devo fazer para diminuir a contagem de referência?

Você tem tantos plugins com muitas funções / campos. Há um limite ao criar isso a partir do Editor do Unity e você atingiu esse limite.

Para diminuir a contagem de referências, você precisa excluir alguns desses plugins, mas tenho certeza de que precisa deles e a exclusão pode não ser a solução apropriada nesse caso.

A única maneira de contornar isso e criar para o Android no momento é export o projeto como projeto do Android e construí-lo com o Android Studio . Isso remove o limite de referência imposto pelo Editor do Unity.

EDITAR

Esqueci de mencionar que você precisa habilitar o multidex depois de exportá-lo. Como muitas pessoas passam por esse problema diariamente, decidi adicionar instruções detalhadas sobre como corrigir esse problema exportando-o e também como corrigi-lo sem exportá-lo .

CORRIGIR EXPORTANDO O PROJETO

1A .Exporte o Projeto Unity como Projeto Android.

1B .Importação para o Android Studio:

Se você receber um erro de classificação ao importar para o Android Studio, como o abaixo:

Erro: org.gradle.api.internal.tasks.DefaultTaskInputs $ TaskInputUnionFileCollection não pode ser convertido em org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection

No bloco "dependências" que está no bloco "buildscript" no arquivo build.gradle , altere:

classpath 'com.android.tools.build.gradle.2.1.0'

para

classpath 'com.android.tools.build:gradle:2.2.3'

Se você exportar o projeto e ainda assim receber o mesmo erro, será necessário ativar manualmente o multidex. Abaixo está uma etapa simplificada a seguir do doc do Google que será mostrado a você no erro:

2. Adicione android:name="android.support.multidex.MultiDexApplication" > à tag do aplicativo no arquivo AndroidManifest.xml .

3. Adicione a compile 'com.android.support:multidex:1.0.1' ao bloco "dependências" no arquivo build.gradle .

4. Adicione multiDexEnabled true ao bloco "defaultConfig" , que está no bloco "android" no arquivo build.gradle .

Crie o APK e veja se funciona. Se o erro da contagem de referência desaparecer, pare aqui.

5. Obtendo uma exceção de sobrecarga do GC como a abaixo?

java.lang.OutOfMemoryError: limite de sobrecarga do GC excedido

Aumente o tamanho do heap que será usado ao executar a operação dex. Nesta solution , adicione o seguinte ao bloco "android" no arquivo build.gradle :

dexOptions {
    javaMaxHeapSize "4g"
}

CORREÇÃO SEM EXPORTAÇÃO DO PROJETO

É necessário ter o Unity 5.5 e superior para fazer isso:

1. Vá para <UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Tools\GradleTemplates , copie o arquivo mainTemplate.gradle para a mainTemplate.gradle <ProjectName>Assets\Plugins\Android .

2. Vá para <UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk , copie o arquivo AndroidManifest.xml para o <ProjectName>Assets\Plugins\Android

3. Abra os mainTemplate.gradle e AndroidManifest.xml que você acabou de copiar com o Visual Studio e, em seguida, faça a modificação da instrução FIX EXPORTING THE PROJECT acima. Pule / Ignore as etapas 1A e 1B . Basta seguir as etapas de 2 a 5 . É isso aí.

É assim que o This final deve ser e é o this final. Isso é apenas para fins de referência. Sugiro que você não use o meu, mas siga as etapas de cópia acima para criar o seu, porque as versões futuras do Unity podem vir com arquivos diferentes. Você deseja certificar-se de usar o mais recente ou pode ter problemas para construí-lo.

4. Crie o APK e veja se funciona:

-

Se o erro da contagem de referência desaparecer, pare aqui:

5. Obtendo um erro como o abaixo?

Falha na compilação As compilações de liberação precisam ser assinadas ao usar o Gradle

Basta sign o apk nas Configurações de publicação nas Configurações de compilação . Você pode criar um novo keystore ou usar um existente.

6. Outro erro como abaixo?

Erro: evite codificar o modo de depuração; deixá-lo de fora permite que as versões de depuração e lançamento atribuam automaticamente um [HardcodedDebugMode]

Remova android:debuggable="true"> do arquivo AndroidManifest.xml .

Se essa solução não exportadora não funcionou para você, você deverá usar a solução exportadora.

Meu projeto usa estes plugins:

  • OneSignal
  • GooglePlayServices
  • Ajustar
  • Google Analytics
  • Unity IAP
  • SDK do Facebook

Esses plugins são usados ​​em quase todos os projetos.

Mas acabei a contagem de referências de campo

Esta é a minha lista de arquivos .aar

O que devo fazer para diminuir a contagem de referência?


IMO, a resposta aceita não está correta (ou apenas parcialmente correta). A exportação de um estúdio Android não corrigirá "magicamente" esse problema. Além disso, pela minha experiência, o projeto exportado do Android studio nem sempre é compilado imediatamente, e você precisa consertar muitas coisas antes de poder construí-lo.

Você está usando muitos plugins e, portanto, enfrentou uma limitação do Android por não conseguir fazer referência a mais de métodos de 64k.

Existem algumas coisas que você pode tentar resolver:

  1. Exclua alguns desses plugins, se possível (como já sugerido na resposta aceita).
  2. Use doc . No passado, isso só era possível exportando o projeto para o estúdio Android e construindo-o lá. A partir do Unity 5.5, você pode criar seu projeto usando Gradle diretamente do Unity. Isso significa que você pode criar um arquivo gradle personalizado que configure seu jogo para usar o Multidex. Isso não reduz a contagem de ref do método, mas funciona contornando a contagem Java nativa em vários arquivos dex.
  3. Use o ProGuard - como você pode usar o Gradle do Unity, também é possível definir o ProGuard para executar e remover qualquer código que não seja usado.




android-multidex