Bir .dex dosyasındaki yöntem başvurularının sayısı 64 bin API 17'yi aşamaz


154

SugarORM Library ile bir uygulama oluşturuyorum ancak API 17 için projeyi oluşturmaya çalıştığımda (başkalarını kontrol etmedim) derleme hatası gösteriyor.

    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

Ama android v5.0 veya üstü için bu projeyi inşa ettiğimde, iyi çalışıyor. SugarORM gradle bağımlılığını kaldırırsam her iki cihaz v4.2.2 ve v5.0 için iyi çalışır.



bu bağlantıyı korumayı dene android-arsenal.com/details/1/337 , SugarORM'u proguard ile kullanmayı belirtir
Shaan_B

19
Api 23'e yükselttikten sonra bunu aldım. Android ile üretken olmak imkansız. Her sdk bir şeyleri kırar. AS'ye yapılan her güncelleme işleri bozar. Hata mesajları kullanılamıyor. AS kırık. Çöp, çöp, çöp.
RunLoop

1
@RunLoop umut kaybetme .... Ben android şimdiye kadar geliştirilen en iyi platform olduğunu bulundu .... Moch Esnek ve güçlü .... Kodlama içine ellerini kirli alacak gibi .... Güzel olacak .... Her hata mesajı faydalıdır. Ama mesajları anlamalıyız
Sandeep Singh Rana

2
@ Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.En tepedeki (ve kabul edilen) cevabı öneririm.
Jon Goodwin

Yanıtlar:


331

Çok fazla yönteminiz var. Dex için sadece 65536 yöntem olabilir .

Önerildiği gibi multidex desteğini kullanabilirsiniz .

Bu satırları şuraya eklemeniz yeterlidir module/build.gradle:

android {

    defaultConfig {
        ...

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

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

Ayrıca Manifest, MultiDexApplicationsınıfı multidex destek kitaplığından uygulama öğesine ekleyin

    <?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 androidx use android:name="androidx.multidex.MultiDexApplication" -->

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

            ...
        </application>
    </manifest>

Kendi Applicationsınıfınızı kullanıyorsanız , üst sınıfı olarak Applicationdeğiştirin MultiDexApplication.
Bunu yapamıyorsanız, Uygulama sınıfınızda attachBaseContextyöntemi şu yöntemlerle geçersiz kılın :

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

Başka bir çözüm, ProGuard ile kullanılmayan kodu kaldırmaya çalışmaktır - ProGuard'ı çalıştırmak için uygulamanızın ProGuard ayarlarını yapılandırın ve sürüm derlemeleri için büzülmeyi etkinleştirdiğinizden emin olun.


1
@Override korumalı geçersiz attachBaseContext (Context newBase) {super.attachBaseContext (newBase); MultiDex.install (bu); } ayrıca geçersiz kılma
Sandeep Singh Rana

1
Cmd-MultiDexApplication tıklatıldığında, decompiled .class dosyasının tam olarak açıkladığınız attachBaseContext () geçersiz kılma işlemini gerçekleştirdiğini görüyorum. Bu yüzden bunu yine geçersiz kılmak zorunda kalmayacağım sanırım ..
Mete

4
Ya çok fazla yöntemim yoksa. Uygulamamda çok fazla yöntem yok. Buna ulaşamayacağına inanıyorum.
Neon Warge

6
Ben sadece bu iki kısmı yaptım: "multiDexEnabled true" ve derleme 'com.android.support:multidex:1.0.0', build.grandle dosyamda. Manifest dosyamdaki hiçbir şeyi değiştirmek zorunda kalmadım, attachBaseContext, vs.'yi geçersiz kılma hakkında bahsettiğiniz diğer şeyleri yapmak zorunda kalmadım. Ancak çözümünüz benim için sorunu çözdü! Teşekkürler.
Jaime Montoya

2
@NeonWarge Muhtemelen bağımlılıklarınız yüzünden. Belki de Google Play Hizmetlerinin tamamını eklediniz? Ayrıntılar için
mr5

132

Android / app / build.gradle içinde

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

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

Bunu defaultConfig dosyanızın içine koyun:

multiDexEnabled true 

benim için çalışıyor


3
Bu sadece Lollipop veya üstü için değil mi?
Vic Torious

1
Oluşturmayı başarılı kılar, ancak uygulama başlatıldıktan sonra çöker.
Vasanth

18

Bu hata iletisini aldım çünkü proje otomatik güncellememi kodlarken dosyamdaki derleme sürümünü 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' }

Sürümü düzelterek çözün:

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'
}

2
Google Harita Nesneleri eğitimini izlemeye çalışana kadar iyi çalışan basit bir uygulama oluşturuyorum. Aniden derleyemedim. Bu çözüm bunu benim için düzeltti. Bunu nasıl yaptın?
maccaroo

4
Bu yöntem neyse ki işe yaradı çünkü yeni derleme kitaplıklarında çok fazla yöntem (65536'yı aşıyor) var ve eski kitaplıklar da yok. Bu yüzden hızlı bir düzeltme, er ya da geç kabul edilen cevap gibi multidex desteği ekleyerek düzeltmelisiniz.
Quan Nguyen

15

Benim için işe yarayan buydu:

Bu, çok fazla kullanılmayan yöntem olduğu için olur. Bu yöntemlerin çoğu build.gradle dosyasındaki kütüphanelerden gelir.

Bunu gradle ile düzeltmek ve aynı zamanda kodunuzu temizlemek için kaynakları küçült ve küçültün.

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

13

Uygulama düzeyi derlemesini değiştirin.

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

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

benim için çalıştı.


Evet, bu eski bir konudur, ancak API'nın son sürümleri için multiDexEnabledbağımlılık veya manifest dosya değişikliği olmadan sadece seçeneğe ihtiyacımız var
Hpsaturn

11

Bu hata, yalnızca az kullandığınızda tüm google play hizmetleri API'lerini yüklediğinizde de oluşabilir.

Google'ın belirttiği gibi: "Google Play hizmetlerinin 6.5'ten önceki sürümlerinde, tüm API paketlerini uygulamanızda derlemeniz gerekiyordu. Bazı durumlarda, uygulamanızdaki yöntem sayısını ( çerçeve API'ları, kitaplık yöntemleri ve kendi kodunuzu) 65,536 sınırı altına yerleştirin.

6.5 sürümünden itibaren Google Play hizmeti API'lerini uygulamanızda seçerek derleyebilirsiniz. "

Örneğin, uygulamanızın play-services-maps, play-services-location ihtiyacı olduğunda. Build.gradle dosyanıza uygulama düzeyinde aşağıdaki gibi yalnızca iki api eklemeniz gerekir:

compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'

Onun yerine:

compile 'com.google.android.gms:play-services:10.2.1'

Google Play Hizmetleri API'lerinin tam dokümantasyonu ve listesi için burayı tıklayın


9

Uygulama referanslarınız 65.536 yöntemi aştığında , uygulamanızın Android oluşturma mimarisinin sınırına ulaştığını belirten bir oluşturma hatasıyla karşılaşırsınız

Android 5.0 öncesi Multidex desteği

Android 5.0'dan önceki platform sürümleri (API düzey 21) uygulama kodunu yürütmek için Dalvik çalışma zamanını kullanır. Varsayılan olarak Dalvik, uygulamaları APK başına tek bir classes.dex bayt kodu dosyasıyla sınırlar. Bu sınırlamayı aşmak için multidex destek kitaplığını projenize ekleyebilirsiniz:

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

Android 5.0 ve üstü için Multidex desteği

Android 5.0 (API düzey 21) ve üstü, APK dosyalarından birden çok DEX dosyası yüklemeyi yerel olarak destekleyen ART adlı bir çalışma zamanı kullanır. Bu nedenle, minSdkVersion'ınız 21 veya daha yüksekse, multidex destek kitaplığına ihtiyacınız yoktur .

64K sınırından kaçının

  • ProGuard ile kullanılmayan kodu kaldır - Kod küçültmeyi etkinleştir

Uygulamada multidex'i

MinSdkVersion'ınız 21 veya daha yüksek bir değere ayarlanmışsa, modül düzeyinde build.gradle dosyanızda multiDexEnabled öğesini true olarak ayarlamak

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

minSdkVersion'ınız 20 veya daha düşük bir değere ayarlanmışsa, multidex destek kitaplığını kullanmanız gerekir

android {
defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 28
    multiDexEnabled true
   }
   ...
}

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

Application sınıfını geçersiz kılın, MultiDexApplication öğesini (mümkünse) aşağıdaki gibi genişletmek için değiştirin :

public class MyApplication extends MultiDexApplication { ... }

manifest dosyasına ekle

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="MyApplication" >
        ...
    </application>
</manifest>

8

Aynı sorunla karşı karşıyayım ve multidex desteği için, uygulamanızın minSdkVersion'unu aklınızda bulundurmanız gerekir. MinSdkVersion 21 veya üstünü kullanıyorsanız, bunun gibi multiDexEnabled true yazın

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

Benim için çalışıyor ve 21'in altında ( lolipopun altında ) minSdkVersion kullanıyorsanız iki ekstra basit şey yapmanız gerekiyor

1. Önce bu bağımlılığı ekleyin

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

build.gradle.

2. Son ve ikinci manifest içinde uygulamanıza aşağıdaki satırdan birini ekleyin

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 o zaman alt sürümde de çalışacaktır .. :) Mutlu kodlama


1

Sadece bir yan yorum, multidex için destek eklemeden önce - gereksiz bağımlılıklar eklemediğinizden emin olun.

Örneğin , resmi Facebook analitik kılavuzunda

Aşağıdaki bağımlılığı eklemeniz gerektiğini açıkça belirtiyorlar:

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

hangi aslında bütün : sadece Analytics ile değiştirmek gerekir örneğin ihtiyaç eğer öyleyse - FacebookSDK

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

Facebook kısmi SDK seçenekleri


Tamamen katılıyorum. Örneğin benim durumumda, sadece "facebook ile giriş" düğmesine ihtiyacım vardı ve tüm facebook sdk kullanıyordum. Ben değiştirdik facebook-coreve facebook-loginyanılma gitti.
cleybertandre

0

Benim için Gradle'ı Yükseltme çalışır.Android Web Sitesinde güncelleme için bak ve ardından build.gradle (Project) içine ekle

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

sonra proje ile gradle dosyası senkronize artı bazen çünkü java.exe (benim durumumda) sadece pencerelerde görev yöneticisinden java.exe öldürmek zorla olabilir sonra programı yeniden çalıştırmak


0

Bunu da deneyebilir:

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

Umarım birine yardımcı olur. Teşekkürler


0

**

Unity Oyun Geliştiricileri İçin

**

Bu hata Unity projelerinde ortaya çıktığı için buraya gelirse, Dosya-> Oluşturma Ayarları -> Oynatıcı Ayarları -> Oynatıcı'ya gidin. Yayınlama Ayarları'na gidin ve Oluştur sekmesinin altında "Özel Başlatıcı Sınıfı Şablonu" nu etkinleştirin. bu metnin altında bir yol gösterilir. yola gidin ve böyle multiDexEnabled true ekleyin:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}

-1

multidex desteği almak için Android Studio'da "Anında Çalıştır" özelliğini etkinleştirebilirsiniz.


-2

Bunu yapın, işe yarar:

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

2
Lütfen cevabınızı açıklayınız. Yalnızca kod yanıtları SO'da önerilmez. Teşekkür ederim.
Gennadii Saprykin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.