2012-03-06 48 views
66

Sau khi một số android ứng dụng được cài đặt, tôi thấy rằng nó sẽ thay đổi thành odex tệp (không phải apk) trong điện thoại thông minh. Điều đó xảy ra như thế nào? Ai có thể dạy tôi, tôi rất quan tâm đến nó.Các tệp ODEX trong Android là gì?

Trả lời

15

This Blog article giải thích bên trong của file Odex:

AN FILE Odex LÀ GÌ?

Trong hệ thống tệp Android, các ứng dụng đi kèm gói với phần mở rộng .apk. Các gói ứng dụng hoặc APK này chứa các tệp .odex có chức năng được cho là nhằm tiết kiệm dung lượng. Các tệp ‘odex’ này thực sự là bộ sưu tập các phần của ứng dụng được tối ưu hóa trước khi khởi động. Làm như vậy tăng tốc quá trình khởi động, vì nó tải trước một phần của một ứng dụng. Mặt khác, nó cũng làm cho việc tải các ứng dụng này trở nên khó khăn vì một phần mã hóa đã bị trích xuất đến một vị trí khác trước khi thực hiện.

+0

Nếu tôi hy vọng ứng dụng của tôi có cùng chức năng (ứng dụng chạy trong odex không phải APK), cách thực hiện? – user1253435

+0

Bạn sẽ nhận được một dấu trừ! Các dalvik không tối ưu hóa thời gian khởi động. Mã nó được tối ưu hóa giống như trong trình biên dịch từ ngôn ngữ cấp cao đến cấp thấp hơn, chỉ trong trường hợp này mã cho dalvik gần như là bản dịch sang mã máy. Đó là lý do tại sao bạn có thể tạo ra một ứng dụng từ C++, không chỉ từ java. – cox

65

The blog article chủ yếu là đúng, nhưng chưa hoàn thành. Để hiểu đầy đủ về tệp odex, bạn phải hiểu một chút về cách các tệp ứng dụng (APK) hoạt động.

Các ứng dụng về cơ bản là các lưu trữ ZIP được tôn vinh. Mã java được lưu trữ trong một tệp gọi là classes.dex và tệp này được phân tích cú pháp bởi Dalvik JVM và bộ nhớ cache của tệp classes.dex được xử lý được lưu trữ trong bộ nhớ cache Dalvik của điện thoại.

Một odex về cơ bản là phiên bản được xử lý trước của các lớp application.dex của ứng dụng được thực thi sẵn sàng cho Dalvik. Khi một ứng dụng là odexed, các classes.dex được lấy ra từ kho lưu trữ APK và nó không viết bất cứ điều gì để bộ nhớ cache Dalvik. Một ứng dụng không phải là odexed kết thúc với 2 bản sao của các tập tin classes.dex - một đóng gói trong APK, và một xử lý trong bộ nhớ cache Dalvik. Nó cũng mất nhiều thời gian hơn để khởi chạy lần đầu tiên kể từ khi Dalvik phải trích xuất và xử lý tệp classes.dex.

Nếu bạn đang xây dựng một ROM tùy chỉnh, bạn nên đánh giá cả tệp JAR khung và ứng dụng kho để tối đa hóa dung lượng lưu trữ nội bộ cho ứng dụng do người dùng cài đặt. Nếu bạn muốn chủ đề, sau đó chỉ cần deodex -> áp dụng chủ đề của bạn -> reodex -> phát hành.

Để thực sự deodex, sử dụng nhỏ và baksmali:

http://code.google.com/p/smali/wiki/DeodexInstructions

+0

Bạn có thể vui lòng chia sẻ cách chúng tôi có thể reodex một tập tin apk? – Basher51

0

ART

Trong ART, .odex file chứa:

chứa AOT mã biên dịch cho các phương pháp trong APK.

theo các tài liệu: http://web.archive.org/web/20170909233829/https://source.android.com/devices/tech/dalvik/configure

Bên cạnh đó, họ dường như các thư viện chia sẻ thường xuyên, vì nếu bạn nhận được bất kỳ ứng dụng, và kiểm tra:

file /data/app/com.android.appname-*/oat/arm64/base.odex 

nó nói:

base.odex: ELF shared object, 64-bit LSB arm64, stripped 

aarch64-linux-gnu-objdump -d base.odex dường như hoạt động và đưa ra một số cách tháo gỡ có ý nghĩa (nhưng cũng có một số phân đoạn rác ns).