Die Anzahl der Unity-Methoden überschreitet den Grenzwert von 64 KB


20

Ich habe gerade ein Problem im Zusammenhang mit einer 64k-Methode in Unity erhalten, daher kann ich mein Projekt nicht erstellen. Es zeigt, dass die Methodenbeschränkung die Grenze von 64.000 Methoden überschreitet. Kann mir hier jemand bei der Lösung dieses Problems helfen?

Antworten:


22

Diese Antwort stützt sich stark auf die offizielle Dokumentation von Android (insbesondere die zitierten Teile).


Einrichten der Multidex-Unterstützung für Unity Project

Was ist Multidex:

Android-Anwendungsdateien (APK-Dateien) enthalten ausführbare Bytecode-Dateien in Form von Dalvik Executable-Dateien (DEX-Dateien), die den kompilierten Code enthalten, mit dem Ihre App ausgeführt wird. Die Dalvik Executable-Spezifikation beschränkt die Gesamtzahl der Methoden, auf die in einer einzelnen DEX-Datei verwiesen werden kann, auf 65.536, einschließlich Android-Framework-Methoden, Bibliotheksmethoden und Methoden in Ihrem eigenen Code. Wenn Sie dieses Limit überschreiten, müssen Sie Ihren App-Erstellungsprozess so konfigurieren, dass mehr als eine DEX-Datei generiert wird, die als Multi-Dex-Konfiguration bezeichnet wird.

Wenn wir Multidex verwenden:

Wenn wir die Gesamtzahl der Methoden überschreiten, auf die in einer einzelnen DEX-Datei verwiesen werden kann, werden 65.536 angegeben, einschließlich Android-Framework-Methoden, Bibliotheksmethoden und Methoden in Ihrem eigenen Code.

Vermeiden Sie das 64K-Limit

Bevor Sie Ihre App für die Verwendung von mindestens 64 KB-Methodenreferenzen konfigurieren, sollten Sie die Gesamtzahl der von Ihrem App-Code aufgerufenen Referenzen verringern, einschließlich der von Ihrem App-Code oder den enthaltenen Bibliotheken definierten Methoden. Die folgenden Strategien können Ihnen dabei helfen, das Erreichen des DEX-Referenzlimits zu vermeiden:

Überprüfen Sie die direkten und transitiven Abhängigkeiten Ihrer App. - Stellen Sie sicher, dass alle großen Bibliotheksabhängigkeiten, die Sie in Ihre App einbeziehen, so verwendet werden, dass die der App hinzugefügte Codemenge überwiegt. Ein gängiges Anti-Pattern ist das Einschließen einer sehr großen Bibliothek, da einige nützliche Methoden nützlich waren. Wenn Sie die Abhängigkeiten Ihres App-Codes verringern, können Sie häufig das DEX-Referenzlimit umgehen.

Nicht verwendeten Code mit ProGuard entfernen - Aktivieren Sie die Code-Verkleinerung , um ProGuard für Ihre Release-Builds auszuführen. Durch das Aktivieren der Verkleinerung wird sichergestellt, dass Sie nicht verwendeten Code nicht mit Ihren APKs versenden.

Abgesehen von diesen offiziellen Tipps helfen Ihnen die folgenden Schritte beim Erstellen Ihres Unity-Projekts weiter:

  1. Erstellen Sie ein Android-Projekt mit Ihrem Unity Editor. Setp 1

  2. Importieren Sie Ihr Android-Projekt in Android Studio. Schritt 2

  3. Um Ihr App-Projekt für die Verwendung einer Multi-Dex-Konfiguration einzurichten, müssen Sie die folgenden Änderungen vornehmen.

    Wenn Ihr minSdkVersion auf 21 oder höher eingestellt ist, alle müssen Sie tun wird , multiDexEnabledum truein der Modulebene build.gradle Datei, wie hier gezeigt:

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

    Wenn Ihr minSdkVersionWert jedoch auf 20 oder niedriger festgelegt ist, müssen Sie die Multidex-Unterstützungsbibliothek wie folgt verwenden:

    3.1. Ändern Sie die build.gradle-Datei auf Modulebene, um multidex zu aktivieren, und fügen Sie die multidex-Bibliothek als Abhängigkeit hinzu, wie hier gezeigt:

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

    3.2. Führen Sie je nachdem, ob Sie die Application-Klasse überschreiben, einen der folgenden Schritte aus:

    • Wenn Sie die ApplicationKlasse nicht überschreiben , bearbeiten Sie die Manifestdatei, um sie wie folgt android:nameim <application>Tag festzulegen:
    <?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>
    
    • Wenn Sie die ApplicationKlasse überschreiben , ändern Sie sie wie folgt, um MultiDexApplication (falls möglich) zu erweitern:
    public class MyApplication extends MultiDexApplication { ... }
    • Wenn Sie die Application-Klasse überschreiben, die Basisklasse jedoch nicht geändert werden kann, können Sie stattdessen die attachBaseContext () -Methode überschreiben und MultiDex.install (this) aufrufen, um multidex zu aktivieren:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
  4. Überprüfen Sie den Fehler in anderen Plugins und bereinigen Sie das Projekt. Und sysc erneut.

  5. Wenn in Ihrem Projekt ein Abhängigkeitsproblem vorliegt, führen Sie diesen Befehl in Android Terminal aus

    % Gradle clean App."App name"
  6. Kopieren Sie diese Abhängigkeiten in Ihr Application Gradle unter Abhängigkeiten:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    
  7. Fügen Sie die signingConfig in Ihre Hauptprojekte Gradle.

    Schritt 8

    Oder setzen Sie den Signiermodus manuell in den Debug-Modus. Gehen Sie zu Datei -> Projektstruktur -> Unter Module Klicken Sie auf Ihr Projekt und wählen Sie unter Build-Typen Debug -> Signierkonfiguration -> Debug

    Bildbeschreibung hier eingeben

  8. Synchronisiere nun deinen Gradle und erstelle das Projekt.


1
Wie groß ist Ihr Projekt, das zu diesem Fehler geführt hat?
Evorlor

1
Tatsächlich verwende ich die Google AdMob-Mediation, damit 6-7 Anzeigen-SDK hinzugefügt werden und meine endgültige Projektmethode etwa 76.000 beträgt.
Rakesh

0

Ich würde Ihnen empfehlen, diesen Link zu verwenden, um Multidex-fähige Spiele direkt über Unity zu erstellen.

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

Hinweis: Dadurch wird Multidex nur in Unity selbst aktiviert (und Multidex-Probleme sollten behoben werden). Gradle-bezogene Probleme werden nicht behoben.


3
Dies ist derzeit eine Nur-Link-Antwort: Obwohl der Link die Frage beantwortet , ist dies bei der Antwort nicht der Fall. Vielleicht möchten Sie den Kern des verlinkten Inhalts hier einfügen (der Link an sich ist nicht schlecht, hat nur den Link, der schlecht ist).
Vaillancourt

Ich stimme Ihnen zu, aber die Schritte sind zu viele. Deshalb musste ich einen Artikel erstellen und den Link teilen. Ich würde es vorziehen, wenn ich nur eine Quelle der Wahrheit hätte, anstatt mehrere zu erschaffen.
Abhishek Patidar

Verstehen Sie, aber so funktionieren Stack Exchange-Sites nicht: Nur-Link-Antworten werden gelöscht. Wenn Sie möchten, kann ich diese Antwort in einen Kommentar zur Frage umwandeln: Sie behalten Ihre Referenz für die zukünftigen Benutzer sichtbar, und wir haben gewonnen Ich habe keine Antwort nur auf einen Link. (¤Das Hauptproblem bei den Nur-Link-Antworten ist, dass, wenn Sie Ihre Website herunterfahren (oder Ihr ISP mit all Ihren Daten bankrott geht), diese Antwort völlig wertlos ist. Aus diesem Grund sollte die Antwort die Frage beantworten.)
Vaillancourt

Sinn ergeben. Ich werde meine Antwort in vollständige Anweisungen umwandeln.
Abhishek Patidar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.