Количество Метода Единства превышает предел 64 КБ


20

У меня только что возникла проблема, связанная с методом 64k в Unity, поэтому я не могу построить свой проект. Это показывает, что ограничение метода превышает предел числа методов 64 КБ. Так может ли кто-нибудь здесь помочь мне решить эту проблему?

Ответы:


22

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


Как настроить поддержку Multidex для Unity Project

Что такое Multidex:

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

Когда мы используем Multidex:

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

Избегайте ограничения в 64К

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

Просмотрите прямые и транзитивные зависимости вашего приложения. Убедитесь, что любая большая зависимость от библиотеки, которую вы включаете в свое приложение, используется таким образом, что перевешивает объем кода, добавляемого в приложение. Распространенным анти-паттерном является включение очень большой библиотеки, потому что несколько полезных методов были полезны. Уменьшение зависимостей кода вашего приложения часто помогает вам избежать ограничения ссылок DEX.

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

Помимо этих официальных советов, при создании проекта Unity, следующие шаги помогут вам в дальнейшем:

  1. Создайте проект Android из вашего редактора Unity. Сетп 1

  2. Импортируйте свой проект Android в Android Studio. Шаг 2

  3. Настройка проекта приложения для использования конфигурации multi dex требует внесения следующих изменений.

    Если minSdkVersion установлен на 21 или выше, все , что вам нужно сделать , это установить , multiDexEnabledчтобы trueв файле build.gradle уровня модуля, как показано здесь:

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

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

    3.1. Измените файл build.gradle уровня модуля, чтобы включить multidex и добавить библиотеку multidex в качестве зависимости, как показано здесь:

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

    3.2. В зависимости от того, переопределите ли вы класс Application, выполните одно из следующих действий:

    • Если вы не переопределяете 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 (this), чтобы включить multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. Проверьте ошибку в форме других плагинов и очистите проект. И снова запустите sysc.

  5. Если в вашем проекте есть проблемы с зависимостями, запустите эту команду в Android Terminal

    % Gradle clean App."App name"
  6. Скопируйте эти зависимости в Application Gradle, под зависимостями:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. Добавьте signatureConfig в свои основные проекты Gradle.

    Шаг 8

    Или вручную установите режим подписи в режим отладки, выберите «Файл» -> «Структура проекта» -> «Под модулями». Нажмите на свой проект, а в разделе «Типы сборки» выберите «Отладка» -> выберите «Настройка подписи» -> «Отладка».

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

  8. Теперь синхронизируйте ваш Gradle и постройте проект.


1
Насколько велик ваш проект, который привел к этой ошибке?
Evorlor

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

0

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

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

Примечание. При этом включается только мультидекс в единстве (и это должно устранять проблемы мультидекса). Это не решит проблемы, связанные с gradle.


3
В настоящее время это ответ только для ссылки: хотя ссылка отвечает на вопрос, ответа нет. Вы можете включить ядро связанного содержания здесь (ссылка сама по себе не плохо, это просто Хавин только ссылка , которая плохо).
Vaillancourt

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

Понятно, но это не так, как работают сайты Stack Exchange: удаляются ответы только по ссылкам. Если вы хотите, я могу преобразовать этот ответ в комментарий к вопросу: вы оставите вашу ссылку видимой для будущих пользователей, и мы выиграли Нет ответа только по ссылке. (Main Основная проблема с ответами только по ссылке заключается в том, что если вы отключите свой сайт (или ваш провайдер обанкротится со всеми вашими данными), этот ответ будет совершенно бесполезным; именно поэтому ответ должен ответить на вопрос.)
Vaillancourt

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