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

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Android Studio bao gồm 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 APK hoặc Android App Bundle của bạn sau khi quá trình xây dựng hoàn tất. Khi sử dụng Công cụ phân tích APK, bạn có thể giảm thời gian khắc phục các vấn đề với tệp DEX và tài nguyên trong ứng dụng, đồng thời giảm kích thước APK của bạn. Giờ đây, bạn có thể sử dụng công cụ này trong dòng lệnh bằng apkanalyzer.

Với Công cụ phân tích APK, bạn có thể hoàn thành những việc sau:

  • 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 2 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 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 góc nhìn Project (Dự án) trong cửa sổ Project (Dự án), sau đó nhấp đúp vào APK trong thư mục build/output/apks/ mặc định.
  • Chọn Build > Analyze APK (Tạo > Phân tích APK) trong thanh trình đơn, rồi chọn APK hoặc gói ứng dụng

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

APK là các tệp tuân theo định dạng tệp ZIP. Công cụ phân tích APK hiển thị từng tệp hoặc thư mục dưới dạng một thực thể có sẵn chức năng mở rộng để điều hướng đế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. Kích thước tệp thô là kích thước chưa nén của thực thể trên ổ đĩa, còn Kích thước tải xuống là kích thước nén ước tính của thực thể khi được Google Play phân phối. % 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 APK mà thực thể nắm giữ.

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 bao 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 bao gồm các thư viện cũng cung cấp một tệp kê khai, thì chúng 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 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à hiển thị. Trình xem này cho phép bạn hiểu 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 cuối cùng.

Ngoài ra, trình xem này cung cấp một số khả năng tìm lỗi mã nguồn và cảnh báo hoặc lỗi 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 cho tệp kê khai đã chọn.

Hình 2. Biểu tượng lỗi xuất hiện ở lề phải cho 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 giúp bạn truy cập ngay lập tức vào thông tin cơ bản trong (các) tệp DEX trên ứng dụng của mình. Thông tin về số lớp, gói, tổng số tệp tham chiếu và số lần khai báo được cung cấp trong trình xem, để hỗ trợ việc quyết định xem có nên sử dụng multidex hay không hoặc cách loại bỏ các phần phụ thuộc để giảm xuống dưới Giới hạn DEX 64K.

Hình 3 mô tả một ứng dụng có kích thước trung bình dưới giới hạn DEX 64k. 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) tính tất cả phương thức được tệp DEX tham chiếu. Cột này thường bao gồm 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 tiêu chuẩn mà mã này sử dụng. Đây là các phương thức được tính vào giới hạn phương thức 64k 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, con số này là tập hợp con của Phương thức tham chiếu. Lưu ý rằng khi bạn đóng gói một phần phụ thuộc trong ứng dụng, thì các phương thức được xác định trong phần phụ thuộc đó sẽ thêm vào cả hai phương thức này. Ngoài ra, lưu ý rằng việc giảm thiểu và rút gọn mã cũng có thể thay đổi đáng kể nội dung của một tệp DEX sau khi biên dịch mã nguồn.

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.

Hình 4. Bộ lọc DEX được đặt 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 hiển thị tất cả 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 này chuyển sang màu xám cho đến khi bạn tải một tập hợp các tệp liên kết ProGuard để thêm chức năng vào trình xem DEX, chẳng hạn như gỡ rối mã nguồn tên (mapping.txt), hiển thị các nút đã bị xoá (usage.txt) và cho biết các nút không thể xoá (seeds.txt). Tệp liên kết ProGuard mà bạn nhập phải từ cùng một bản dựng đã tạo ra các tệp DEX khi bật tính năng rút gọn mã. Để tìm hiểu thêm, hãy xem phần Rút gọn, làm rối mã nguồn và tối ưu hoá ứng dụng.

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 tất cả 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. Các nút được khôi phục sẽ hiển thị ở dạng gạch ngang chữ.

    Để 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 thị mã byte, tìm cách sử dụng và tạo quy tắc 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 cách 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) để hiển thị trình đơn theo bối cảnh của lớp đó.

Hiển thị mã byte: Giải mã lớp, phương thức hoặc trường đã chọn và hiển thị nội dung biểu diễn mã byte smali (không phải mã Java) trong hộp thoại, như sau:

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

Tìm cách 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 (hình 7). Nếu bạn đã tải seeds.txt, các nút hiển thị ở 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. Tệp tham chiếu đến MyClass

Tạo quy tắc Proguard Keep: Hiển thị 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 dự án để ngăn xoá một gói, lớp, phương thức hoặc trường nhất định trong giai đoạn rút gọn mã (hình 8). Để 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 từ 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 thao tác xây dựng sẽ thay đổi những thực thể cuối cùng trong một ứng dụng. Ví dụ: Quy tắc rút gọn trong Proguard có thể thay đổi mã cuối cùng 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 đè. Dễ dàng xem phiên bản cuối cùng của tệp bằng Công cụ phân tích APK: Nhấp vào thực thể và bản xem trước thực thể văn bản hoặc hình ảnh xuất hiện bên dưới, như được minh hoạ trong hình 9.

Hình 9. Bản xem trước tài nguyên hình ảnh cuối cùng

Công cụ phân tích APK cũng có thể hiển thị 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. Bản 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 tại sao ứng dụng của bạn 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 (So sánh với).
  3. Trong hộp thoại chọn, hãy tìm cấu phần mềm được phát hành gần đây nhất cho người dùng của bạn và 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ác tuỳ chọn bản dựng khác nhau đượ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 APK gỡ lỗi và APK phát hành