Tệp ODEX trong Android là gì?


82

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 odextệp (không phải apk) trong điện thoại thông minh. Nó xảy ra như thế nào? Ai có thể chỉ giáo cho tôi, tôi rất quan tâm về nó.

Câu trả lời:


85

Bài viết trên blog chủ yếu là đúng, nhưng không hoàn chỉnh. Để hiểu đầy đủ về chức năng của tệp odex, bạn phải hiểu một chút về cách hoạt động của tệp ứng dụng (APK).

Các ứng dụng về cơ bản là các kho lưu trữ ZIP được đánh giá cao. Mã java được lưu trữ trong một tệp có tên là class.dex và tệp này được phân tích cú pháp bởi Dalvik JVM và một bộ đệm của tệp class.dex đã xử lý được lưu trong bộ đệm Dalvik của điện thoại.

Về cơ bản, odex là phiên bản được xử lý trước của các lớp của ứng dụng.dex đã sẵn sàng thực thi cho Dalvik. Khi một ứng dụng được odex, các lớp.dex sẽ bị xóa khỏi kho lưu trữ APK và nó không ghi bất kỳ thứ gì vào bộ đệm Dalvik. Một ứng dụng không được odexed kết thúc với 2 bản sao của tệp class.dex - bản được đóng gói trong APK và bản được xử lý trong bộ nhớ cache Dalvik. Cũng mất một chút thời gian để khởi chạy lần đầu tiên vì Dalvik phải giải nén và xử lý tệp tin class.dex.

Nếu bạn đang xây dựng một ROM tùy chỉnh, tốt hơn hết là bạn nên odex cả tệp JAR khung của mình và các ứng dụng có sẵn để tối đa hóa không gian lưu trữ nội bộ cho các ứng dụng do người dùng cài đặt. Nếu bạn muốn tạo chủ đề, thì chỉ cần deodex -> áp dụng chủ đề của bạn -> reodex -> phát hành.

Để thực sự deodex, hãy sử dụng small và baksmali:

https://github.com/JesusFreke/smali/wiki/DeodexInstructions


Bạn có thể vui lòng chia sẻ tấn cách chúng ta có thể mã hóa lại một tệp apk không?
Basher51

23

Bài viết trên Blog này giải thích nội dung bên trong của tệp ODEX:

TẬP TIN ODEX LÀ GÌ?

Trong hệ thống tệp Android, các ứng dụng có dạng gói với phần mở rộng là .apk. Các gói ứng dụng hoặc APK này chứa các tệp .odex nhất định có chức năng được cho là tiết kiệm dung lượng. Các tệp 'odex' này thực sự là tập hợ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 sẽ tăng tốc quá trình khởi động, vì nó tải trước một phần của ứng dụng. Mặt khác, nó cũng làm cho việc hack các ứng dụng đó trở nên khó khăn vì một phần mã hóa đã được trích xuất sang vị trí khác trước khi thực thi.


Nếu tôi hy vọng ứng dụng của mình có cùng chức năng (ứng dụng chạy trong odex không phải APK), làm thế nào để làm điều đó?
user1253435 Ngày

Bạn sẽ nhận được một điểm trừ! 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 một trình biên dịch từ ngôn ngữ cấp cao đến cấp thấp hơn, chỉ có điều trong trường hợp này mã cho dalvik gần như là một bản dịch sang mã máy. Đó là lý do tại sao bạn có thể tạo một ứng dụng từ C ++, không chỉ từ java.
cox

Bạn có chắc điều đó APKs contain certain .odex fileskhông ?!
Amir Rezazadeh

3

NGHỆ THUẬT

Theo tài liệu: http://web.archive.org/web/20170909233829/https://source.android.com/devices/tech/dalvik/configure một .odextệp:

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

Hơn nữa, chúng dường như là thư viện được chia sẻ thông thường, vì nếu bạn nhận được bất kỳ ứng dụng nào và hãy kiểm tra:

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

nó nói rằng:

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

aarch64-linux-gnu-objdump -d base.odexdường như hoạt động và cung cấp một số tháo gỡ có ý nghĩa (nhưng cũng có một số phần rác).

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.