2013-01-09 14 views
36

Khi mở tệp apk bằng winrar (s/w để mở tệp nén). Tôi có một loạt các tệp được đóng gói bên trong gói ứng dụng. Trong số đó classes.dex là một. Câu hỏi của tôi là vai trò của tệp này là gì và nếu chúng tôi sửa đổi/xóa cùng một tệp, nó sẽ ảnh hưởng đến gói ứng dụng?Vai trò của tệp classes.dex trong tệp APK

Trả lời

46

Để tạo tệp APK, một chương trình dành cho Android được biên dịch lần đầu tiên và sau đó tất cả các phần của nó được đóng gói thành một tệp. Điều này chứa tất cả mã của chương trình đó (Đây là .dex files), tài nguyên, tài sản, chứng chỉ và tệp kê khai.

Các chương trình thường được viết bằng Java và được biên dịch thành bytecode. Sau đó, chúng được chuyển đổi từ các tệp Java Virtual Machine-compatible .class files thành Dalvik-compatible .dex (Dalvik Executable) trước khi cài đặt trên thiết bị. Định dạng Dalvik Executable nhỏ gọn được thiết kế để phù hợp với các hệ thống bị hạn chế về mặt bộ nhớ và tốc độ xử lý.

  • classes.dex: Các lớp biên soạn trong các định dạng tập tin dex hiểu bởi máy ảo Dalvik

Như các file .dex giữ nguồn apk, bất kỳ chỉnh sửa bằng các file sẽ trực tiếp ảnh hưởng đến APK.

+2

Câu trả lời hay. Bạn có biết tại sao chỉ có một classes.dex khi có nhiều tệp .class? Đây có phải là do sự tối ưu hóa được thực hiện bởi dexing hoặc nó chỉ là một số loại gói như tập tin .jar là? – PSIXO

+0

tệp dex không chứa tài nguyên tôi tin. chúng được hợp nhất sau khi classes.dex được tạo ra. – zgulser

9

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

From Android API GUIDES

chương trình Android được biên dịch vào .dex (Dalvik Executable) tác phẩm, đó là lần lượt nén vào một tập tin duy nhất .apk trên thiết bị. Các tệp .dex 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.

Và có nếu bạn xóa những tệp đó, APK đó sẽ ảnh hưởng đến APK.

4

lớp.dex về cơ bản là tất cả logic ứng dụng. Mã của ứng dụng đã cho được viết bằng java và sau đó được biên dịch thành các tệp lớp, sau đó các tệp lớp này được biên dịch chéo (với nhiều tối ưu hóa) sang định dạng VM dalvik. Lưu ý rằng cũng có một số tệp .so cũng là mã ứng dụng nhưng chúng được tạo khi NDK được sử dụng. Bạn không thể xóa tệp này. Tuy nhiên, bạn có thể thay đổi nó bằng cách chạy tiện ích này lần đầu tiên https://code.google.com/p/smali/ mà sẽ tạo ra mã smali từ dex biên dịch này mà phần nào tương tự như java và có thể được hiểu. Bạn cũng có thể sử dụng các công cụ ApkOneClick hoặc ApkMultiTool để lấy mã nguồn Java từ các tệp smali nhưng chúng có thể không hoàn hảo và sẽ yêu cầu sửa chữa thêm. Khi bạn thay đổi mã bạn muốn, bạn nên xây dựng lại classes.dex và đặt chúng vào tệp zip/apk hiện có mà bạn có. Lưu ý rằng các tệp chứng chỉ hiện có (META-INF) sẽ không còn hợp lệ nữa và bạn sẽ cần xóa thư mục này và từ bỏ gói apk để cài đặt nó trên điện thoại hoặc trình giả lập.

Để biết thêm thông bạn có thể kiểm tra câu hỏi này quá What are .dex files in Android?

Ngoài ra đây là một hướng dẫn tuyệt vời về tháo file dex sử dụng công cụ hiện có http://blog.vogella.com/2011/02/14/disassemble-android-dex

0

tập tin .dex trong apk là file nén được tạo thành từ của tất cả các lớp java trong mã ứng dụng. Nó khác với tệp jar. Tệp jar là một tập hợp các tệp .class được phân lập. Nếu chúng ta giải nén.jar, chúng ta có được tất cả các lớp riêng biệt. Ở phía bên kia, tệp .dex là một tệp duy nhất được tạo bởi tất cả các tệp .class từ mã ứng dụng.

Mã dòng chảy biên soạn: nhiều file java -> nhiều .classes file -> file .dex đơn

file .dex là thực thi được thực hiện bởi các DVM ... Dalvik Virtual Machine , là một Runtime cho Android.

.dex sẽ không bao giờ bao gồm tài nguyên. Tài nguyên được duy trì riêng trong thư mục/res trong .apk

1

Vai trò của tệp này là gì?

Vai trò của classes.dex trong Android tương tự như của tệp JAR trong Java thuần. Đó là một tệp có chứa bytecode. Trong trường hợp Android, bytecode là bytecode Dalvik, khác với Java bytecode.

Nếu chúng tôi sửa đổi/xóa cùng một tệp, nó sẽ ảnh hưởng đến gói ứng dụng?

Nếu bạn sửa đổi classes.dex, bạn đang sửa đổi hành vi của chương trình, có thể có hoặc không hoạt động sau khi đóng gói lại. Nếu bạn xóa classes.dex, thì ứng dụng của bạn không có mã và bạn không nên mong đợi nó hoạt động.