Il conteggio del metodo Unity supera il limite di 64 KB


20

Ho appena riscontrato un problema relativo a un metodo 64k in Unity, quindi non riesco a creare il mio progetto. Mostra che la limitazione del metodo supera il limite del conteggio dei metodi 64k. Quindi qualcuno qui può aiutarmi a risolvere questo problema?

Risposte:


22

Questa risposta si basa fortemente sulla documentazione ufficiale di Android (le parti citate, in particolare).


Come impostare il supporto Multidex per Unity Project

Cos'è Multidex:

I file delle applicazioni Android (APK) contengono file bytecode eseguibili sotto forma di file DEX (Dalvik Executable), che contengono il codice compilato utilizzato per eseguire l'app. La specifica eseguibile di Dalvik limita il numero totale di metodi a cui è possibile fare riferimento in un singolo file DEX a 65.536, inclusi i metodi del framework Android, i metodi della libreria e i metodi nel proprio codice. Per superare questo limite è necessario configurare il processo di creazione dell'app per generare più di un file DEX, noto come configurazione multi-dex.

Quando usiamo Multidex:

Quando superiamo il numero totale di metodi che è possibile fare riferimento in un singolo file DEX a 65.536, inclusi i metodi del framework Android, i metodi della libreria e i metodi nel proprio codice.

Evita il limite di 64 KB

Prima di configurare l'app per abilitare l'uso di 64K o più riferimenti a metodi, è necessario adottare misure per ridurre il numero totale di riferimenti chiamati dal codice dell'app, inclusi i metodi definiti dal codice dell'app o dalle librerie incluse. Le seguenti strategie possono aiutarti a evitare di colpire il limite di riferimento DEX:

Rivedi le dipendenze dirette e transitive della tua app : assicurati che ogni grande dipendenza della libreria che includi nella tua app sia utilizzata in modo da superare la quantità di codice che viene aggiunta all'app. Un anti-pattern comune è quello di includere una libreria molto grande perché alcuni metodi di utilità erano utili. Ridurre le dipendenze del codice dell'app può spesso aiutarti a evitare il limite di riferimento DEX.

Rimuovi il codice inutilizzato con ProGuard : abilita la riduzione del codice per eseguire ProGuard per le build di rilascio. L'abilitazione della riduzione consente di non spedire il codice inutilizzato con gli APK.

Oltre a questi suggerimenti ufficiali, durante la creazione del progetto Unity, seguire questi passaggi ti aiuterà ulteriormente:

  1. Crea un progetto Android dal tuo Unity Editor. Setp 1

  2. Importa il tuo progetto Android in Android Studio. Passo 2

  3. L'impostazione del progetto dell'app per l'utilizzo di una configurazione multi-dex richiede la modifica seguente.

    Se il vostro minSdkVersion è impostato su 21 o superiore, tutto quello che dovete fare è impostare multiDexEnableda truenel file build.gradle a livello di modulo, come illustrato di seguito:

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

    Tuttavia, se il valore minSdkVersionimpostato è 20 o inferiore, è necessario utilizzare la libreria di supporto multidex come segue:

    3.1. Modificare il file build.gradle a livello di modulo per abilitare multidex e aggiungere la libreria multidex come dipendenza, come mostrato qui:

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

    3.2. A seconda che si ignori la classe Application, eseguire una delle seguenti operazioni:

    • Se non si ignora la Applicationclasse, modificare il file manifest per impostarlo android:namenel <application>tag come segue:
    <?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 si ignora la Applicationclasse, modificarla per estendere MultiDexApplication (se possibile) come segue:
    public class MyApplication extends MultiDexApplication { ... }
    • Oppure, se si esegue l'override della classe Application ma non è possibile modificare la classe base, è possibile invece sostituire il metodo attachBaseContext () e chiamare MultiDex.install (questo) per abilitare multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
  4. Controlla l'errore dai manifest di altri plugin e pulisci il progetto.

  5. In caso di problemi di dipendenza nel progetto, eseguire questo comando in Terminale Android

    % Gradle clean App."App name"
  6. Copia queste dipendenze nel tuo Grado applicazione, sotto le dipendenze:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    
  7. Aggiungi signingConfig nel tuo progetto principale Gradle.

    Passaggio 8

    Oppure imposta manualmente la modalità Firma sulla modalità Debug, vai su File -> Struttura del progetto -> Sotto Moduli Fai clic sul tuo progetto e in Tipi di build seleziona Debug -> scegli Config firma -> debug

    inserisci qui la descrizione dell'immagine

  8. Ora sincronizza il tuo Gradle e costruisci il progetto.


1
Quanto è grande il tuo progetto che ha portato a questo errore?
Evorlor,

1
In realtà, sto utilizzando la mediazione di Google AdMob, per cui viene utilizzato per aggiungere 6-7 annunci SDK, quindi il mio conteggio del metodo dei progetti finali è stato di circa 76k.
Rakesh,

0

Ti consiglierei di passare attraverso questo link che ti aiuterà a creare giochi abilitati multidex direttamente attraverso l'unità.

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

Nota: questo abiliterà il multidex solo nell'unità stessa (e dovrebbe risolvere i problemi relativi al multidex). Non risolverà i problemi relativi alla pendenza.


3
Questa è attualmente una risposta solo al link : sebbene il link risponda alla domanda, la risposta no. Si potrebbe voler includere il nucleo del contenuto collegato qui (il link di per sé non è male, è solo havin solo il legame che è male).
Vaillancourt

Sono d'accordo con te ma i passaggi scritti sono troppi. Ecco perché ho dovuto creare un articolo e condividere il link. Preferirei così in modo da avere una sola fonte di verità piuttosto che crearne una multipla.
Abhishek Patidar,

Capisci, ma non è così che funzionano i siti di Stack Exchange: le risposte di solo collegamento vengono eliminate. Se vuoi, posso convertire questa risposta in un commento della domanda: manterrai il tuo riferimento visibile per i futuri utenti e abbiamo vinto non hai un link solo risposta. (¤Il problema principale con il solo link è che se abbatti il ​​tuo sito (o il tuo ISP fallisce con tutti i tuoi dati), questa risposta sarà totalmente priva di valore; ecco perché la risposta dovrebbe rispondere alla domanda.)
Vaillancourt

Ha senso. Convertirò la mia risposta per completare le istruzioni.
Abhishek Patidar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.