Phân tích bản dựng bằng Công cụ phân tích APK

Android Studio có một Công cụ phân tích APK cung cấp thông tin chi tiết ngay lập tức về thành phần của tệp APK hoặc Android App Bundle của bạn sau khi quá trình xây dựng hoàn tất. Bằng cách sử dụng Công cụ phân tích APK, bạn có thể làm giảm thời gian khắc phục vấn đề với tệp DEX và tài nguyên trong ứng dụng, đồng thời làm giảm kích thước tệp APK của mình. Bạn cũng có thể sử dụng Công cụ phân tích APK qua dòng lệnh bằng apkanalyzer.


Với Công cụ phân tích APK, bạn có thể:

  • Xem kích thước tuyệt đối và tương đối của các tệp trong ứng dụng, chẳng hạn như tệp DEX và tệp tài nguyên Android.
  • Tìm hiểu thành phần của tệp DEX.
  • Xem nhanh các phiên bản cuối cùng của tệp trong ứng dụng này, chẳng hạn như tệp AndroidManifest.xml.
  • Tiến hành so sánh song song 2 tệp APK hoặc gói ứng dụng.

Có 3 cách để truy cập vào Công cụ phân tích APK khi một dự án đang mở:

  • Kéo một tệp APK hoặc gói ứng dụng vào cửa sổ Editor (Trình chỉnh sửa) của Android Studio.
  • Chuyển sang chế độ xem Project (Dự án) trong cửa sổ Project (Dự án), sau đó nhấp đúp vào tệp APK đó trong thư mục build/output/apks/ mặc định.
  • Chọn Build > Analyze APK (Tạo > Phân tích tệp APK) trên thanh trình đơn, rồi chọn tệp APK hoặc gói ứng dụng của bạn.

Xem thông tin về tệp và kích thước

APK là các tệp tuân theo định dạng tệp ZIP. Công cụ phân tích APK cho thấy từng tệp hoặc thư mục dưới dạng một thực thể mà bạn có thể mở rộng để chuyển đến các thư mục. Hệ thống phân cấp của các thực thể phản ánh cấu trúc của các tệp và thư mục trong tệp APK.

Công cụ phân tích APK cho biết các giá trị kích thước tệp thô và kích thước tệp tải xuống cho từng thực thể, như minh hoạ trong hình 1. Raw File Size (Kích thước tệp thô) thể hiện kích thước chưa nén của thực thể trên ổ đĩa. Download Size (Kích thước tải xuống) thể hiện kích thước nén ước tính của thực thể khi phân phối qua Google Play. % of Total Download Size (% Tổng kích thước tải xuống) cho biết tỷ lệ phần trăm trong tổng kích thước tải xuống của tệp APK mà thực thể đó đại diện.

Hình 1. Kích thước tệp trong Công cụ phân tích APK.

Xem tệp AndroidManifest.xml

Nếu dự án của bạn gồm nhiều tệp AndroidManifest.xml (chẳng hạn như cho các phiên bản sản phẩm) hoặc gồm các thư viện cũng cung cấp một tệp kê khai, thì các tệp đó sẽ được hợp nhất thành một tệp duy nhất trong ứng dụng của bạn. Tệp kê khai này thường là tệp nhị phân trong tệp APK hoặc gói ứng dụng; nhưng khi được chọn trong Công cụ phân tích APK, biểu mẫu XML của thực thể này sẽ được tạo lại và trình bày.

Trình xem này giúp bạn nắm được mọi thay đổi có thể đã được thực hiện với ứng dụng của mình trong quá trình xây dựng. Ví dụ: bạn có thể thấy tệp AndroidManifest.xml trong thư viện chứa ứng dụng của bạn được hợp nhất vào tệp AndroidManifest.xml hoàn thiện.

Ngoài ra, trình xem này cũng cung cấp một số tính năng tìm lỗi mã nguồn. Cảnh báo hoặc lỗi sẽ xuất hiện ở góc trên cùng bên phải. Hình 2 minh hoạ một lỗi đang được báo cáo đối với tệp kê khai đã chọn.

Hình 2. Biểu tượng lỗi sẽ xuất hiện ở trên cùng bên phải đối với tệp kê khai đã chọn.

Xem tệp DEX

Trình xem tệp DEX của Công cụ phân tích APK cho phép bạn truy cập ngay vào thông tin cơ bản trong (các) tệp DEX trong ứng dụng của mình. Trình xem này cung cấp các lớp, gói, tổng số tệp tham chiếu và số lượng nội dung khai báo để giúp bạn quyết định sẽ sử dụng Multidex hay xoá các phần phụ thuộc để không vượt quá giới hạn 64K đối với tệp DEX.

Hình 3 cho thấy một ứng dụng có kích thước trung bình dưới giới hạn 64k đối với tệp DEX. Mỗi gói, lớp và phương thức bên trong tệp DEX sẽ được liệt kê số lượng trong cột Defined Method (Phương thức đã xác định) và Referenced Methods (Phương thức tham chiếu).

Cột Referenced Methods (Phương thức tham chiếu) sẽ đếm tất cả phương thức mà tệp DEX tham chiếu đến. Trong đó thường có các phương thức được xác định trong mã, thư viện phần phụ thuộc và các phương thức được xác định trong các gói Java và Android chuẩn mà đoạn mã sử dụng. Đây là các phương thức được tính vào giới hạn 64K đối với phương thức trong mỗi tệp DEX.

Cột Defined Methods (Phương thức đã xác định) chỉ tính các phương thức được xác định trong một trong các tệp DEX của bạn. Vì vậy, số phương thức này là tập hợp con của số phương thức trong Phương thức tham chiếu.

Hình 3. Ứng dụng có kích thước trung bình.

Lọc chế độ xem dạng cây cho tệp DEX

Ngay phía trên danh sách Class (Lớp), Công cụ phân tích APK cung cấp các bộ lọc để xem nội dung của tệp DEX đã chọn, như minh họa trong hình 4.

Hình 4. Bộ lọc DEX được thiết lập thành các trường và phương thức hiển thị cho BuildConfig.

Để sử dụng các bộ lọc nhằm cho thấy mọi phương thức và trường bên trong một lớp, hãy làm như sau:

  1. Trong danh sách File (Tệp), hãy chọn tệp classes.dex.
  2. Trong danh sách Class (Lớp), hãy chuyển đến và chọn một lớp.
  3. Mở rộng lớp mà bạn đã chọn.
  4. Bật/tắt Show fields (Hiện trường) để hiện hoặc ẩn các trường lớp.
  5. Bật/tắt Show methods (Hiện phương thức) để hiện hoặc ẩn các phương thức lớp.
  6. Bật/tắt Show all referenced methods or fields (Hiện tất cả trường hoặc phương thức tham chiếu) để hiện hoặc ẩn các gói, lớp, phương thức và trường đã tham chiếu.

    Trong chế độ xem dạng cây, các nút in nghiêng là các tệp tham chiếu không có định nghĩa trong tệp DEX đã chọn. Một tệp DEX có thể tham chiếu các phương thức và trường đã được xác định trong một tệp khác. Ví dụ: System.out.println() là tệp tham chiếu đến phương thức println() trong khung Android.

Tải tệp liên kết ProGuard

Bên cạnh các biểu tượng lọc là biểu tượng liên kết ProGuard. Các biểu tượng ProGuard sẽ chuyển sang màu xám cho đến khi bạn tải một tập hợp các tệp ánh xạ ProGuard để thêm chức năng vào trình xem DEX, chẳng hạn như gỡ rối mã nguồn các tên (mapping.txt), hiện những nút đã bị xoá (usage.txt) và chỉ ra các nút không xoá được (seeds.txt).

Tệp ánh xạ ProGuard mà bạn nhập phải xuất phát từ cùng một bản dựng đã tạo tệp DEX có bật tính năng rút gọn mã.

Hình 5. Tải tệp liên kết ProGuard...

Để tải tệp liên kết ProGuard, hãy làm như sau:

  1. Nhấp vào Load Proguard Mappings (Tải tệp liên kết ProGuard).
  2. Chuyển đến thư mục dự án chứa tệp liên kết và tải mọi tệp, mọi cách kết hợp tệp hoặc thư mục chứa tệp đó.

    Các tệp liên kết thường nằm trong project/app/build/outputs/mappings/release/. Bộ chọn tệp sẽ mặc định là thư mục release (phát hành) nếu thư mục này phát hiện cấu trúc dự án này.

    Trước tiên, bộ chọn tệp sẽ kiểm tra những tên tệp khớp chính xác với mapping.txt, seeds.txtusage.txt. Tiếp theo, bộ chọn tệp sẽ kiểm tra các tên tệp có chứa văn bản mapping, usage hoặc seeds ở một nơi nào đó và kết thúc bằng .txt. Ví dụ: release-seeds-1.10.15.txt là một kết quả phù hợp.

Danh sách sau đây mô tả các tệp liên kết:

  • seeds.txt: Các nút mà cấu hình ProGuard giúp không bị xoá trong quá trình rút gọn sẽ được in đậm.
  • mapping.txt: Bật Deobfuscate names (Gỡ rối mã nguồn tên) để bạn có thể khôi phục tên gốc của các nút đã bị R8 làm rối mã nguồn. Ví dụ: bạn có thể khôi phục tên nút bị làm rối mã nguồn như a, b, c thành MyClass, MainActivitymyMethod().
  • usage.txt: Bật Show removed nodes (Hiện các nút đã xoá) để bạn có thể hiển thị các lớp, phương thức và trường đã bị R8 xoá trong quá trình rút gọn. Bạn sẽ thấy các nút được khôi phục sẽ ở dạng chữ bị gạch ngang.

    Để biết thêm thông tin về cách sử dụng R8 để làm rối mã nguồn và giảm thiểu mã của bạn, hãy xem bài viết Rút gọn, làm rối mã nguồn và tối ưu hoá ứng dụng.

Hiện mã byte, tìm cách sử dụng và tạo quy tắc lưu giữ (Keep)

Các nút trong chế độ xem danh sách Class (Lớp) có một trình đơn theo bối cảnh với các tuỳ chọn sau đây cho phép bạn xem mã byte, tìm hiểu cách thức sử dụng và hiển thị một hộp thoại có các quy tắc ProGuard mà bạn có thể sao chép và dán cho nút đã chọn. Nhấp chuột phải vào nút bất kỳ trong chế độ xem danh sách Class (Lớp) để làm xuất hiện trình đơn theo bối cảnh của lớp đó.

Hiện mã byte: Biên dịch ngược lớp, phương thức hoặc trường đã chọn và cho thấy nội dung biểu diễn mã byte smali trong một hộp thoại, như sau:

Hình 6. Mã byte DEX cho phương thức init.

Tìm hiểu cách thức sử dụng: Cho biết các phần khác của mã DEX có tệp tham chiếu đến lớp hoặc phương thức đã chọn, như trong hình 7. Nếu bạn đã tải seeds.txt, các nút được trình bày ở dạng in đậm cho biết cấu hình Proguard giúp nút không bị xoá trong quá trình rút gọn:

Hình 7. Tham chiếu đến MyClass.

Tạo quy tắc lưu giữ Proguard (Proguard Keep): Cho thấy các quy tắc ProGuard mà bạn có thể sao chép và dán vào tệp cấu hình ProGuard của dự án, như trong hình 8. Quy tắc này giúp lưu giữ một gói, lớp, phương thức hoặc trường nhất định không bị xoá trong giai đoạn rút gọn mã. Để biết thêm thông tin, hãy xem bài viết Tuỳ chỉnh mã cần giữ lại.

Hình 8. Các quy tắc Proguard mà bạn có thể sao chép qua hộp thoại vào tệp cấu hình Proguard.

Xem các thực thể mã và tài nguyên

Nhiều tác vụ xây dựng sẽ thay đổi những thực thể hoàn thiện trong một ứng dụng. Ví dụ: Quy tắc rút gọn trong Proguard có thể thay đổi đoạn mã hoàn thiện của bạn và các tài nguyên hình ảnh có thể bị các tài nguyên trong một phiên bản sản phẩm ghi đè.

Để xem phiên bản hoàn thiện của tệp bằng Công cụ phân tích APK, hãy nhấp vào thực thể để xem trước thực thể đó dưới dạng văn bản hoặc hình ảnh, như trong hình 9.

Hình 9. Bản xem trước tài nguyên hình ảnh hoàn thiện.

Công cụ phân tích APK cũng có thể cho thấy nhiều tệp văn bản và tệp nhị phân. Ví dụ: trình xem thực thể resources.arsc cho phép bạn xem các giá trị theo cấu hình cụ thể, chẳng hạn như các bản dịch ngôn ngữ cho một tài nguyên chuỗi. Trong hình 10, bạn có thể thấy các bản dịch cho mỗi tài nguyên chuỗi.

Hình 10. Xem trước các tài nguyên chuỗi đã dịch.

So sánh tệp

Công cụ phân tích APK có thể so sánh kích thước của các thực thể trong 2 tệp APK hoặc gói ứng dụng khác nhau. Điều này rất hữu ích khi bạn cần hiểu lý do khiến ứng dụng của mình tăng kích thước so với bản phát hành trước.

Trước khi phát hành một ứng dụng cập nhật, hãy làm như sau:

  1. Tải phiên bản ứng dụng mà bạn sắp phát hành vào Công cụ phân tích APK.
  2. Ở góc trên cùng bên phải của Công cụ phân tích APK, hãy nhấp vào Compare with previous APK... (So sánh với tệp APK… trước đó).
  3. Trong hộp thoại chọn, hãy tìm cấu phần phần mềm được phát hành gần đây nhất cho người dùng của bạn rồi nhấp vào OK.

    Hộp thoại tương tự như hộp thoại trong hình 11 sẽ xuất hiện để giúp bạn đánh giá tác động có thể có của bản cập nhật đối với người dùng.

Hình 11 cho thấy sự khác biệt giữa các bản gỡ lỗi và bản phát hành của một ứng dụng cụ thể. Có nhiều tuỳ chọn xây dựng được sử dụng giữa các loại bản dựng này, thay đổi theo các thực thể cơ bản.

Hình 11. Sự khác biệt giữa tệp APK gỡ lỗi và tệp APK phát hành.