Cách APK được thực thi trong Android

Cách một ứng dụng trong hệ điều hành Android được thực thi đã thay đổi khá nhiều trong thời gian gần đây. Một trong những thay đổi đáng kể đến nhất, với sự ra mắt của Android 5.0, Dalvik Virtual Machine đã bị thay thế bởi Android Runtime.

Bước 1: User yêu cầu thực thi một app (bằng cách chạm vào biểu tượng của app trên launcher)

Một process gọi là Zygote được sử dụng để thực thi app. Zygote là một phiên bản không hoàn thiện của Android process – vùng nhớ (memory space – Heap) của nó chứa tất cả những class đã được preload. Những class này là những class được sử dụng thường xuyên ở tất cả các app.

Zygote chính là môi trường để các app có thể khởi động nhanh hơn, không tốn thời gian load lại những class chung.

(Hãy tưởng tượng Zygote như một môi trường mà các class cần thiết đã được load sẵn. Sau khi một app nhất định được yêu cầu thực thi, lúc đó, app mới nạp vào vùng nhớ của Zygote thêm những class cần thiết riêng của app đó.)

Zygote tạo một bản copy của chính nó bằng lệnh fork() (đây là lệnh của hệ thống Linux, mình sẽ không nói chi tiết về lệnh này. Các bạn có thể google để tìm hiểu thêm). Và lệnh fork có thể duplicate process Zygote rất nhanh.

Đây là lý do tại sao process Zygote được sử dụng. Duplicate một process đã load những core class như Zygote sẽ tiết kiệm thời gian hơn rất nhiều so với việc khởi tạo một process mới từ hệ thống. Nói tóm lại, Zygote sẽ giúp app bạn khởi động nhanh hơn rất nhiều.

Bước 2: Android convert code của chúng ta từ .dex sang native OAT

Sau khi process của app đã được fork từ Zygote, ta bắt đầu cần phải load những class cần dùng riêng của app. Hãy nhớ rằng, code của app được lưu tại classes.dex nằm bên trong file APK. Vì vậy, classes.dex sẽ được trích xuất từ file APK và được copy sang một địa chỉ mới.

Sau khi copy classes.dex, Android sẽ convert Dalvik byte-codes trong classes.dex sang native machine code.

Tất cả dòng code java sẽ được convert sang native code. classes.dex sẽ được convert sang ELF shared object. Android gọi chúng là OAT và tool được sử dụng để convert classes.dex được gọi là dex2oat.

File sau khi được convert sẽ được lưu tại một thư mục mới với đường dẫn như sau:

/data/dalvik-cache/x86/data@app@com.vnindie.test@base.apk@classes.dex

Package name sẽ nằm trong đường dẫn để chắc chắn rằng sẽ không bị trùng nhau.

Converted code sẽ ở trong machine code tương ứng với CPU của thiết bị Android. Ví dụ, nếu thiết bị Android là x86, OAT file sẽ trông giống như sau:

0x001db888:         85842400E0FFFF      test    eax, [esp + -8192]

suspend point dex PC: 0x0000

GC map objects:  v0 (r5), v1 (r6)

0x001db88f:                 83EC1C      sub     esp, 28

0x001db892:               896C2410      mov     [esp + 16], ebp

0x001db896:               89742414      mov     [esp + 20], esi

0x001db89a:               897C2418      mov     [esp + 24], edi

0x001db89e:                   8BF8      mov     edi, eax

0x001db8a0:                 890424      mov     [esp], eax

Bước 3: App load native library

Native library sẽ được map trực tiếp tới bộ nhớ của app process

Và từ đó, app sẽ khởi động activity và app sẽ hiển thị lên trên màn hình

Leave a Reply

Your email address will not be published. Required fields are marked *