Loại bỏ mã chết

Giới thiệu

Tệp mã nguồn của ứng dụng Java có thể chứa một số lượng lớn tệp nguồn hoàn toàn không dùng đến hoặc chỉ được đưa vào một vài phương thức. Việc dịch mã đã chết này sang Objective-C sẽ làm ứng dụng iOS của bạn bị phồng lên một cách không cần thiết và làm tăng khả năng gặp lỗi dịch, đặc biệt là khi một trong các thư viện Java của bạn sử dụng các tính năng không được trình biên dịch J2ObjC hỗ trợ.

ProGuard là một công cụ nguồn mở giúp bạn rút gọn, làm rối mã nguồn và xử lý mã byte Java. Nếu được phân phát một khoảng mã byte, công cụ này có thể in báo cáo "mức sử dụng" liệt kê mọi lớp và phương thức không dùng đến trong ứng dụng (không bắt buộc). J2ObjC có thể sử dụng báo cáo như vậy để bỏ qua các lớp và phương thức này trong quá trình dịch.

Bạn có thể tải ProGuard xuống tại đây.

Định cấu hình ProGuard

ProGuard chấp nhận tệp cấu hình làm đối số dòng lệnh để chỉ định các hoạt động tối ưu hoá mà công cụ này sẽ thực hiện và các báo cáo mà công cụ này sẽ tạo. Vì J2ObjC chỉ cần biết về mã không hoạt động, nên bạn nên tắt mọi tính năng tối ưu hoá và ghi nhật ký không liên quan; tệp chuyển đến J2ObjC chỉ nên bao gồm văn bản tiêu đề ProGuard và báo cáo sử dụng.

Trước tiên, hãy đảm bảo rằng bạn có một nhóm mã byte cho ứng dụng tương ứng với nhóm nguồn. Bạn có thể sử dụng tệp cấu hình sau đây (được sao chép từ hướng dẫn sử dụng ProGuard) làm mẫu để tạo ra đầu ra mà J2ObjC mong đợi:

-injars app-bin.jar
-libraryjars /lib/rt.jar

-dontoptimize
-dontobfuscate
-dontpreverify
-printusage
-dontnote

-keep public class com.foo.app.Main {
    public static void main(java.lang.String[]);
}

-keepclassmembers class * {
    static final % *;
    static final java.lang.String *;
}

Sửa đổi tệp cấu hình này để đảm bảo rằng ProGuard không loại bỏ những cấu hình không nên. Nếu tệp jar của bạn là một ứng dụng chứ không chỉ là thư viện, thì việc chỉ định phương thức main() như chúng tôi đã làm ở đây sẽ giữ lại mọi thứ cần thiết; bạn có thể kiểm tra đầu ra từ ProGuard để kiểm tra tính ổn định.

Chạy ProGuard

Sau khi có tệp mã byte của ứng dụng và tệp cấu hình ProGuard tuỳ chỉnh (chẳng hạn như usage.pg), bạn có thể tạo một tệp báo cáo sử dụng bằng lệnh sau:

java -jar proguard.jar @usage.pg > usage.log

Thao tác này sẽ tạo một tệp có tên là usage.log liệt kê các lớp và phương thức không dùng đến của ứng dụng.

Chạy J2ObjC bằng tính năng loại bỏ mã đã chết

Bây giờ, khi đã có báo cáo sử dụng ProGuard, bạn có thể bật giai đoạn loại bỏ mã đã chết trong J2ObjC bằng cách sử dụng cờ dòng lệnh --dead-code-report <file>. Giai đoạn dịch DeadCodeEliminator sẽ sử dụng báo cáo sử dụng để xoá mã chết khỏi từng tệp nguồn trước khi dịch sang Objective-C.