- Phuc's Notes
- Posts
- Android Runtime - ART
Android Runtime - ART
Tìm hiểu về Android Runtime
Hầu hết người dùng Android và cả các developer thường không quan tâm đến việc làm sao để mã nguồn (code) viết bởi lập trình viên trở thành một app có thể cài đặt và chạy trên điện thoại hay máy tính bảng. Trên thực tế thì chúng ta cũng không cần biết về kiến thức này mà vẫn có thể viết ra những phần mềm tốt. Tuy nhiên, nếu bạn tò mò thì chúng ta sẽ cùng tìm hiểu trong bài viết hôm nay.
Davilk và DEX
Trước khi tìm hiểu về Android Runtime (ART), chúng ta cần hiểu chuyện gì xảy ra với project khi chúng ta click lên button Build trên Android Studio. Android Studio sẽ thực thi nhiều bước để build project, nhưng kết quả cuối cùng sẽ một file .apk (Android Application Package), file này sẽ chứa tất cả các tài nguyên (resources) cần thiết của app như hình ảnh, text/string và các loại data khác.
File .apk chứa code đã được biên dịch (compile) thành intermediate bytecode (dịch tiếng Việt hơi khó - bytecode trung gian?, sẽ giải thích sau), được gọi là DEX (Dalvik Executable). Dalvik là tên của một runtime cũ được sử dụng trên các phiên bản Android cũ. Mặc dù Dalvik không còn được dùng nữa nhưng ART vẫn dùng DEX bytecode chứ không sử dụng định dạng khác.
Từ Android 4.4 (Kitkat), ART được đưa vào thử nghiệm, developer có thể switch qua lại giữa ART và Dalvik trong Settings của máy. Từ Android 5.0 (Lollipop) thì ART bắt đầu thay thế hoàn toàn Dalvik.
Ở trên chúng ta có nhắc tới intermediate bytecode là bởi vì bytecode sau khi được biên dịch sẽ không được chạy trực tiếp trên CPU của thiết bị. Thay vào đó, nó sẽ được chạy trên một runtime, điều này cho phép cùng một mã nguồn, sau khi biên dịch ra DEX sẽ chạy được trên bất kì thiết bị nào có runtime tương thích (có thể chạy được DEX file) mà không quan tâm đến cấu trúc phần cứng. Nói một cách đơn giản thì runtime này sẽ phiên dịch (interpret) DEX bytecode sang các lệnh (instruction) mà CPU có thể chạy được.

The runtime system executes DEX Bytecode
Vậy câu hỏi là tại sao Dalvik lại bị thay thế bởi ART?
Khi một app Android được chạy, Dalvik runtime sẽ dịch DEX bytecode sang mã máy (machine code) tuỳ thuộc vào kiến trúc của CPU. Chính điều này làm cho hiệu năng của app giảm đáng kể (vì phải dịch trong lúc chạy). Cách hoạt động này của Dalvik gọi là Just-in-Time (JIT) và rõ ràng là cách này sẽ làm cho app được tải lên và chạy chậm hơn khả năng thực tế của CPU. Ngoài ra, pin (battery) của máy cũng sẽ bị ảnh hưởng do app phải thực hiện các bước trung gian này. ART được phát triển và ra đời để giải quyết vấn đề này của Dalvik.
ART và AOT
ART (Android Runtime) cũng có vai trò tương tự như Dalvik, nó sẽ dịch DEX bytecode sang các lệnh để chạy trên CPU nhưng bằng một cách tiếp cận khác.
Thay vì sử dụng JIT để dịch DEX bytecode khi app đang chạy thì ART thực hiện việc biên dịch này tại thời điểm app được cài đặt lên máy, và dĩ nhiên việc này chỉ được thực hiện một lần duy nhất. Kỹ thuật này được gọi là Ahead-of-Time (AOT). Tức là ở thời điểm cài app, DEX bytecode sẽ được dịch sang một file chứa mã máy mà sau này CPU có thể đọc và chạy được mà không cần biên dịch lại nữa. Và cứ mỗi lần app được mở lên thì file này được dùng để chạy, tốc độ được cải thiện là điều tất yếu và pin cũng không bị ảnh hao tổn do quá trình biên dịch lại như khi chạy trên Dalvik.
ART và Linux Kernel
Ở phía trên thì để dễ hiểu, chúng ta đã đơn giản hoá các bước và nói rằng file chứa mã máy (sau khi được dịch từ DEX) sẽ chạy trực tiếp trên CPU. Nhưng thật sự điều này không đúng, vì CPU thuộc về phần cứng và để tương tác với phần cứng thì chúng ta phải thông qua Linux kernal và HAL (Hardware Abstraction Layer). Vậy Android đã quản lý việc kết nối, giao tiếp giữa runtime và Linux kernal này như thế nào?
ART sử dụng AOT để tạo ra ELF (Executable and Linkable Format) file, file này chứa các mã có thể chạy được và các thư viện cần thiết để chạy được app. Khi chúng ta mở app lên, Linux kernel sẽ mở file ELF file và chạy các mã này trên CPU:

Process from installing the app to running the app on CPU
Tài liệu tham khảo:
Jetpack Compose 1.7 Essentials: Developing Androdi Apps with Jetpack Compose 1.7, Android Studio and Kotlin (Ney Smyth, 2024 edition - Chapter 10.4 - Android Runtime - ART)
Reply