Hitungan Metode Unity melebihi batas 64K


20

Saya baru saja mendapat masalah terkait metode 64k di Unity jadi itu sebabnya saya tidak dapat membangun proyek saya. Ini menunjukkan batasan metode melebihi batas hitungan metode 64k. Jadi, adakah yang bisa membantu saya menyelesaikan masalah ini di sini?

Jawaban:


22

Jawaban ini sangat bergantung pada dokumentasi resmi Android (bagian yang dikutip, khususnya).


Cara mengatur Dukungan Multidex untuk Proyek Persatuan

Apa itu Multidex:

File aplikasi Android (APK) berisi file bytecode yang dapat dieksekusi dalam bentuk file Dalvik Executable (DEX), yang berisi kode yang dikompilasi yang digunakan untuk menjalankan aplikasi Anda. Spesifikasi Dalvik Executable membatasi jumlah metode yang dapat dirujuk dalam satu file DEX menjadi 65.536, termasuk metode kerangka kerja Android, metode pustaka, dan metode dalam kode Anda sendiri. Untuk melewati batas ini, Anda harus mengkonfigurasi proses pembuatan aplikasi untuk menghasilkan lebih dari satu file DEX, yang dikenal sebagai konfigurasi multi dex.

Ketika kami menggunakan Multidex:

Ketika kami melebihi jumlah total metode yang dapat direferensikan dalam satu file DEX menjadi 65.536 - termasuk metode kerangka kerja Android, metode pustaka, dan metode dalam kode Anda sendiri.

Hindari batas 64K

Sebelum mengonfigurasi aplikasi Anda untuk memungkinkan penggunaan 64K atau lebih banyak referensi metode, Anda harus mengambil langkah-langkah untuk mengurangi jumlah total referensi yang dipanggil oleh kode aplikasi Anda, termasuk metode yang ditentukan oleh kode aplikasi Anda atau perpustakaan yang disertakan. Strategi berikut dapat membantu Anda menghindari batasan referensi DEX:

Tinjau dependensi langsung dan transitif aplikasi Anda - Pastikan setiap ketergantungan perpustakaan besar yang Anda sertakan dalam aplikasi Anda digunakan dengan cara yang melebihi jumlah kode yang ditambahkan ke aplikasi. Anti-pola umum adalah memasukkan perpustakaan yang sangat besar karena beberapa metode utilitas bermanfaat. Mengurangi ketergantungan kode aplikasi Anda seringkali dapat membantu Anda menghindari batas referensi DEX.

Hapus kode yang tidak digunakan dengan ProGuard - Aktifkan penyusutan kode untuk menjalankan ProGuard untuk versi rilis Anda. Mengaktifkan penyusutan memastikan Anda tidak mengirimkan kode yang tidak digunakan dengan APK Anda.

Selain dari tips resmi ini, ketika membangun proyek Unity Anda, mengikuti langkah-langkah ini akan membantu Anda lebih lanjut:

  1. Bangun Proyek Android dari Editor Persatuan Anda. Setp 1

  2. Impor Proyek Android Anda di Android Studio. Langkah 2

  3. Menyiapkan proyek aplikasi Anda untuk menggunakan konfigurasi multi dex mengharuskan Anda membuat modifikasi berikut.

    Jika minSdkVersion Anda diatur ke 21 atau lebih tinggi, semua yang perlu Anda lakukan diatur multiDexEnabledke truedalam file build.gradle tingkat modul Anda, seperti yang ditunjukkan di sini:

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

    Namun, jika Anda minSdkVersiondiatur ke 20 atau lebih rendah, maka Anda harus menggunakan pustaka dukungan multidex sebagai berikut:

    3.1. Ubah file build.gradle tingkat modul untuk mengaktifkan multidex dan tambahkan pustaka multidex sebagai ketergantungan, seperti yang ditunjukkan di sini:

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

    3.2. Bergantung pada apakah Anda menimpa kelas Aplikasi, lakukan salah satu dari yang berikut:

    • Jika Anda tidak menimpa Applicationkelas, mengedit file manifest Anda untuk set android:namedi <application>tag sebagai berikut:
    <?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>
    
    • Jika Anda mengganti Applicationkelas, ubah untuk memperluas MultiDexApplication (jika mungkin) sebagai berikut:
    public class MyApplication extends MultiDexApplication { ... }
    • Atau jika Anda mengganti kelas Aplikasi tetapi tidak mungkin untuk mengubah kelas dasar, maka Anda dapat mengganti metode attachBaseContext () dan memanggil MultiDex.install (ini) untuk mengaktifkan multidex:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    
  4. Periksa kesalahan dari manifes plugins lainnya dan bersihkan project. Dan sysc lagi.

  5. Jika ada masalah ketergantungan pada proyek Anda, jalankan perintah ini di Terminal Android

    % Gradle clean App."App name"
  6. Salin dependensi ini di Tingkat Aplikasi Anda, di bawah dependensi:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
    
  7. Tambahkan SignConfig penandatanganan di proyek utama Anda Gradle.

    Langkah 8

    Atau atur mode Penandatanganan ke mode Debug secara manual, Buka File -> Struktur Proyek -> Di Bawah Modul Klik proyek Anda dan di bawah Tipe Build pilih Debug -> pilih Signing Config-> debug

    masukkan deskripsi gambar di sini

  8. Sekarang sinkronkan Gradle Anda dan bangun proyek.


1
Seberapa besar proyek Anda yang menyebabkan kesalahan ini?
Evorlor

1
Sebenarnya, saya menggunakan mediasi Google AdMob sehingga untuk yang digunakan untuk menambahkan 6-7 iklan SDK sehingga metode proyek akhir saya adalah sekitar 76rb.
Rakesh

0

Saya akan merekomendasikan Anda untuk pergi melalui tautan ini yang akan membantu Anda untuk membuat game-game dengan multidex langsung melalui kesatuan.

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

Catatan: Ini hanya akan mengaktifkan multidex dalam kesatuan itu sendiri (dan harus memperbaiki masalah multidex). Itu tidak akan memperbaiki masalah terkait tingkat.


3
Ini saat ini merupakan jawaban tautan saja: meskipun tautan menjawab pertanyaan, jawabannya tidak. Anda mungkin ingin memasukkan inti dari konten yang tertaut di sini (tautan itu sendiri tidak buruk, hanya memiliki tautan yang buruk saja).
Vaillancourt

Saya setuju dengan Anda tetapi langkah-langkah yang ditulis terlalu banyak. Itu sebabnya saya harus membuat artikel dan membagikan tautannya. Saya lebih suka cara itu sehingga saya hanya akan memiliki satu sumber kebenaran daripada menciptakan banyak sumber.
Abhishek Patidar

Di mengerti tapi bukan itu cara kerja situs Stack Exchange: jawaban tautan saja bisa dihapus.¤ Jika Anda mau, saya bisa mengonversi jawaban ini ke komentar pertanyaan: Anda akan membuat referensi Anda tetap terlihat untuk pengguna di masa depan, dan kami menang tidak memiliki jawaban hanya tautan. (Issue Masalah utama dengan jawaban hanya tautan adalah bahwa jika Anda menurunkan situs Anda (atau ISP Anda bangkrut dengan semua data Anda), jawaban ini akan sama sekali tidak berharga; inilah mengapa jawabannya harus menjawab pertanyaan.)
Vaillancourt

Masuk akal. Saya akan mengubah jawaban saya menjadi instruksi lengkap.
Abhishek Patidar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.