Android MultiDex là gì?


111

Có rất nhiều bài đăng về MultiDex. Đôi khi, tôi đã gặp phải các lỗi được giải quyết bao gồm cả multiDexEnabled truetrong defaultConfigphần build.gradle của tôi.

Nhưng, chính xác thì tính năng này là gì? Các tình huống sử dụng nó là gì?

Câu trả lời:


166

Trích dẫn tài liệu :

Tệp ứng dụng Android (APK) chứa tệp bytecode thực thi ở dạng tệp Dalvik Executable (DEX), chứa mã đã biên dịch được sử dụng để chạy ứng dụng của bạn. Đặc tả Dalvik Executable giới hạn tổng số phương thức có thể được tham chiếu trong một tệp DEX là 65.536, bao gồm các phương thức khung Android, phương thức thư viện và phương thức trong mã của riêng bạn. Vượt qua giới hạn này yêu cầu bạn định cấu hình quy trình xây dựng ứng dụng của mình để tạo nhiều tệp DEX, được gọi là cấu hình đa cấp độ.

Vì vậy, tính năng là: nó cho phép ứng dụng phức tạp của bạn biên dịch. Các tình huống sử dụng nó là khi ứng dụng của bạn không thể biên dịch do đạt đến giới hạn tham chiếu phương thức DEX 64K. Điều này xuất hiện dưới dạng lỗi xây dựng, chẳng hạn như:

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

2
Bất kỳ ý tưởng nào về cơ sở mã này sẽ lớn như thế nào (LOC, hoặc số lượng màn hình thô)? Bạn sẽ đạt đến giới hạn này trên một ứng dụng 5-6 màn hình đơn giản hay nó thực sự xa hơn nhiều (tức là: 10-20 màn hình) mà bạn có thể sẽ đạt đến nó
Marchy

20
@Marchy: Thông thường, nó đến từ việc thêm quá nhiều thư viện. Rất khó để một dự án không có thư viện đạt đến giới hạn này.
CommonsWare

3
Tôi có một ứng dụng nhỏ sử dụng khoảng 5 thư viện hỗ trợ của google cũng như Fabric.io và 2 hoặc 3 thư viện bên thứ ba khác và tôi phải sử dụng multi-dex.
c.dunlap

1
có bất kỳ nhược điểm nào của việc kích hoạt multidex không? tại sao không để nó đúng như mặc định?
Rafael Lima

1
@RafaelLima: Có vấn đề bảo mật với bán hỗ trợ của multidex cho các thiết bị chạy trước Android 5.0. IIRC, nó cũng có thể gây ra một số vấn đề với ứng dụng của bạn, nếu bạn đang cố gắng sử dụng các lớp nằm trong tệp DEX chưa được tải.
CommonsWare

43

Nó đơn giản như thế này

Một tệp .dex duy nhất có thể có 65.536 phương thức (tham chiếu), vì vậy nếu số lượng tham chiếu vượt quá 65.536, bạn sử dụng multidex.

Giải thích thêm!

Một chương trình ứng dụng android được biên dịch thành tệp .dex, tệp này lần lượt được nén thành một tệp .apk.
DVM (Máy ảo Dalvik) sử dụng tệp / tệp .dex để thực thi các mã byte.

Nguyên nhân nào khiến số lượng tham chiếu vượt quá giới hạn 65.536?
Các phương thức do bạn viết + Phương pháp Android Framework + Phương pháp thư viện bên thứ ba (ví dụ: Volley, Retrofit, Facebook SDK, v.v.).
Tôi đã đọc "đâu đó"
App Compat 24.2.1 chứa 16,5k phương thức
Google Play Services GCM 9.6.1 chứa 16,7k phương thức
Vì vậy, nếu bạn đã tạo một ứng dụng Hello world đơn giản có App Compat 24.2.1, bạn đã được 1/4 cách vượt qua giới hạn các phương thức dex đơn lẻ


7

MultiDex trong Android là gì?

Dex là viết tắt của Dalvik Executable, là bộ xử lý máy ảo của Google (Dalvik) sử dụng để xử lý các Ứng dụng Android. Android được xây dựng với các ứng dụng nhỏ và đơn giản trong tâm trí và các ràng buộc trên một Dalvik Executable duy nhất đã ghim mái nhà tham chiếu mã ở 65.536 phương thức. Do vấn đề này và cách máy Dalvik xử lý việc thực thi mã, đã có một số vấn đề về biên dịch và gọi, cho đến khi tích hợp Monkey Patch hoặc MultiDex . Tích hợp MultiDex trong Android Studio cho phép các Nhà phát triển Android có khả năng biên dịch và thực thi cơ sở mã với hơn 65.536 phương thức!


1

Đang xác nhận trang web chính thức của nhà phát triển Android.

If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.

1
Cảm ơn vì câu trả lời. Đây là một câu hỏi từ năm 2015, rất nhiều thứ đã thay đổi kể từ đó.
Roberto Tellez Ibarra

-2

Điều mà nó cũng cho phép là google (và những người khác) áp dụng DRM, chẳng hạn như .. widevine, trong các đoạn mã mà nó gây ra vấn đề cho hầu hết những người không phải là nhà phát triển ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.