android - support - multidexenabled gradle




O número de referências de método em um arquivo.dex não pode exceder 64k API 17 (9)

Apenas um comentário lateral, Antes de adicionar suporte para multidex - verifique se você não está adicionando dependências desnecessárias.

Por exemplo, no guia oficial de análise do Facebook

Eles afirmam claramente que você deve adicionar a seguinte dependência:

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

que é na verdade todo o FacebookSDK - então se você precisar, por exemplo, apenas do Analytics, você precisa substituí-lo por:

implementation 'com.facebook.android:facebook-core:5.+'

Opções parciais de SDK do Facebook

Eu estou construindo um aplicativo com SugarORM Library, mas quando eu tento construir o projeto para a API 17 (não verificar para os outros), ele mostra o erro de compilação.

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

Mas quando eu construo este projeto para o Android v5.0 ou acima, funciona bem. Se eu remover a dependência gradle do SugarORM, ela funcionará bem para os dois dispositivos v4.2.2 e v5.0.


Em android / app / build.gradle

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

Coloque isso dentro do seu defaultConfig:

multiDexEnabled true 

funciona para mim


Eu recebi essa mensagem de erro porque enquanto codificava minha versão de compilação de atualização automática do projeto no meu arquivo build.gradle :

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

Resolva corrigindo a versão:

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

Eu tenho enfrentado o mesmo problema e para suporte multidex, você deve ter em mente o minSdkVersion de sua aplicação. Se você estiver usando o minSdkVersion 21 ou acima, apenas escreva multiDexEnabled true assim

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

Isso funciona para mim e se você estiver usando minSdkVersion abaixo de 21 (abaixo de lolipop ), então você tem que fazer duas coisas extras simples

1. Primeiro adicione esta dependência

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

em seu build.gradle.

2. Última e segunda adicionar uma linha abaixo à sua inscrição no manifesto

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Bingo, então ele vai funcionar na versão inferior também .. :) Feliz codificação


Isto é o que funcionou para mim:

Isso acontece porque há muitos métodos não utilizados. A maioria desses métodos vem de bibliotecas incluídas em seu build.gradle

Use minify e shrink resources para corrigir isso com gradle e limpar seu código ao mesmo tempo.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }

Para mim Atualizando os trabalhos do Gradle. Procure por atualizações no site do Android e adicione-as em seu build.gradle (Project) como este

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

em seguida, sincronizar o projeto com o arquivo gradle mais isso pode acontecer por vezes, por causa de java.exe (no meu caso) apenas forçar matar java.exe do gerenciador de tarefas no Windows, em seguida, voltar a executar o programa


Também pode tentar isto:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

Espero que ajude alguém. obrigado


Você tem muitos métodos. Só pode haver 65536 métodos para dex .

Como sugerido, você pode usar o suporte multidex .

Apenas adicione estas linhas no build.gradle :

android {

    defaultConfig {
        ...

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

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

Além disso, no seu Manifest adicione a classe MultiDexApplication da biblioteca de suporte multidex ao elemento do aplicativo.

    <?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">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
            android:name=".YourCustomApplicationClass">

            ...
        </application>
    </manifest>

sobrescreve o método attachBaseContext

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

Se você estiver usando sua própria classe Application , altere a classe pai de Application para MultiDexApplication .

Outra solução é tentar remover o código não utilizado com o ProGuard - Defina as configurações do ProGuard para que seu aplicativo execute o ProGuard e garanta que você tenha encolhido habilitado para versões de lançamento.


Suporte Multidex antes do Android 5.0

Versões da plataforma anteriores ao Android 5.0 (API level 21) usam o runtime Dalvik para executar o código do aplicativo. Por padrão, o Dalvik limita os aplicativos a um único arquivo bytecode classes.dex por APK. Para contornar essa limitação, leia seu aplicativo para configurar multidex

Suporte Multidex para Android 5.0 e superior

O Android 5.0 (API level 21) e superior usa um tempo de execução chamado ART que suporta nativamente o carregamento de vários arquivos DEX de arquivos APK. O ART executa a pré-compilação no momento da instalação do aplicativo, que verifica os arquivos classesN.dex e os compila em um único arquivo .oat para execução pelo dispositivo Android. Portanto, se sua minSdkVersion for 21 ou superior, você não precisará da biblioteca de suporte multidex. Tudo o que você precisa fazer é definir multiDexEnabled como true em seu build.gradle de nível de módulo

Leia mais aqui - https://developer.android.com/studio/build/multidex





sugarorm