Các tập tin .dex trong Android là gì?


193

Tôi có một số câu hỏi liên quan đến các tập tin dex

  • Một dextập tin trong Android là gì?
  • Làm thế nào để dex hoạt động cho Android?
  • Chúng được sử dụng như thế nào trong việc gỡ lỗi một ứng dụng Android?
  • Chúng có giống với các tệp lớp java không?

Tôi cần thông tin cụ thể xin vui lòng giúp đỡ về điều này và bất kỳ ví dụ thực tế đều được chào đón!



Cách chạy chúng trên thiết bị: stackoverflow.com/questions/10199863/
trộm

Câu trả lời:


226

Giới thiệu về tệp .dex:

Một trong những tính năng đáng chú ý nhất của Dalvik Virtual Machine(đặc điểm công việc trong hệ thống Android) là nó không sử dụng mã byte Java. Thay vào đó, một định dạng cây nhà lá vườn được gọi là DEX đã được giới thiệu và thậm chí các hướng dẫn mã byte cũng không giống như các hướng dẫn mã byte Java.

Compiled Android application code file.

Các chương trình Android được biên dịch thành .dexcác tệp (Dalvik Executable), lần lượt được nén thành một .apktệp duy nhất trên thiết bị. .dexcác tệp có thể được tạo bằng cách tự động dịch các ứng dụng đã biên dịch được viết bằng ngôn ngữ lập trình Java.

Định dạng tệp Dex:

 1. File Header
 2. String Table
 3. Class List
 4. Field Table
 5. Method Table
 6. Class Definition Table
 7. Field List
 8. Method List
 9. Code Header
10. Local Variable List

Android có tài liệu về Dalvik Executable Format( tệp .dex ). Bạn có thể tìm hiểu thêm tại các tài liệu chính thức: Định dạng tệp Dex

.dex các tệp tương tự như các tệp lớp java, nhưng chúng được chạy trong Máy ảo Dalkvik (DVM) trên các phiên bản Android cũ hơn và được biên dịch tại thời điểm cài đặt trên thiết bị thành mã gốc với ART trên các phiên bản Android mới hơn.

Bạn có thể decompile.dex sử dụng dexdumpcông cụ được cung cấp trong android-sdk.

Ngoài ra còn có một số Kỹ thuật Kỹ thuật đảo ngược để tạo jar filehoặc java class filetừ một .dextệp.


Tệp jar của tôi chứa một số xml trong thư mục tài sản. Tôi muốn đây là một phần của .dex Bạn có ý tưởng nào để thực hiện điều này không?
AndroidGuy

@AndroidGuy - Tệp Jar không chứa bất kỳ gói tài nguyên Android (/ nội dung) nào bạn phải sử dụng Gói thư viện Android cho việc này.
user370305

Làm thế nào để nó hoạt động trên ART, trên Android Lollipop? Những tập tin nào được sử dụng ở đó, và trong đường dẫn nào? Một số người nói rằng nó sẽ mất nhiều không gian hơn. Có đúng không Nếu vậy, làm thế nào đến? Ý tôi là, mã gốc dường như luôn nhỏ hơn nhiều so với mã byte và các tệp dex tương tự như mã byte về cách thức hoạt động của nó.
nhà phát triển Android

Một điều quan trọng cần lưu ý đó dexdumpkhông phải là trình dịch ngược mà là trình dịch ngược
genghiskhan 23/07/19

90
.dex file

Tổng hợp tập tin mã ứng dụng Android.

Các chương trình Android được biên dịch thành các tệp .dex (Dalvik Executable), lần lượt được nén thành một tệp .apk trên thiết bị. Các tệp .dex có thể được tạo tự động bởi Android, bằng cách dịch các ứng dụng đã biên dịch được viết bằng ngôn ngữ lập trình Java.


2
Tệp jar của tôi chứa một số xml trong thư mục tài sản. Tôi muốn đây là một phần của .dex Bạn có ý tưởng nào để thực hiện điều này không?
AndroidGuy

87

dex tệp là một tệp được thực thi trên máy ảo Dalvik.

Dalvik VM bao gồm một số tính năng để tối ưu hóa hiệu suất, xác minh và giám sát, một trong số đó là Dalvik Executable (DEX) .

Mã nguồn Java được trình biên dịch Java biên dịch thành .classcác tệp. Sau đó, dxcông cụ (dexer), một phần của SDK Android xử lý các .classtệp thành định dạng tệp có tên là DEXmã byte Dalvik. Công dxcụ loại bỏ tất cả các thông tin dư thừa có trong các lớp. Trong DEXtất cả các lớp của ứng dụng được đóng gói thành một tệp. Bảng sau đây cung cấp so sánh giữa các kích thước mã cho các tệp jar JVM và các tệp được xử lý bởi dexcông cụ.

Bảng so sánh kích thước mã cho thư viện hệ thống, ứng dụng trình duyệt web và ứng dụng cho mục đích chung (ứng dụng đồng hồ báo thức). Trong mọi trường hợp, công cụ dex giảm kích thước mã hơn 50%.

nhập mô tả hình ảnh ở đây

Trong các môi trường Java tiêu chuẩn, mỗi lớp trong mã Java dẫn đến một .classtệp. Điều đó có nghĩa là, nếu tệp mã nguồn Java có một lớp chung và hai lớp ẩn danh, giả sử để xử lý sự kiện, thì trình biên dịch java sẽ tạo tổng cộng ba .classtệp.

Bước biên dịch giống nhau trên nền tảng Android, do đó dẫn đến nhiều .classtệp. Nhưng sau khi .classcác tệp được tạo, công cụ của dx Cảnh được sử dụng để chuyển đổi tất cả .classcác tệp thành một tệp duy nhất .dex, hoặc Dalvik Executable ,. Đây là .dextệp được thực thi trên máy ảo Dalvik. Các .dextập tin đã được tối ưu hóa cho việc sử dụng bộ nhớ và thiết kế chủ yếu được điều khiển bằng cách chia sẻ dữ liệu.


18
Thông tin tốt. Chỉ cần một điều để chỉ ra. Đôi khi sẽ có nhiều tệp dex vì giới hạn số lệnh của lệnh gọi phương thức. Giới hạn này là 65k phương pháp. Trong trường hợp đó, mã của bạn sẽ không nằm trong một tệp duy nhất mà trong 2 hoặc nhiều hơn nhưng mọi thứ khác vẫn được áp dụng. Ngoài ra, vì tải lớp động cũng có sẵn, bạn có thể tải mã (một lần nữa ở dạng dexed) từ các tệp và do đó mã sẽ nằm trong nhiều tệp dex.
Igor ordaš
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.