Кількість методів Unity перевищує ліміт 64K


20

Щойно у мене виникла проблема, пов’язана з методом 64k в Unity, тому я не можу створити свій проект. Він показує, що обмеження методів перевищує ліміт кількості 64к методу. Тож хтось тут може допомогти мені вирішити цю проблему?

Відповіді:


22

Ця відповідь значною мірою покладається на офіційну документацію Android (зокрема цитовані частини).


Як налаштувати підтримку Multidex для Unity Project

Що таке мультидекс:

Файли програми Android (APK) містять виконувані файли байт-кодів у вигляді файлів Dalvik Executable (DEX), які містять скомпільований код, який використовується для запуску вашої програми. Специфікація Dalvik Executable обмежує загальну кількість методів, на які можна посилатися в одному файлі DEX, до 65 536, включаючи рамкові методи Android, методи бібліотеки та методи у власному коді. Для подолання цього обмеження потрібно налаштувати процес збирання додатків для створення більше одного файлу DEX, відомого як конфігурація мультидекса.

Коли ми використовуємо Multidex:

Коли ми перевищуємо загальну кількість методів, на які можна посилатися в одному файлі DEX, до 65 536 - включаючи рамкові методи Android, бібліотечні методи та методи у власному коді.

Уникайте обмеження 64K

Перш ніж налаштувати додаток, щоб увімкнути використання 64K або більше посилань на методи, слід вжити заходів щодо зменшення загальної кількості посилань, викликаних вашим кодом додатка, включаючи методи, визначені кодом вашого додатка або включеними бібліотеками. Наступні стратегії можуть допомогти вам уникнути перевищення базового ліміту DEX:

Перегляньте прямі та перехідні залежності вашого додатка. Переконайтеся, що будь-яка велика залежність бібліотеки, яку ви включаєте у свій додаток, використовується таким чином, що перевищує кількість коду, який додається до програми. Поширеним анти-шаблоном є включення дуже великої бібліотеки, оскільки кілька корисних методів були корисними. Зменшення залежностей від коду програми часто може допомогти вам уникнути довідкового ліміту DEX.

Видаліть невикористаний код за допомогою ProGuard - увімкніть скорочення коду для запуску ProGuard для вашої версії версій. Увімкнення скорочення гарантує, що ви не доставляєте невикористаний код з APK.

Окрім цих офіційних порад, під час створення проекту Unity наступні кроки допоможуть вам:

  1. Створіть проект Android від свого Unity Editor. Налаштування 1

  2. Імпортуйте свій Android-проект в Android Studio. Крок 2

  3. Налаштування вашого додатка для використання конфігурації мульти dex вимагає внести наступні зміни.

    Якщо minSdkVersion встановлений на 21 або вище, все , що вам потрібно зробити , це встановити , multiDexEnabledщоб trueу файлі build.gradle рівня модуля, як показано тут:

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

    Однак якщо для вашого minSdkVersionвстановлено значення 20 або менше, вам потрібно використовувати бібліотеку підтримки мультидекса, як описано нижче:

    3.1. Змініть файл build.gradle на рівні модуля, щоб увімкнути multidex та додати бібліотеку мультидекса як залежність, як показано тут:

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

    3.2. Залежно від того, перекриєте ви клас програми, виконайте одну з наступних дій:

    • Якщо ви не переосмислюєте Applicationклас, відредагуйте файл маніфесту, щоб встановити android:nameв <application>тегу наступним чином:
    <?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>
    • Якщо ви переосмислите Applicationклас, змініть його, щоб розширити MultiDexApplication (якщо можливо) наступним чином:
    public class MyApplication extends MultiDexApplication { ... }
    • Або якщо ви перевстановите клас Application, але змінити базовий клас неможливо, тоді ви можете замінити метод attachBaseContext () і викликати MultiDex.install (це), щоб увімкнути multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Перевірте помилку у маніфесті інших плагінів та очистіть проект. І знову запустіть систему.

  5. Якщо у вашому проекті є якась проблема залежності, запустіть цю команду в Android Terminal

    % Gradle clean App."App name"
  6. Скопіюйте ці залежності в Gradle Application, під залежність:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Додайте підписConfig у своїх основних проектах Gradle.

    Крок 8

    Або встановіть режим підписання в режимі налагодження вручну. Перейдіть у меню Файл -> Структура проекту -> У розділі Модулі Клацніть на вашому проекті та в розділі Типи збірки виберіть Налагодження -> Виберіть налаштування підпису-> налагодження

    введіть тут опис зображення

  8. Тепер синхронізуйте Gradle і складіть проект.


1
Наскільки великий ваш проект призвів до цієї помилки?
Еворлор

1
Насправді я використовую посередництво Google AdMob, тому для додавання 6-7 SDK рекламних оголошень, тому кількість моїх кінцевих проектів становила приблизно 76 к.
Ракеш

0

Я б рекомендував вам перейти за цим посиланням, яке допоможе вам створити ігри з підтримкою мультидекса безпосередньо через єдність.

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

Примітка. Це дозволить увімкнути лише мультидекс в самому єдності (і має виправити проблеми з кількома значеннями). Це не виправить проблеми, пов'язані з градуюванням.


3
На даний момент це лише відповідь: хоча посилання відповідає на питання, відповідь не відповідає . Ви можете включити сюди ядро ​​зв'язаного контенту (посилання само по собі непогане, це просто лише посилання, яке погано).
Vaillancourt

Я згоден з вами, але написаних кроків занадто багато. Ось чому мені довелося створити статтю та поділитися посиланням. Я вважаю за краще так, щоб у мене було лише одне джерело істини, а не створення кількох.
Абхішек Патідар

Зрозумійте, але це не так, як працюють сайти обміну стеками: видаляються лише відповіді на посилання.¤ Якщо ви хочете, я можу конвертувати цю відповідь у коментар до запитання: ви збережете свою посилання для майбутніх користувачів, і ми перемогли я не маю відповідь лише за посиланням. (¤Головною проблемою, що відповідає лише на посилання, є те, що якщо ви знімете свій сайт (або ваш Інтернет-провайдер збанкрутує всі ваші дані), ця відповідь буде абсолютно нікчемною; саме тому відповідь повинна відповісти на питання.)
Vaillancourt

Мати сенс. Я перетворять свою відповідь на повні інструкції.
Абхішек Патідар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.