Como ativar o multidexing com a nova biblioteca de suporte do Android Multidex

142

Desejo usar a nova biblioteca de suporte Multidex para quebrar o limite do método para um dos meus aplicativos.

Com o Android Lollipop, o Google introduziu uma biblioteca de suporte multidex que facilita o multidex.

Quais etapas são necessárias para usar esta biblioteca e criar meu aplicativo com suporte multidex?

Janusz
fonte
multidex apoiar biblioteca de terceiros para a sua aplicação
Keshav Gera

Respostas:

293

Editar:

O Android 5.0 (nível de API 21) e superior usa ART que suporta multidexing. Portanto, se você minSdkVersiontiver 21 anos ou mais, a biblioteca de suporte multidex não será necessária.


Modifique o seu build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
}

Se você estiver executando testes de unidade, inclua isso em sua Applicationclasse:

public class YouApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

Ou apenas faça sua applicationclasse estenderMultiDexApplication

public class Application extends MultiDexApplication {

}

Para mais informações, este é um bom guia.

Chad Bingham
fonte
2
Se você estiver usando as novas ferramentas de compilação, ainda este é definitivamente o caminho a percorrer.
Janusz
1
@ jem88 Você atualizou seu gradle para 1.0 ?? Você deve estar no 2.2. + (Dê uma olhada no seu gradle-wrapper.properties) Os principais pontos: 1 sua buildToolsVersion precisa ser 21.1.1 ou superior. 2 adicione multiDexEnabled trueao seu defaultConfig do seu build.gradle (observe que não há um =) 3 adicione o'com.android.support:multidex:1.0.0'
Chad Bingham
3
E se não usarmos a classe de aplicativo? A adição android:name="android.support.multidex.MultiDexApplication"à applicationtag é AndroidManifest.xmlsuficiente?
Amigo
1
compilar 'com.android.support:multidex:1.0.1' não é necessário em 23
Naveed Ahmad 13/16
3
@NaveedAhmad, de acordo com os docs Google Developer: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy 3/03/2017
44

As etapas a seguir são necessárias para iniciar o multi dexing:

Adicione android-support-multidex.jar ao seu projeto. O jar pode ser encontrado na pasta SDK do Android / sdk / extras / android / support / multidex / library / libs

Agora você permite que a classe de aplicativos do seu aplicativo estenda o MultiDexApplication

public class MyApplication extends MultiDexApplication

ou você substitui o attachBaseContext assim:

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

Eu usei a abordagem de substituição, porque isso não interfere na hierarquia de classes da sua classe de aplicativo.

Agora, seu aplicativo está pronto para usar o multi dex. O próximo passo é convencer a Gradle a criar um apk multi dexed. A equipe de ferramentas de construção está trabalhando para facilitar isso, mas, no momento, você precisa adicionar o seguinte à parte android do build de seus aplicativos.

   dexOptions {
      preDexLibraries = false
   }

E o seguinte para a parte geral de seus aplicativos build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Mais informações podem ser encontradas no blog de Alex Lipovs .

Janusz
fonte
9
como posso usar isso sem gradle?
Lacas #
3
@ Janusz é possível usar a opção multidex sem gradle?
Devrim
1
Eu não acho que isso é possível sem gradle.
Janusz
5
O que é a correção Eclipse Ant, não gradle?
portfoliobuilder
Meu projeto dont criar o arquivo Gradle, eu criei um e seguido seus passos, mas ele não está funcionando para mim
Bado
16

SIMPLESMENTE, para ativar o multidex, você precisa ...

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}
...
}

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

você também deve alterar seu arquivo de manifesto. No seu manifesto, adicione a classe MultiDexApplication da biblioteca de suporte multidex ao elemento do aplicativo como este

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.multidex.myapplication">
   <application
       ...
       android:name="android.support.multidex.MultiDexApplication">
       ...
   </application>
</manifest>
smoothumut
fonte
1
Isso não habilitará o multi dexing. Ainda está faltando a classe do aplicativo.
Chad Bingham
1
Obrigado pelo comentário, Isso funcionou para o meu caso. Aqui está o link eu tenho referência de developer.android.com/tools/building/multidex.html
smoothumut
1
Sim, você está certo. Parece que você não precisa tê-lo em sua classe de aplicativo, a menos que esteja executando testes.
Chad Bingham
Não entendi .. Meu manifesto de aplicativo já tem uma etiqueta de nome. Eu não acho que eu vou substituí-lo por android:name="android.support.multidex.MultiDexApplication favor me guiar ..
MBoy
1
@ boy: Não, MainActivity e classe de aplicação são diferentes. Saiba mais sobre a classe de aplicativo aqui: rominirani.com/android-application-class
akshay7692
9

No seu build.gradle, adicione esta dependência:

compile 'com.android.support:multidex:1.0.1'

novamente em seu arquivo build.gradle, adicione esta linha ao bloco defaultConfig :

multiDexEnabled true

Em vez de estender sua classe de aplicativo de Application, estenda-a de MultiDexApplication ; gostar :

public class AppConfig extends MultiDexApplication {

agora você está pronto para ir! E, caso você precise, tudo o que MultiDexApplicationfaz é

public class MultiDexApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
MohammadReza
fonte
6

build.gradle

multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Isaak Osipovich Dunayevsky
fonte
3

Etapa 1: Alterar build.grade

defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
}

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

Etapa 2: configuração na classe Application

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }
}

Etapa 3: Alterar grade.properties

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Vai funcionar!. Obrigado.

sonnv1368
fonte
Estou recebendo "Não foi possível encontrar o símbolo do MultiDex". Alguém já enfrentou esse problema antes?
Aung Myint Thein
2

Aqui está uma abordagem atualizada a partir de maio de 2020, com o Android X.

Para minSdk> = 21

Você não precisa fazer nada. Todos esses dispositivos usam a VM Android RunTime (ART), que suporta multidex nativamente.

Para minSdk<21

No nível do módulobuild.gradle , verifique se as seguintes configurações estão preenchidas:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

Em seguida, você src/main/AndroidManifest.xmlprecisa declarar MultiDexApplicationcomo application:name:

<manifest package="com.your.package"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="androidx.multidex.MultiDexApplication" />
</manifest>
Jameson
fonte
1

Adicione ao AndroidManifest.xml:

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

OU

MultiDex.install(this);

no método attachBaseContext do seu aplicativo personalizado

ou seu aplicativo personalizado estende o MultiDexApplication

adicione multiDexEnabled = true no seu build.gradle

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}
Malik Abu Qaoud
fonte
@Harsha não é recomendado usar isso, mas tente adicionar largeHeap ao seu arquivo de manifesto <Aplicativo para Android: largeHeap = "true"> </ application>
Malik Abu Qaoud
android: largeHeap = "true" android: allowBackup = "true" são adicionados os dois
Harsha
adicione isso ao arquivo gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud
1

Primeiro você deve tentar com o Proguard (isso limpa todo o código não utilizado)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
Moises Apaza Q
fonte
0

Se você deseja ativar o multi-dex em seu projeto, basta ir para gradle.builder

e adicione isso na sua dependência

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

então você tem que adicionar

 defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...

// Enabling multidex support.
multiDexEnabled true}

Em seguida, abra uma classe e estenda-a para Application. Se o seu aplicativo usa estende a classe Application, você pode substituir o método oncrete () e chamar

   MultiDex.install(this) 

para ativar o multidex.

e finalmente adicione ao seu manifesto

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
   ...
     android:name="android.support.multidex.MultiDexApplication">
   ...
   </application>
 </manifest> 
pavel
fonte
1
O que é gradle.builder?
Chad Bingham
seu arquivo Gradle, que está localizado em seu projeto estúdio Android
Pavel
0

Todas as respostas acima são impressionantes

Adicione isso também, caso contrário, seu aplicativo falhará como o meu sem qualquer motivo

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Abhishek Mathur
fonte
0

Com o androidx, as bibliotecas de suporte clássicas não funcionam mais.

A solução simples é usar o seguinte código

No seu build.gradlearquivo

android{
  ...
  ...
  defaultConfig {
     ...
     ...
     multiDexEnabled true
  }
  ...
}

dependencies {
  ...
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}

E no seu manifesto, basta adicionar o atributo name à tag do aplicativo

<manifest ...>
    <application
        android:name="androidx.multidex.MultiDexApplication"
     ...
     ...>
         ...
         ...
    </application>
</manifest>

Se seu aplicativo está direcionado à API 21 ou superior, o multidex está ativado por padrão.

Agora, se você quiser se livrar de muitos dos problemas que enfrenta ao tentar suportar o multidex - primeiro tente usar o encolhimento de código, definindo minifyEnabled true.

mayank1513
fonte
-2

apenas adicionando isso cortado no build.gradle também funciona bem

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

     defaultConfig {
         minSdkVersion 14 //lower than 14 doesn't support multidex
         targetSdkVersion 22

         **// Enabling multidex support.
         **multiDexEnabled true****
     }
}
Chirag Thummar
fonte
-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
lat_long
fonte