2016-04-11 13 views
18

Bu yüzden, daha yeni sürümlerde çok iyi çalıştığında, uygulamanızı lolipop eskiden daha eski sürümlerde çalıştırmaya çalışırken 64k dex yöntemi sınırıyla neden karşılaştığımı merak ediyorum .64k limiti, eski API'lerde lolipoptan daha fazla aşıldı, ancak daha yeni değil

Eski sürümlerde çalışırken destek kitaplıkları aslında başvurulan olduğundan, bu olabilir mi?

Bu

benim gradle geçerli:

apply plugin: 'com.android.application' 

    android { 
     compileSdkVersion 23 
     buildToolsVersion '23.0.2' 
    lintOptions { 
     checkReleaseBuilds true 
     // Or, if you prefer, you can continue to check for errors in release builds, 
     // but continue the build even when errors are found: 
     abortOnError false 
    } 

    defaultConfig { 
     applicationId "com.domain.myapp" 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 27 
     versionName "1.2" 

     // Vector compat 
     vectorDrawables.useSupportLibrary = true 
    } 

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

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 
} 

dependencies { 

    compile files('libs/commons-io-2.4.jar') 
    compile files('libs/activation.jar') 
    compile files('libs/additionnal.jar') 
    compile files('libs/mail.jar') 
    compile project(':libraries:preferencefragment') 

    // Gmail API 
    compile('com.google.api-client:google-api-client-android:1.20.0') { 
     exclude group: 'org.apache.httpcomponents' 
    } 
    compile('com.google.apis:google-api-services-gmail:v1-rev29-1.20.0') { 
     exclude group: 'org.apache.httpcomponents' 
    } 

    // Play Services 
    compile 'com.google.android.gms:play-services-location:8.4.0' 
    compile 'com.google.android.gms:play-services-maps:8.4.0' 
    compile 'com.google.android.gms:play-services-ads:8.4.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile 'com.google.android.gms:play-services-identity:8.4.0' 

    // Support libraries 
    compile 'com.android.support:support-v4:23.3.0' 
    compile 'com.android.support:appcompat-v7:23.3.0' 
    compile 'com.android.support:cardview-v7:23.3.0' 
    compile 'com.android.support:design:23.3.0' 

    compile 'com.github.bumptech.glide:glide:3.6.1' 
    compile 'com.anjlab.android.iab.v3:library:1.0.20' 
    compile 'com.sothree.slidinguppanel:library:2.0.3' 
    compile 'com.commit451:PhotoView:1.2.5' 

    compile('com.github.afollestad.material-dialogs:core:[email protected]') { 
     transitive = true 
    } 
} 

DÜZENLEME:

netleştirmek için: bu olur ben mesela çalışan bir emülatör üzerinde uygulamayı çalıştırmayı denediğinizde KitKat API gradle konsoldan 19

Çökme günlükleri: Mesaj penceresinden

... 
:App:generateDebugInstantRunAppInfo 
:App:transformClassesWithDexForDebug 
AGPBI: {"kind":"error","text":"The number of method references in a .dex file cannot exceed 64K.\nLearn how to resolve this issue at https://developer.android.com/tools/building/multidex.html","sources":[{}],"original":"UNEXPECTED TOP-LEVEL EXCEPTION:\ncom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536\n\tat com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)\n\tat com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)\n\tat com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)\n\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)\n\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:188)\n\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)\n\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)\n\tat com.android.dx.command.dexer.Main.run(Main.java:277)\n\tat com.android.dx.command.dexer.Main.main(Main.java:245)\n\tat com.android.dx.command.Main.main(Main.java:106)\n","tool":"Dex"} 

FAILED 

FAILURE: Build failed with an exception. 

* What went wrong: 
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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 

BUILD FAILED 

Çökme mesajı:

: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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 
+2

Çalıştırılmakta olan dx komutlarını bulmak için grabil yapınızda bazı ayrıntılı günlük kayıtlarını yaparım. Bu, daha yeni ve daha eski apis için derlediğinizde neyin farklı olduğuna dair bir ipucu vermelidir. Şüphelendiğin gibi destek kütüphanesi olabilir - Gerçekten emin değilim. – JesusFreke

+2

Tam hata mesajını gösterebilir misiniz? Uygulamanız bir cihazda çalışıyorsa, klasik 64K yöntem sınırına ulaşmazsınız. – fadden

+0

Başka bir seçenek devam etmek ve multi-dex etkinleştirmek ve sonra hangi sınıflar dahil edildiğini görmek için 2 apks incelemek için baksmali gibi bir şey kullanmak olacaktır. Eski SDK için oluşturulmuş bazı ek destek kütüphaneleri sınıflarını görebilirsiniz. – JesusFreke

cevap

34

özel soruya cevap vermek için geçerli:

  • Bu yöntem sayım sınırlaması DEX (Dalvik Executable) dosyası üzerindedir.
  • Bu sınırlama için yaygın bir çözüm, birden çok DEX dosyasına sahip olmaktır.
  • Eski Android sürümleri, birden çok DEX dosyasını desteklememektedir.
  • Lollipop'tan başlayarak, sistem bunu doğal olarak destekler.

Bu yüzden eski aygıtlarda başarısız oluyor, ancak daha yeni aygıtlarda çalışıyor. Destek kütüphaneleri ile ilgisi yoktur.

cevabım daha faydalı içerik eklemek için:

Ama belki bazı ne bilmek isteyebilirsiniz eski cihazlarda buna bir çözüm bulmak için nasıl, ben yukarıda benim mermi noktalarında kelimeyi natively kullanılan unutmayın. Bu, eski platformların desteklenmesi için bazı çözümlerin var olduğu anlamına gelir, ancak bu geçici çözümleri uygulamanıza kodlamanız gerekir. http://developer.android.com/tools/building/multidex.html

bunun temelidir:

  • compile 'com.android.support:multidex:+'
  • tarihinde multiDex etkinleştirmek için bağımlılıkları için multidex eklemek ayrıntılı olarak

    geçici çözüm (ve hatta konu kendisi) bu Google kılavuzunda açıklanmıştır manifest içinde android-> varsayılan yapılandırması multiDexEnabled true

  • 'u yapılandırın, uygulamanızı MultidexApplicationandroid:name="android.support.multidex.MultiDexApplication"'dan uzatın veya kendi uygulamanız için Application alt sınıfına ihtiyacınız varsa, Uygulamanızın kapsamını genişletmesini sağlayın.
+4

64k yöntem hatası bir çalışma zamanı hatası değil, bir yapım süresi hatasıdır. Onun build.gradle multidex'i etkinleştirmiyor, bu yüzden eski bir sdk için inşa ederken neden çok fazla yöntem aldığını açıklamıyor, ancak daha yeni bir sdk oluştururken değil. Bahsettiğiniz gibi, bunun çözümü multi-dex'i mümkün kılmaktır, ancak bu onun sorusuyla ilgili değildir. Eski bir sdk için değil, daha yeni bir sdk oluşturmak için neden başarısız olduğunu soruyor, nasıl düzeltileceğini değil. – JesusFreke

+0

Aynı sorunu yaşıyorum. Ancak Nexus 6P (Android Nougat) ve eski cihazımı (4.0.3) hem hedef dağıtımı olarak seçersem, yapı tamam. APK, – Boy

2

@Budius ile tamamen hemfikir olun. Bildiride bir uygulama sınıfından bahsetmelisiniz. Uygulama sınıfınızın MultiDexApplication uygulamasını da uzatmasını sağlayın.

Gereken bir şey daha var. Çağrılar, MultiDexApplication sınıfınızda, ekli ve sonrası lolipop cihazlarında benim için iyi çalıştı.

+3

numaralı telefondan dağıtmayı seçtiğim cihaz başına farklı olmamalıdır. Sorusu, hatayı düzeltmekle ilgili değil, bunun neden yalnızca daha eski sdk düzeylerinde gerçekleştiğini anlamaktır. Metot limitini işleyen ve nasıl düzeltileceği ile ilgili birçok soru + cevap var. – JesusFreke

1

Eğer gradle dosyasında senin defaultConfig için multiDexEnabled = true eklemek gerekir.

İlgili konular