Skip to content

Most visited

Recently visited

navigation

Mengonfigurasi Aplikasi dengan Lebih dari Metode 64K

Saat platform Android terus bertumbuh, begitu juga ukuran aplikasi Android. Bila aplikasi dan pustaka yang direferensikan mencapai ukuran tertentu, Anda akan mengalami kesalahan versi yang menunjukkan bahwa aplikasi telah mencapai batas arsitektur pembangunan aplikasi Android. Versi lama dari sistem pembangunan melaporkan kesalahan ini sebagai berikut:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

Versi lebih baru dari sistem pembangunan Android yang lebih baru menampilkan kesalahan yang berbeda, yang mengindikasikan masalah yang sama:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

Kedua kondisi kesalahan ini menampilkan angka yang sama: 65.536. Angka ini cukup signifikan karena menyatakan jumlah total referensi yang bisa dipanggil kode dalam file bytecode Dalvik Executable (DEX) tunggal. Laman ini menjelaskan cara melewati batasan ini dengan mengaktifkan konfigurasi aplikasi yang dikenal dengan multidex, yang memungkinkan aplikasi Anda membangun dan membaca beberapa file DEX sekaligus.

Tentang batas referensi 64K

File aplikasi Android (APK) berisi file bytecode yang bisa dieksekusi dalam bentuk file Dalvik Executable (DEX), berisi kode kompilasi yang digunakan untuk menjalankan aplikasi Anda. Spesifikasi Dalvik Executable membatasi jumlah total metode yang bisa dirujuk dalam file DEX tunggal sebesar 65.536—termasuk metode kerangka kerja Android, metode pustaka, dan metode dalam kode Anda. Dalam konteks ilmu komputer, istilah Kilo, K, berarti 1024 (atau 2^10). Karena 65.536 sama dengan 64 X 1024, batas ini disebut sebagai 'batas referensi 64K'.

Dukungan multidex sebelum Android 5.0

Versi dari platform sebelum Android 5.0 (API level 21) menggunakan waktu proses Dalvik untuk mengeksekusi kode aplikasi. Secara default, Dalvik membatasi aplikasi ke file bytecode classes.dex tunggal per APK. Untuk menyiasati batasan ini, Anda bisa menggunakan pustaka dukungan multidex, yang menjadi bagian dari file DEX primer dari aplikasi dan kemudian mengelola akses ke file DEX tambahan dan kode yang dimuatnya.

Catatan: Jika proyek Anda dikonfigurasi untuk multidex dengan minSdkVersion 20 atau yang lebih rendah, dan Anda menerapkannya ke perangkat target yang menjalankan Android 4.4 (API level 20) atau yang lebih rendah, Android Studio akan menonaktifkan Instant Run.

Dukungan multidex untuk Android 5.0 dan yang lebih tinggi

Android 5.0 (API level 21) dan yang lebih tinggi menggunakan waktu proses yang disebut ART, yang secara bawaan mendukung pemuatan beberapa file DEX dari file APK. ART melakukan pra-kompilasi pada waktu pemasangan aplikasi, memindai file classesN.dex dan mengompilasinya ke dalam sebuah file .oat tunggal untuk dieksekusi oleh perangkat Android. Karena itu, jika minSdkVersion adalah 21 atau lebih tinggi, Anda tidak memerlukan pustaka dukungan multidex.

Untuk informasi selengkapnya mengenai waktu proses Android 5.0, bacalah ART dan Dalvik.

Catatan: Saat menggunakan Instant Run, Android Studio secara otomatis mengonfigurasi aplikasi untuk multidex bila minSdkVersion aplikasi Anda disetel ke 21 atau yang lebih tinggi. Karena Instant Run hanya bekerja dengan versi debug aplikasi, Anda masih harus mengonfigurasi versi rilis bagi multidex untuk menghindari batas 64K.

Menghindari batas 64K

Sebelum mengonfigurasi aplikasi untuk mengaktifkan penggunaan referensi metode 64K atau lebih, Anda harus mengambil langkah-langkah untuk mengurangi jumlah referensi yang dipanggil oleh kode aplikasi, termasuk metode yang didefinisikan oleh kode aplikasi atau pustaka yang dimasukkan. Strategi berikut bisa membantu Anda agar terhindar dari mencapai batas referensi DEX:

Penggunaan teknik-teknik ini dapat membantu Anda menghindari keharusan mengaktifkan multidex di aplikasi sekaligus juga mengurangi ukuran keseluruhan APK.

Mengonfigurasi aplikasi Anda untuk multidex

Persiapan proyek aplikasi untuk menggunakan konfigurasi multidex mengharuskan modifikasi berikut pada proyek aplikasi, bergantung pada versi minimum Android yang didukung aplikasi Anda.

Jika minSdkVersion disetel ke 21 atau yang lebih tinggi, Anda tinggal menyetel multiDexEnabled ke true dalam file build.gradle tingkat modul, seperti yang ditampilkan di sini:

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

Akan tetapi, jika minSdkVersion disetel ke 20 atau yang lebih rendah, maka Anda harus menggunakan pustaka dukungan multidex seperti berikut:

Kini bila Anda membangun aplikasi, alat pembangunan Android akan membangun file DEX primer (classes.dex) dan file DEX pendukung (classes2.dex, classes3.dex, dan seterusnya) bila dibutuhkan. Sistem pembangunan kemudian akan memaketkan semua file DEX ke dalam APK.

Pada waktu proses, API multidex menggunakan pemuat kelas khusus untuk menelusuri semua file DEX yang tersedia bagi metode Anda (bukan hanya menelusuri di file classes.dex utama).

Batasan pustaka dukungan multidex

Pustaka dukungan multidex memiliki beberapa keterbatasan yang harus Anda sadari dan uji ketika Anda memasukkannya ke konfigurasi pembangunan aplikasi:

Mendeklarasikan kelas yang diperlukan dalam file DEX primer

Saat membangun setiap file DEX untuk aplikasi multidex, alat pembangunan akan melakukan pengambilan keputusan yang kompleks guna menentukan kelas mana yang dibutuhkan dalam file DEX primer sehingga aplikasi Anda bisa berhasil berjalan. Jika kelas yang diperlukan selama startup tidak disediakan dalam file DEX primer, maka aplikasi Anda akan mogok dengan kesalahan java.lang.NoClassDefFoundError.

Ini tidak akan terjadi untuk kode yang diakses secara langsung dari kode aplikasi karena alat pembangunan mengenali jalur kode tersebut, namun ini bisa terjadi bila jalur kode kurang jelas, misalnya ketika pustaka yang Anda gunakan memiliki dependensi yang kompleks. Misalnya, jika kode tersebut menggunakan introspeksi atau pemanggilan metode Java dari kode asli, maka kelas-kelas itu mungkin tidak akan dikenali sebagaimana diperlukan dalam file DEX primer.

Jadi jika Anda menerima java.lang.NoClassDefFoundError, Anda harus secara manual menetapkan kelas tambahan ini sebagaimana yang diperlukan dalam file DEX primer dengan mendeklarasikannya bersama properti multiDexKeepFile atau multiDexKeepProguard dalam tipe versi. Jika sebuah kelas cocok dalam file multiDexKeepFile atau multiDexKeepProguard, maka kelas itu akan ditambahkan ke file DEX primer.

Properti multiDexKeepFile

File yang Anda tetapkan dalam multiDexKeepFile harus berisi satu kelas per baris, dalam format com/example/MyClass.class. Misalnya, Anda bisa membuat file bernama multidex-config.txt yang terlihat seperti ini:

com/example/MyClass.class
com/example/MyOtherClass.class

Selanjutnya Anda bisa mendeklarasikan file itu untuk tipe versi seperti berikut:

android {
    buildTypes {
        release {
            multiDexKeepFile file 'multidex-config.txt'
            ...
        }
    }
}

Ingat, Gradle membaca jalur secara relatif terhadap file build.gradle, jadi contoh di atas akan berfungsi jika multidex-config.txt berada dalam direktori yang sama dengan file build.gradle.

Properti multiDexKeepProguard

File multiDexKeepProguard menggunakan format yang sama dengan Proguard dan mendukung seluruh gramatika Proguard. Untuk informasi selengkapnya tentang format dan gramatika Proguard, lihat bagian Keep Options di panduan Proguard.

File yang Anda tetapkan dalam multiDexKeepProguard harus berisi opsi -keep dalam sintaks ProGuard yang valid. Misalnya, -keep com.example.MyClass.class. Anda bisa membuat file bernama multidex-config.pro yang terlihat seperti ini:

-keep class com.example.MyClass
-keep class com.example.MyClassToo

Jika Anda ingin menetapkan semua kelas dalam satu paket, file tersebut akan terlihat seperti ini:

-keep class com.example.** { *; } // All classes in the com.example package

Selanjutnya Anda bisa mendeklarasikan file itu untuk tipe versi seperti berikut:

android {
    buildTypes {
        release {
            multiDexKeepProguard 'multidex-config.pro'
            ...
        }
    }
}

Mengoptimalkan multidex dalam versi development

Konfigurasi multidex memerlukan lebih banyak waktu proses pembangunan secara signifikan karena sistem pembangunan harus membuat keputusan kompleks tentang kelas yang harus dimasukkan dalam file DEX primer dan kelas yang bisa dimasukkan dalam file DEX sekunder. Ini berarti pembangunan bertahap yang menggunakan multidex biasanya memerlukan waktu lebih lama dan berpotensi memperlambat proses development Anda.

Untuk mengurangi waktu pembangunan yang lebih lama bagi keluaran multidex, buatlah dua varian versi dengan menggunakan productFlavors: ragam development dan ragam rilis dengan nilai-nilai berbeda untuk minSdkVersion.

Untuk ragam development, setel minSdkVersion ke 21. Setelan ini mengaktifkan fitur pembangunan bernama pre-dexing, yang menghasilkan keluaran multidex jauh lebih cepat dengan menggunakan format ART yang hanya tersedia pada Android 5.0 (API level 21) dan yang lebih tinggi. Untuk ragam rilis, setel minSdkVersion secara tepat untuk tingkat dukungan minimum yang sesungguhnya. Setelan ini menghasilkan APK multidex yang kompatibel dengan lebih banyak perangkat, namun membutuhkan waktu lebih lama untuk dibuat.

Contoh konfigurasi pembangunan berikut menunjukkan cara menyiapkan ragam ini dalam file pembangunan Gradle:

android {
    defaultConfig {
        ...
        multiDexEnabled true
    }
    productFlavors {
        dev {
            // Enable pre-dexing to produce an APK that can be tested on
            // Android 5.0+ without the time-consuming DEX build processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the production version.
            minSdkVersion 14
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile 'com.android.support:multidex:1.0.1'
}

Setelah menyelesaikan perubahan konfigurasi ini, Anda bisa menggunakan varian devDebug aplikasi Anda untuk pembangunan bertahap, yang mengombinasikan berbagai atribut ragam produk dev dan tipe versi debug. Ini akan membuat aplikasi yang bisa di-debug dengan multidex diaktifkan dan proguard dinonaktifkan (karena minifyEnabled bernilai false secara default). Setelan ini menyebabkan Plugin Android untuk Gradle melakukan tindakan berikut:

  1. Melakukan pre-dexing: Membangun setiap modul aplikasi dan setiap dependensi sebagai file DEX terpisah.
  2. Menyertakan setiap file DEX dalam APK tanpa modifikasi (tidak ada penciutan kode).
  3. Yang paling penting, file DEX modul tidak digabungkan, sehingga perhitungan yang berjalan lama untuk menentukan materi file DEX primer bisa dihindari.

Setelan ini menghasilkan pembangunan bertahap yang cepat, karena hanya file DEX dari modul yang dimodifikasi yang akan diproses ulang dan dikemas ulang selama pembangunan selanjutnya. Akan tetapi, APK dari pembangunan ini hanya bisa digunakan untuk pengujian pada perangkat Android 5.0. Namun, dengan mengimplementasikan konfigurasi sebagai ragam, Anda mempertahankan kemampuan untuk melakukan pembangunan normal dengan level API minimum sesuai-rilis dan penciutan kode ProGuard.

Anda juga bisa membangun varian lainnya, termasuk pembangunan varian prodDebug, yang membutuhkan waktu lebih lama untuk dibangun, namun bisa digunakan untuk pengujian di luar development. Dalam konfigurasi yang ditampilkan, varian prodRelease akan menjadi pengujian terakhir dan versi rilis. Untuk informasi selengkapnya tentang penggunaan varian versi, lihat Mengonfigurasi Varian Versi.

Tip: Karena kini Anda telah memiliki beragam varian versi untuk kebutuhan multidex yang berbeda, Anda juga bisa menyediakan file manifes berbeda untuk setiap varian (jadi hanya varian untuk API level 20 dan yang lebih rendah yang mengubah nama tag <application>), atau buat subkelas Application yang berbeda untuk setiap varian (jadi hanya varian untuk API level 20 dan yang lebih rendah yang akan memperluas kelas MultiDexApplication atau memanggil MultiDex.install(this)).

Pengujian aplikasi multidex

Saat menulis pengujian instrumentasi bagi aplikasi multidex, tidak ada konfigurasi tambahan yang diperlukan. AndroidJUnitRunner langsung mendukung multidex, asalkan Anda menggunakan MultiDexApplication atau mengganti metode attachBaseContext() dalam objek Application khusus dan memanggil MultiDex.install(this) untuk mengaktifkan multidex.

Atau, Anda bisa mengganti metode onCreate() dalam AndroidJUnitRunner:

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

Catatan: Penggunaan multidex untuk membuat APK pengujian saat ini tidak didukung.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)