Unity Method sayısı 64K sınırını aşıyor


20

Unity'deki 64k yöntemiyle ilgili bir sorunum var, bu yüzden projemi oluşturamıyorum. Yöntem sınırlamasının 64k yöntem sayısı sınırını aştığını gösterir. Öyleyse buradaki herhangi biri bu sorunu çözmeme yardımcı olabilir mi?

Yanıtlar:


22

Bu cevap büyük ölçüde Android'in resmi belgelerine dayanmaktadır (özellikle alıntı yapılan bölümler).


Unity Projesi için Multidex Desteği nasıl kurulur

Multidex nedir:

Android uygulama (APK) dosyaları, uygulamanızı çalıştırmak için kullanılan derlenmiş kodu içeren Dalvik Yürütülebilir (DEX) dosyaları biçimindeki yürütülebilir bayt kodu dosyaları içerir. Dalvik Yürütülebilir belirtimi, Android çerçeve yöntemleri, kitaplık yöntemleri ve kendi kodunuzdaki yöntemler dahil olmak üzere tek bir DEX dosyasında başvurulabilecek toplam yöntem sayısını 65.536 ile sınırlar. Bu sınırı aşmak için uygulama oluşturma işleminizi çoklu dex yapılandırması olarak bilinen birden fazla DEX dosyası oluşturacak şekilde yapılandırmanız gerekir.

Multidex kullandığımızda:

Tek bir DEX dosyasında referans verilebilecek toplam yöntem sayısını aştığımızda, Android çerçeve yöntemleri, kitaplık yöntemleri ve kendi kodunuzdaki yöntemler dahil 65.536

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

Uygulamanızı 64K veya daha fazla yöntem referansının kullanımını etkinleştirecek şekilde yapılandırmadan önce, uygulama kodunuz veya dahil edilen kitaplıklar tarafından tanımlanan yöntemler de dahil olmak üzere uygulama kodunuz tarafından çağrılan toplam referans sayısını azaltmak için adımlar atmalısınız. Aşağıdaki stratejiler, DEX referans sınırına ulaşmamaya yardımcı olabilir:

Uygulamanızın doğrudan ve geçişli bağımlılıklarını inceleyin - Uygulamanıza eklediğiniz büyük kitaplık bağımlılığının, uygulamaya eklenen kod miktarından daha ağır bastığından emin olun. Yaygın bir anti-desen, çok sayıda yardımcı yöntem yararlı olduğu için çok büyük bir kitaplık içermektir. Uygulama kodu bağımlılıklarınızı azaltmak genellikle DEX referans sınırını önlemenize yardımcı olabilir.

ProGuard ile kullanılmayan kodu kaldır - Sürüm sürümleriniz için ProGuard'ı çalıştırmak için kod küçültmeyi etkinleştirin . Küçülmeyi etkinleştirmek, APK'larınızla kullanılmayan kod göndermemenizi sağlar.

Bu resmi ipuçlarının yanı sıra, Unity projenizi oluştururken aşağıdaki adımları izlemeniz size daha fazla yardımcı olacaktır:

  1. Unity Editor'ınızdan bir Android Projesi oluşturun. Ayar 1

  2. Android Projenizi Android Studio'ya aktarın. Adım 2

  3. Uygulama projenizi çoklu dex yapılandırması kullanacak şekilde ayarlamak için aşağıdaki değişikliği yapmanız gerekir.

    Senin minSdkVersion'ın 21 veya daha yüksek olarak ayarlanırsa, tüm ayarlanır yapmak gerekmez multiDexEnablediçin trueburada gösterildiği gibi, sizin modül düzeyi build.gradle dosyasında:

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

    Ancak, minSdkVersion20 veya daha düşük bir değere ayarlanırsa, multidex destek kitaplığını aşağıdaki gibi kullanmanız gerekir:

    3.1. Multidex'i etkinleştirmek için modül düzeyinde build.gradle dosyasını değiştirin ve burada gösterildiği gibi multidex kitaplığını bağımlılık olarak ekleyin:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    

    3.2. Application sınıfını geçersiz kılmanıza bağlı olarak aşağıdakilerden birini yapın:

    • ApplicationSınıfı geçersiz kılmazsanız, manifest dosyanızı etikette aşağıdaki gibi ayarlamak android:nameüzere düzenleyin <application>:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    
    • ApplicationSınıfı geçersiz kılarsanız, MultiDexApplication öğesini (mümkünse) aşağıdaki gibi genişletmek için değiştirin:
    public class MyApplication extends MultiDexApplication { ... }
    • Veya Application sınıfını geçersiz kılarsanız, ancak temel sınıfı değiştirmek mümkün değilse, bunun yerine attachBaseContext () yöntemini geçersiz kılabilir ve multidex'i etkinleştirmek için MultiDex.install (this) öğesini çağırabilirsiniz:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
  4. Diğer eklentilerin bildirim formunu kontrol edin ve projeyi temizleyin.

  5. Projenizde herhangi bir bağımlılık sorunu varsa, bu komutu Android Terminalinde çalıştırın

    % Gradle clean App."App name"
  6. Bu bağımlılığı Bağımlılıklar altında Uygulama Sınıfınıza kopyalayın:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    
  7. SigningConfig öğesini ana projeleriniz Gradle'a ekleyin.

    8. Adım

    Veya İmza modunu manuel olarak Hata Ayıklama moduna ayarlayın, Dosyaya Git -> Proje Yapısı -> Modüller Altında Projenize tıklayın ve Derleme Türleri altında Hata Ayıkla'yı seçin>> İmzalama Yapılandırması'nı seçin>> hata ayıklama

    resim açıklamasını buraya girin

  8. Şimdi Gradle'ınızı senkronize edin ve projeyi oluşturun.


1
Bu hataya neden olan projeniz ne kadar büyük?
Evorlor

1
Aslında, Google AdMob arabuluculuğunu kullanıyorum, çünkü bunun için 6-7 reklam SDK'sı eklemek için kullanıldım, böylece son projeler yöntem sayım 76k civarındaydı.
Rakesh

0

Doğrudan birlik üzerinden multidex özellikli oyunlar oluşturmanıza yardımcı olacak bu bağlantıdan geçmenizi tavsiye ederim.

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

Not: Bu yalnızca birlikteliğin kendisinde multidex'i etkinleştirir (ve multidex sorunlarını çözmelidir). Gradle ile ilgili sorunları düzeltmez.


3
Bu, şu anda yalnızca bağlantı içeren bir yanıttır: bağlantı soruyu yanıtlasa da yanıt yanıt vermez. Burada bağlantılı içeriğin özünü eklemek isteyebilirsiniz (se başına bağlantı kötü değil, sadece havin olduğunu sadece kötü bağlantı).
Vaillancourt

Sana katılıyorum ama yazılan adımlar çok fazla. Bu yüzden bir makale oluşturmak ve bağlantıyı paylaşmak zorunda kaldım. Bu şekilde tercih ettim, böylelikle çoklu yaratmaktan ziyade tek bir gerçek kaynağım olacak.
Abhishek Patidar

Anlamak, ancak Stack Exchange siteleri böyle çalışmaz: sadece bağlantı cevapları silinir.¤ İsterseniz, bu yanıtı sorunun bir yorumuna dönüştürebilirim: referansınızı gelecekteki kullanıcılar için görünür tutacaksınız ve kazandık Sadece bir cevap bağlantısı yok. (¤ Bağlantı sadece cevaplarla ilgili ana sorun, sitenizi kaldırırsanız (veya İSS'niz tüm verilerinizle iflas ederse), bu cevap tamamen değersiz olacaktır; bu yüzden sorunun soruyu cevaplaması gerekir.)
Vaillancourt

Mantıklı olmak. Cevabımı talimatları tamamlayacağım.
Abhishek Patidar
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.