2011-10-13 77 views
129

Tôi có một số câu hỏi liên quan đến file dexCác tệp .dex trong Android là gì?

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

Tôi cần thông tin cụ thể, vui lòng giúp đỡ về điều này và mọi ví dụ thực tế đều được hoan nghênh!

+0

plz Thấy liên kết này http://stackoverflow.com/questions/1249973/decompiling-dex-into-java-sourcecode – Gensheriff

+0

cách chạy chúng trên thiết bị: http://stackoverflow.com/questions/10199863/how- to-execute-the-dex-file-in-android-với-lệnh –

Trả lời

84
.dex file 

Tệp mã ứng dụng Android được biên dịch.

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 duy nhất 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 nội dung. Tôi muốn điều này là một phần của .dex Bất kỳ ý tưởng nào về cách thực hiện điều này? – AndroidGuy

154

Về File .dex:

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

Compiled Android application code file. 

chương trình Android được biên dịch vào .dex (Dalvik Executable) các tập tin, đó là lần lượt nén vào một tập tin duy nhất .apk trên thiết bị. .dex tệp có thể được tạo bằng cách dịch tự động 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 file 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 trên Dalvik Executable Format (.dex tập tin). Bạn có thể tìm hiểu thêm tại các tài liệu chính thức: Dex File Format

.dex tệp tương tự như tệp lớp java, nhưng chúng được chạy dưới Dalkvik Virtual (DVM) trên phiên bản Android cũ hơn và được biên dịch tại thời gian cài đặt trên thiết bị 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 bằng công cụ dexdump được cung cấp trong android-sdk.

Ngoài ra còn có một số Kỹ thuật Reverse Engineering để thực hiện một jar file hoặc java class file từ một tập tin .dex.

+0

Tệp jar của tôi chứa một số xml trong thư mục nội dung. Tôi muốn điều này là một phần của .dex Bất kỳ ý tưởng nào về cách thực hiện điều này? – AndroidGuy

+0

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

+1

JADX: Trình giải mã Dex sang Java https://github.com/skylot/jadx (Giấy phép Apache) – foo

63

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

Máy ảo Dalvik 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 biên dịch bởi trình biên dịch Java thành các tệp .class. Sau đó, công cụ dx (dexer), một phần của SDK Android xử lý các tệp .class thành định dạng tệp được gọi là DEX có chứa mã byte Dalvik. Công cụ dx loại bỏ tất cả các thông tin dư thừa có trong các lớp. Trong DEX tất cả các lớp của ứng dụng được đóng gói thành một tệp. Bảng sau cung cấp sự 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ằng công cụ dex.

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 có 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 của mã xuống hơn 50%.

enter image description here

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

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

+2

đây là câu trả lời tốt hơn và đầy đủ hơn những người khác – Joe

+11

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

+1

câu trả lời hoàn hảo ... –

0

Tệp lớp ở đây chứa mã byte Oracle JVM chuẩn.

• Dalvik bytecode

[JAVA CLASS FILE]> [DEX CLASS FILE]

Kể từ khi, file java .class chứa JVM byte-code chuẩn. Nhưng thiết bị Android không sử dụng định dạng mã byte này. Thay vào đó, Android có định dạng mã byte riêng biệt được gọi là Dalvik. Các mã byte Dalvik, giống như các mã byte Oracle JVM, là các lệnh mã máy cho một bộ xử lý lý thuyết.

Quá trình biên dịch cần phải chuyển đổi các tệp .class và bất kỳ thư viện .jar nào thành một tệp classes.dex chứa các mã byte Dalvik. Lệnh dx khâu tất cả các tệp .class và .jar lại với nhau thành một tệp classes.dex duy nhất được viết bằng định dạng mã byte Dalvik.

Bây giờ, việc chuyển đổi tệp .class và .jar này thành tệp .dex được gọi là Biên dịch Dex và các tệp thu được được gọi là Tệp Dex.

Các vấn đề liên quan