Phân tích APK trên thiết bị thật – workflow từ unpack đến Device Explorer (không root)
5 phút đọc02/10/2025
Về tác giả
I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information.
@#@
Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
{"success":true,"head":"<title>Phân tích APK trên thiết bị thật - workflow từ unpack đến Device Explorer (không root) - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Chi tiết cách sửa APK, bật debuggable và cài lại ứng dụng từ Play Store để truy cập database bằng Device Explorer Android Studio\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Phân tích APK trên thiết bị thật - workflow từ unpack đến Device Explorer (không root) - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Chi tiết cách sửa APK, bật debuggable và cài lại ứng dụng từ Play Store để truy cập database bằng Device Explorer Android Studio\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Android\" />\n<meta property=\"og:updated_time\" content=\"2026-08-03T16:29:29+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"repack APK\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-10-02T14:44:05+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T16:29:29+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Phân tích APK trên thiết bị thật - workflow từ unpack đến Device Explorer (không root) - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Chi tiết cách sửa APK, bật debuggable và cài lại ứng dụng từ Play Store để truy cập database bằng Device Explorer Android Studio\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Chris Pham\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"7 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\",\"url\":\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"repack APK\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/category/android/\",\"name\":\"Android\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/\",\"name\":\"Ph\\u00e2n t\\u00edch APK tr\\u00ean thi\\u1ebft b\\u1ecb th\\u1eadt – workflow t\\u1eeb unpack \\u0111\\u1ebfn Device Explorer (kh\\u00f4ng root)\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/\",\"name\":\"Ph\\u00e2n t\\u00edch APK tr\\u00ean thi\\u1ebft b\\u1ecb th\\u1eadt - workflow t\\u1eeb unpack \\u0111\\u1ebfn Device Explorer (kh\\u00f4ng root) - CyStack Tutorial\",\"datePublished\":\"2025-10-02T14:44:05+07:00\",\"dateModified\":\"2026-08-03T16:29:29+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\",\"url\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"caption\":\"Chris Pham\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"Ph\\u00e2n t\\u00edch APK tr\\u00ean thi\\u1ebft b\\u1ecb th\\u1eadt - workflow t\\u1eeb unpack \\u0111\\u1ebfn Device Explorer (kh\\u00f4ng root) - CyStack Tutorial\",\"keywords\":\"APK\",\"datePublished\":\"2025-10-02T14:44:05+07:00\",\"dateModified\":\"2026-08-03T16:29:29+07:00\",\"articleSection\":\"Android\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"Chi ti\\u1ebft c\\u00e1ch s\\u1eeda APK, b\\u1eadt debuggable v\\u00e0 c\\u00e0i l\\u1ea1i \\u1ee9ng d\\u1ee5ng t\\u1eeb Play Store \\u0111\\u1ec3 truy c\\u1eadp database b\\u1eb1ng Device Explorer Android Studio\",\"name\":\"Ph\\u00e2n t\\u00edch APK tr\\u00ean thi\\u1ebft b\\u1ecb th\\u1eadt - workflow t\\u1eeb unpack \\u0111\\u1ebfn Device Explorer (kh\\u00f4ng root) - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/02143831/phan-tich-APK.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/02/phan-tich-apk-tren-thiet-bi-that/#webpage\"}}]}</script>\n"}

Tuỳ vào từng tác vụ đặc biệt, lập trình viên cần kiểm tra nội dung của một gói. Với tôi, tôi cần xem Database của một ứng dụng trong máy. Công cụ dễ nhất là Device Explorer của Android Studio. Tuy nhiên đây là việc sảy ra khi xem thông tin đó với ứng dụng được tải về từ cửa hàng

Cụ thể:
- Công cụ Device Explorer trong Android Studio khi mở thư mục /data/data/<packageId> sẽ chạy lệnh run-as <packageId> trên thiết bị.
- Lệnh run-as chỉ hoạt động nếu app đó được kí ở debug build và trong AndroidManifest.xml có flag:
android:debuggable="true"
- Với ứng dụng từ Play Store, Google yêu cầu ứng dụng phải là release build và không cho phép debug. Vì vậy khi bạn run-as, hệ thống sẽ báo:
run-as: package not debuggable
Nói cách khác: 👉 Bạn không thể xem trực tiếp dữ liệu của ứng dụng tải từ Play Store bằng Device Explorer trừ khi:
- Bạn có root access trên thiết bị.
- Bạn repack/re-sign APK lại với
debuggable=true rồi cài lên máy.
Bài viết hướng dẫn chi tiết repack/re-sign APK với debuggable=true để bạn có thể xem package content của ứng dụng được tải về từ Play Store thông qua Device Explorer của Android Studio (hoặc một số tool tương tự khác)
Củ thể tôi sẽ lấy ví dụ với ứng dụng CleanCall.
- Tải ứng dụng CleanCall từ Google Play Store, kéo tệp APK từ điện thoại Android sang máy tính
- Giải mã file APK và thêm flag android:debuggable=”true” vào file Manifest
- Kí lại file APK mới với debug key
- Xoá ứng dụng tải về từ store. Cài APK mới vào máy
- Đăng nhập ứng dụng để tải dữ liệu về Local Database
- Vào Device Explorer tải CleanCall Database về máy
Chi tiết
Lấy file APK của ứng dụng
Sau khi tải ứng dụng CleanCall từ Google Play Store về máy. Chạy lệnh sau để lấy địa chỉ đến các file APK của ứng dụng:
adb shell pm path com.ppcaller
Có nhiều cách để tìm Package Id của ứng dụng. Cách đơn giản là tìm CleanCall trên Google Play Store web. https://play.google.com/store/apps/details?id=com.ppcaller
Lệnh này trả về đường dẫn đến các bản Split APK của ứng dụng ở trong máy Android:
package:/data/app/.../com.ppcaller-.../base.apk
package:/data/app/.../com.ppcaller-.../split_config.arm64_v8a.apk
package:/data/app/.../com.ppcaller-.../split_config.en.apk
package:/data/app/.../com.ppcaller-.../split_config.vi.apk
package:/data/app/.../com.ppcaller-.../split_config.xxhdpi.apk
Sau khi đã biết vị trí, thực hiện kéo APK về máy:
adb pull /data/app/.../com.ppcaller-.../base.apk
adb pull /data/app/.../com.ppcaller-.../split_config.arm64_v8a.apk
adb pull /data/app/.../com.ppcaller-.../split_config.en.apk
adb pull /data/app/.../com.ppcaller-.../split_config.vi.apk
adb pull /data/app/.../com.ppcaller-.../split_config.xxhdpi.apk
Vì sao có nhiều bản APK? Đây là cơ chết phân phối ứng dụng của Google Play (Android App Bundle).
base.apk: phần lõi, code chính + resource chung.
split_config.arm64_v8a.apk: chỉ chứa native libs cho chip ARM64.
split_config.en.apk: resource ngôn ngữ English.
split_config.vi.apk: resource ngôn ngữ Tiếng Việt.
split_config.xxxhdpi.apk: asset cho màn hình xxxhdpi (ảnh, layout theo density).
Vì vậy muốn thêm android:debuggable="true" vào app thì cần giải mã base.apk file và sửa AndroidManifest file.
Decode APK và thêm flag debuggable vào AndroidManifest
Decode APK:
apktool d -r base.apk -o base
apktool là một công cụ dòng lệnh cho phép bạn dịch ngược (decompile) các tệp ứng dụng Android (APK) để phân tích tài nguyên và mã nguồn, và dịch ngược (recompile) lại chúng để đóng gói, sửa đổi hoặc việt hóa mà không cần mã nguồn gốc và có thể cài trực tiếp qua Homebrew. (brew install apktool)
Lệnh này giải nén base.apk ra thư mục base . tham số -r nghĩa là chỉ giải nén resource và xml mà không dịch sang dạng có thể đọc được, nghĩa là vẫn để dạng nhị phân. Lúc này trong thư mục base có cấu trúc như thế này.
base/
├── AndroidManifest.xml (giải nén thành binary XML)
├── smali/ (chứa code Smali)
├── res/ (resource binary XML)
├── original/ (metadata về APK gốc)
└── apktool.yml (cấu hình cho rebuild lại bằng apktool b)
Lúc này để sửa file AndroidManifest với cờ debuggable=true, ta dùng tool ManifestEditor (https://github.com/WindySha/ManifestEditor).
java -jar ../../ManifestEditor.jar base/AndroidManifest.xml -d 1
rm base/AndroidManifest.xml
mv base/AndroidManifest-new.xml base/AndroidManifest.xml
Lệnh này tạo ra một file AndroidManifest-new.xml mới trong thư mục base đã bật tính năng debug. Sau đó thực hiện xoá file cũ và sửa tên file mới.
Sau khi sửa file Manifest, ta cần build lại thư mục base thành file APK:
apktool b base
Lệnh này sẽ tạo file base.apk tại base/dist/base.apk.
Kí file APK mới và cài đặt lại vào Android Device
Phần này sử dụng zipalign và apksigner . Đây là 2 build-tool của Android SDK. Được cài sẵn khi các bạn phát triển ứng dụng android. Nó nằm ở ~/Library/Android/sdk/build-tools/{version} . Bài viết này sử dụng version 35.0.0.
Trước khi kí, ta cần align lại APK.
~/Library/Android/sdk/build-tools/35.0.0/zipalign -v 4 base/dist/base.apk app-aligned.apk
Sau đó thực hiện kí lại bản base APK đã được aligned. Ở đây tôi sử dụng debug.keystore với mật khẩu là android. (Có thể tạo mới nếu chưa có)
~/Library/Android/sdk/build-tools/35.0.0/apksigner sign --ks ../../debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android --out base-signed.apk app-aligned.apk
~/Library/Android/sdk/build-tools/35.0.0/apksigner sign --ks ../../debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android --out split_config.arm64_v8a-signed.apk split_config.arm64_v8a.apk
~/Library/Android/sdk/build-tools/35.0.0/apksigner sign --ks ../../debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android --out split_config.en-signed.apk split_config.en.apk
~/Library/Android/sdk/build-tools/35.0.0/apksigner sign --ks ../../debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android --out split_config.vi-signed.apk split_config.vi.apk
~/Library/Android/sdk/build-tools/35.0.0/apksigner sign --ks ../../debug.keystore --ks-key-alias androiddebugkey --ks-pass pass:android --key-pass pass:android --out split_config.xxxhdpi-signed.apk split_config.xxxhdpi.apk
Sau khi kí các APK, cài lại vào máy điện thoại bằng lệnh. Trước khi cài cần xoá ứng dụng được tải từ Store.
adb install-multiple base-signed.apk split_config.arm64_v8a-signed.apk split_config.en-signed.apk split_config.vi-signed.apk split_config.xxxhdpi-signed.apk
Sau khi đăng nhập vào app, ta có thể lấy được local database. Nơi chứ các số điện thoại scam.


Các lỗi phổ biến
Failure: INSTALL_FAILED_MISSING_SPLIT
Mặc dù ta chỉ sửa file Manifest trong file base.apk. Nhưng khi install chúng ta cần install tất cả các split APK khác.
Failure: INSTALL_FAILED_UPDATE_INCOMPATIBLE or INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
Đây là lỗi sảy ra khi bản kéo các bản split APK về. sửa file manifest của base.apk. sau đó chỉ kí lại base APK mà không kí lại các Split APK khác.
Resources$NotFoundException
Lỗi compile resource của apktool khi build lại app có thể bị mất một số resource gốc, đặc biệt là file trong res/ (drawable, xml) hoặc aapt2 không build chuẩn như Gradle.
Ví dụ: res/drawable/rn_edit_text_material.xml bị thiếu hoặc bị chuyển sang dạng khác. hoặc Resource ID mapping thay đổi Khi recompile, apktool generate lại R.java → ID có thể không map đúng file.
Vì vậy khi decode chúng ta thêm -r flag vào để dữ nguyên resource ở dạng binary. Sử dụng tool ManifestEditor
Exception occurred while executing ‘install-incremental’
Đây là lỗi do Android Studio/ADB đang cố gắng cài app theo kiểu incremental install (chỉ copy file thay đổi vào emulator/device để build nhanh hơn). Vì vậy cần xoá app được tải về từ store trước. Sau đó mới install app đã sửa sau.