Le nombre de méthodes Unity dépasse la limite de 64 Ko

20

Je viens de recevoir un problème lié à une méthode 64k dans Unity, c'est pourquoi je ne parviens pas à créer mon projet. Il montre que la limitation de méthode dépasse la limite du nombre de méthodes de 64 Ko. Alors, quelqu'un ici peut-il m'aider à résoudre ce problème?

Rakesh
la source

Réponses:

22

Cette réponse s'appuie fortement sur la documentation officielle d'Android (les parties citées, en particulier).


Comment configurer la prise en charge Multidex pour Unity Project

Qu'est-ce que Multidex:

Les fichiers d'application Android (APK) contiennent des fichiers de bytecode exécutables sous forme de fichiers exécutables Dalvik (DEX), qui contiennent le code compilé utilisé pour exécuter votre application. La spécification Dalvik Executable limite le nombre total de méthodes pouvant être référencées dans un seul fichier DEX à 65 536, y compris les méthodes de framework Android, les méthodes de bibliothèque et les méthodes dans votre propre code. Dépasser cette limite nécessite que vous configuriez votre processus de génération d'application pour générer plus d'un fichier DEX, appelé configuration multi-dex.

Lorsque nous utilisons Multidex:

Lorsque nous dépassons le nombre total de méthodes pouvant être référencées dans un seul fichier DEX à 65 536, y compris les méthodes de framework Android, les méthodes de bibliothèque et les méthodes dans votre propre code.

Évitez la limite de 64 Ko

Avant de configurer votre application pour permettre l'utilisation de 64 Ko ou plus de références de méthode, vous devez prendre des mesures pour réduire le nombre total de références appelées par votre code d'application, y compris les méthodes définies par votre code d'application ou les bibliothèques incluses. Les stratégies suivantes peuvent vous aider à éviter d'atteindre la limite de référence DEX:

Passez en revue les dépendances directes et transitives de votre application - Assurez-vous que toute grande dépendance de bibliothèque que vous incluez dans votre application est utilisée d'une manière qui dépasse la quantité de code ajoutée à l'application. Un anti-modèle commun consiste à inclure une très grande bibliothèque car quelques méthodes utilitaires étaient utiles. La réduction des dépendances du code de votre application peut souvent vous aider à éviter la limite de référence DEX.

Supprimez le code inutilisé avec ProGuard - Activez la réduction de code pour exécuter ProGuard pour vos versions. L'activation de la réduction garantit que vous n'envoyez pas de code inutilisé avec vos fichiers APK.

Outre ces conseils officiels, lors de la création de votre projet Unity, les étapes suivantes vous aideront davantage:

  1. Créez un projet Android à partir de votre éditeur Unity. Setp 1

  2. Importez votre projet Android dans Android Studio. Étape 2

  3. La configuration de votre projet d'application pour utiliser une configuration multi dex nécessite que vous apportiez la modification suivante.

    Si votre minSdkVersion est réglé sur 21 ou plus, tout ce que vous devez faire est de mettre multiDexEnabledà truevotre fichier build.gradle niveau du module, comme indiqué ici:

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

    Cependant, si votre minSdkVersionest défini sur 20 ou moins, vous devez utiliser la bibliothèque de prise en charge multidex comme suit:

    3.1. Modifiez le fichier build.gradle au niveau du module pour activer multidex et ajoutez la bibliothèque multidex en tant que dépendance, comme indiqué ici:

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

    3.2. Selon que vous remplacez la classe Application, effectuez l'une des opérations suivantes:

    • Si vous ne remplacez pas la Applicationclasse, modifiez votre fichier manifeste à définir android:namedans la <application>balise comme suit:
    <?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>
    • Si vous remplacez la Applicationclasse, modifiez-la pour étendre MultiDexApplication (si possible) comme suit:
    public class MyApplication extends MultiDexApplication { ... }
    • Ou si vous remplacez la classe Application mais qu'il n'est pas possible de modifier la classe de base, vous pouvez remplacer la méthode attachBaseContext () et appeler MultiDex.install (this) pour activer le multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Vérifiez le formulaire d'erreur des autres plugins et nettoyez le projet. Et sysc à nouveau.

  5. S'il y a un problème de dépendance dans votre projet, exécutez cette commande dans Android Terminal

    % Gradle clean App."App name"
  6. Copiez ces dépendances dans votre Gradle d'application, sous dépendances:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Ajoutez le signatureConfig dans vos projets principaux Gradle.

    Étape 8

    Ou définissez le mode de signature sur le mode débogage manuellement, allez dans Fichier -> Structure du projet -> Sous les modules Cliquez sur votre projet et sous Types de construction sélectionnez Déboguer -> choisissez Configuration de la signature-> déboguer

    entrez la description de l'image ici

  8. Synchronisez maintenant votre Gradle et générez le projet.

Rakesh
la source
1
Quelle est la taille de votre projet qui a conduit à cette erreur?
Evorlor
1
En fait, j'utilise la médiation Google AdMob, donc pour cela, il est utilisé pour ajouter 6-7 annonces SDK, donc le nombre final de méthodes pour mes projets était d'environ 76 000.
Rakesh
0

Je vous recommanderais de parcourir ce lien qui vous aidera à créer des jeux activés multidex directement par l'unité.

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

Remarque: Cela n'activera que le multidex dans l'unité elle-même (et devrait résoudre les problèmes de multidex). Il ne résoudra pas les problèmes liés à Gradle.

Abhishek Patidar
la source
3
Il s'agit actuellement d'une réponse de lien uniquement: bien que le lien réponde à la question, la réponse ne le fait pas. Vous voudrez peut-être inclure ici le cœur du contenu lié (le lien en soi n'est pas mauvais, il n'a que le lien qui est mauvais).
Vaillancourt
Je suis d'accord avec vous mais les étapes écrites sont trop nombreuses. C'est pourquoi j'ai dû créer un article et partager le lien. Je préférerais cette façon pour que je n'aie qu'une seule source de vérité plutôt que d'en créer plusieurs.
Abhishek Patidar
En fait, mais ce n'est pas ainsi que fonctionnent les sites Stack Exchange: les réponses de lien uniquement sont supprimées.¤ Si vous le souhaitez, je peux convertir cette réponse en commentaire de la question: vous garderez votre référence visible pour les futurs utilisateurs, et nous avons gagné 'ai pas de réponse de lien seulement. (¤Le principal problème avec les réponses de lien uniquement est que si vous supprimez votre site (ou si votre FAI fait faillite avec toutes vos données), cette réponse sera totalement sans valeur; c'est pourquoi la réponse devrait répondre à la question.)
Vaillancourt
Faites sens. Je convertirai ma réponse en instructions complètes.
Abhishek Patidar