A contagem do método da unidade excede o limite de 64K


20

Acabei de ter um problema relacionado a um método de 64k no Unity, por isso não consigo criar meu projeto. Ele mostra que a limitação do método excede o limite da contagem do método de 64k. Então, alguém aqui pode me ajudar a resolver esse problema?

Respostas:


22

Esta resposta depende muito da documentação oficial do Android (as partes citadas, especificamente).


Como configurar o suporte Multidex para o projeto Unity

O que é o Multidex:

Os arquivos do aplicativo Android (APK) contêm arquivos executáveis ​​de bytecode na forma de arquivos Dalvik Executable (DEX), que contêm o código compilado usado para executar seu aplicativo. A especificação do Executável Dalvik limita o número total de métodos que podem ser referenciados em um único arquivo DEX a 65.536, incluindo métodos de estrutura do Android, métodos de biblioteca e métodos em seu próprio código. Para ultrapassar esse limite, você deve configurar o processo de criação do aplicativo para gerar mais de um arquivo DEX, conhecido como configuração multi-dex.

Quando usamos o Multidex:

Quando excedemos o número total de métodos que podem ser referenciados em um único arquivo DEX para 65.536, incluindo métodos de estrutura do Android, métodos de biblioteca e métodos em seu próprio código.

Evite o limite de 64K

Antes de configurar seu aplicativo para permitir o uso de 64 K ou mais de referências de método, você deve executar etapas para reduzir o número total de referências chamadas pelo código do aplicativo, incluindo métodos definidos pelo código do aplicativo ou pelas bibliotecas incluídas. As estratégias a seguir podem ajudá-lo a evitar atingir o limite de referência DEX:

Revise as dependências diretas e transitivas do seu aplicativo - verifique se qualquer dependência de biblioteca grande incluída no seu aplicativo é usada de maneira que supere a quantidade de código que está sendo adicionado ao aplicativo. Um anti-padrão comum é incluir uma biblioteca muito grande porque alguns métodos utilitários foram úteis. Reduzir as dependências do código do aplicativo pode ajudar a evitar o limite de referência do DEX.

Remova o código não utilizado com o ProGuard - ative o encolhimento do código para executar o ProGuard em suas compilações de versão. A ativação da redução garante que você não esteja enviando código não utilizado com seus APKs.

Além dessas dicas oficiais, ao criar seu projeto do Unity, seguir estas etapas o ajudará ainda mais:

  1. Crie um projeto Android a partir do seu Unity Editor. Setp 1

  2. Importe seu projeto Android no Android Studio. Passo 2

  3. A configuração do seu projeto de aplicativo para usar uma configuração multi dex requer que você faça a seguinte modificação.

    Se o seu minSdkVersion está definido para 21 ou superior, tudo o que você precisa fazer é definir multiDexEnableda trueem seu arquivo build.gradle do nível de módulo, como mostrado aqui:

    android {
    defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }

    No entanto, se você minSdkVersionestiver definido como 20 ou menos, deverá usar a biblioteca de suporte multidex da seguinte maneira:

    3.1 Modifique o arquivo build.gradle no nível do módulo para ativar o multidex e adicione a biblioteca multidex como uma dependência, conforme mostrado aqui:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    3.2 Dependendo de você substituir a classe Application, execute um dos seguintes procedimentos:

    • Se você não substituir a Applicationclasse, edite seu arquivo de manifesto para definir android:namena <application>tag da seguinte maneira:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    • Se você substituir a Applicationclasse, altere-a para estender o MultiDexApplication (se possível) da seguinte maneira:
    public class MyApplication extends MultiDexApplication { ... }
    • Ou, se você substituir a classe Application, mas não for possível alterar a classe base, poderá substituir o método attachBaseContext () e chamar MultiDex.install (this) para ativar o multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Verifique o erro do manifesto de outros plugins e limpe o projeto.

  5. Se houver algum problema de dependência no seu projeto, execute este comando no Android Terminal

    % Gradle clean App."App name"
  6. Copie estas dependências no Application Gradle, em dependências:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Adicione o signatureConfig nos seus principais projetos Gradle.

    Etapa 8

    Ou defina manualmente o modo de Assinatura para o modo de Depuração, vá em Arquivo -> Estrutura do Projeto -> Em Módulos Clique no seu projeto e em Tipos de Compilação, selecione Depuração -> escolha Configuração de Assinatura> depuração

    insira a descrição da imagem aqui

  8. Agora sincronize seu Gradle e construa o projeto.


11
Qual o tamanho do seu projeto que levou a esse erro?
Evorlor 10/07

11
Na verdade, estou usando a mediação do Google AdMob, para que isso seja usado para adicionar de 6 a 7 anúncios de SDK, para que minha contagem final de métodos de projetos seja de cerca de 76 mil.
Rakesh

0

Eu recomendo que você acesse este link, que o ajudará a criar jogos habilitados para multidex diretamente através da unidade.

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

Nota: Isso permitirá apenas o multidex na própria unidade (e deve corrigir problemas com multidex). Não corrigirá problemas relacionados ao gradle.


3
Atualmente, esta é uma resposta apenas para link: embora o link responda à pergunta, a resposta não. Você pode querer incluir o núcleo do conteúdo vinculado aqui (o link em si não é ruim, é apenas havin única ligação que é ruim).
Vaillancourt

Eu concordo com você, mas os passos escritos são muitos. Por isso tive que criar um artigo e compartilhar o link. Eu preferiria assim, para ter apenas uma fonte de verdade, em vez de criar múltiplas.
Abhishek Patidar

Entenda, mas não é assim que os sites do Stack Exchange funcionam: respostas somente para links são excluídas. Se você quiser, posso converter esta resposta em um comentário da pergunta: você manterá sua referência visível para os usuários futuros e vencemos. Só tenho um link para resposta. (¤ A principal questão com as respostas apenas para links é que, se você derrubar seu site (ou seu ISP falir com todos os seus dados), essa resposta será totalmente inútil; é por isso que a resposta deve responder à pergunta.)
Vaillancourt

Faz sentido. Vou converter minha resposta em instruções completas.
Abhishek Patidar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.