Как избежать DEX 64K LIMIT, импортируя нужную библиотеку

У меня была эта проблема, когда я переполнял ограничение метода 64 КБ в Dalvik при компиляции всей библиотеки, которую я использовал. У меня возникла эта проблема, когда я импортировал библиотеку поддержки, так как некоторые из них уже содержатся в других, в результате переполнение лимита.

Есть ли способ проверить, не используется ли библиотека в текущем проекте или уже импортирована через другие зависимости библиотеки?

В настоящее время я исключаю тех, кого знаю наверняка, но кажется странным, что приходится делать это вручную.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:multidex:1.0.1'
    compile "com.android.support:percent:${supportLibVersion}"
    compile("com.android.support:design:${supportLibVersion}") {
        exclude module: 'support-v4'
    }
    compile("com.android.support:cardview-v7:${supportLibVersion}") {
        exclude module: 'support-v4'
    }

    compile('com.github.nkzawa:socket.io-client:0.4.1') {
        exclude group: 'org.json', module: 'json'
    }
    compile('com.astuetz:pagerslidingtabstrip:1.0.1') {
        exclude module: 'support-v4'
    }
//...
}

Решения на данный момент:

  1. Используйте плагин Gradle. Некоторое время назад мы написали чрезвычайно простой в использовании плагин Gradle, который перечисляет количество методов по пакетам вместе с общим количеством. Вы можете найти больше информации об этом здесь.
  2. www.methodscount.com - Хотите знать, сколько методов конкретная библиотека добавит в ваше приложение? Просто введите оператор 'compile' на этом веб-сайте, и он скажет вам, что это число методов, зависимости, размер JAR и размер DEX.
  3. Плагин Android Studio - Этот отличный плагин показывает количество методов каждой зависимости прямо в Android Studio.
  4. Использование библиотеки поддержки MultiDex Если вы используете Android Studio, процесс очень прост. Если нет, я настоятельно рекомендую выполнить миграцию, поскольку Google может вскоре отказаться от поддержки плагина Eclipse ADT и старой системы сборки на основе Ant.

Шаг 1

Добавьте зависимость для библиотеки поддержки MultiDex в ваш build.gradle

dependencies { 
... 
   compile 'com.android.support:multidex:' 
   ... 
}

Шаг 2

Включите мультидексинг, установив флаг multiDexEnabled в разделе buildType или productFlavor вашей конфигурации gradle.

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

Теперь в зависимости от вашего проекта у вас есть 3 варианта:

Если вы не создали свой собственный класс Application, просто объявите android.support.multidex.MultiDexApplication как класс вашего приложения в AndroidManifest.xml

   .... 
   android:name="android.support.multidex.MultiDexApplication" 
   ... 

Если у вас уже есть собственный класс Application, сделайте его расширенным android.support.multidex.MultiDexApplication вместо android.app.Application

Если ваш класс Application расширяет какой-то другой класс, и вы не хотите или не можете его изменить, переопределите метод attachBaseContext(), как показано ниже:

public class MyApplication extends FooApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 
}

6 ответов

Решение

Вы можете открыть терминал и запустить команду gradlew app: зависимости, чтобы проверить, какие зависимости уже включены в другие как транзитивные зависимости для вашего проекта вместе с соответствующими версиями каждого.

Например, я получил следующую диаграмму зависимостей для одного из моих проектов для библиотеки com.android.support:design, которую я использовал:

+--- com.android.support:design:23.3.0
|    +--- com.android.support:appcompat-v7:23.3.0
|    |    +--- com.android.support:support-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-v4:23.3.0
|    |    |         \--- com.android.support:support-annotations:23.3.0
|    |    +--- com.android.support:animated-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-vector-drawable:23.3.0 (*)
|    |    \--- com.android.support:support-v4:23.3.0 (*)
|    +--- com.android.support:support-v4:23.3.0 (*)
|    \--- com.android.support:recyclerview-v7:23.3.0
|         +--- com.android.support:support-v4:23.3.0 (*)
|         \--- com.android.support:support-annotations:23.3.0

Эй, ты можешь попробовать мой трюк, это может быть полезно для тебя

  1. Прежде всего вы должны избегать внешних библиотек. Как в том, что библиотеки имеют те же зависимости. Итак, попробуйте объединить эту библиотеку с кодом приложения для Android. Благодаря этому сэкономить много места для методов.

  2. Используйте полезные зависимости и библиотеки, например, если вы хотите, чтобы сервисы Google Play включали только полезные сервисы, а не все.

    compile "com.google.android.gms:play-services-location:9.4.0"
    compile "com.google.android.gms:play-services-maps:9.4.0" 
    

Избегайте этого

compile 'com.google.android.gms:play-services:9.4.0'
  1. Удалите нежелательные зависимости. Используйте в своем коде очень выбираемые зависимости.

  2. Если все работает не очень хорошо, используйте multidex в вашем коде. Но он создает несколько файлов dex. Итак, ваш код займет много времени для компиляции.

Спасибо, надеюсь, это поможет вам.

 defaultConfig
 {    
     multiDexEnabled true 
 }

 dependencies {
     compile 'com.android.support:multidex:1.0.0'
 }

а также добавить этот метод в свой класс приложения

@Override
protected void attachBaseContext(Context newBase) {

    super.attachBaseContext(newBase);

    MultiDex.install(this);
}

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

  1. Использовать плагин Gradle - Это очень простой в использовании плагин Gradle, который перечисляет количество методов по пакетам вместе с общим количеством. Вы можете найти больше информации об этом здесь.
  2. http://www.methodscount.com/ - Просто введите ‘compile’ заявление на этом сайте, и он скажет вам, что это количество методов, зависимости, размер JAR и размер DEX.
  3. Плагин Android Studio - Этот отличный плагин показывает количество методов каждой зависимости прямо в Android Studio.

Независимо от того, каким инструментом вы в конечном итоге пользуетесь, используйте информацию, которую он предоставляет, для проведения аудита зависимостей вашего приложения. Вы должны искать неиспользуемые библиотеки или библиотеки, которые можно свернуть или даже заменить на ваше собственное более простое решение. Если вы не используете Proguard чтобы удалить неиспользуемый код, сначала включите его и посмотрите, решит ли он проблему (отметьте это). С помощью Proguard это хорошо... не весело, но как только вы сделаете все правильно, это значительно сократит количество методов. Если ничего не помогает, вам придется использовать библиотеку поддержки MultiDex.

Проверьте задание на удаление ненужных пакетов в библиотеке Google Play Services.

Заключение

В то время как Multidex Support Library устраняет проблему DEX 64K в большинстве случаев, ее следует рассматривать как последнее средство. Прежде чем пытаться использовать его, вы должны проверить ваш проект на наличие нежелательных зависимостей и удалить как можно больше неиспользуемого кода, используя ProGuard, Если вы все же используете его, обязательно протестируйте свое приложение на старых устройствах.

Надеюсь, что это поможет вам.

Нажмите на файл, затем нажмите на структуру проекта. Нажмите на приложение в левой нижней части всплывающего окна. Вы увидите несколько вкладок, нажмите на вкладку " Зависимости", затем нажмите "Вкл.", А в правом верхнем углу выберите " Библиотечная зависимость".

есть ли в 2022 году новый способ легко подсчитывать методы/управлять правилами proguard?

Плагин Gradle dexinfo ==> Никаких изменений с 2016 года

Плагин Android Studio ==> Никаких изменений с 2016 года

www.methodscount.com ==> Offline: возвращает веб-страницу с э, допустим, там нет ничего о разработке [Запрещено до -18]

Другие вопросы по тегам