Loại bỏ mã chết

Giới thiệu

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

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à gây xáo trộn mã byte Java. Với một jar mã byte, nếu muốn, công cụ này có thể in ra một "mức sử dụng" báo cáo liệt kê tất cả các lớp và phương thức không dùng đến trong ứng dụng của bạn. J2ObjC có thể sử dụng để 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 tối ưu hoá mà nó hoạt động tốt hơn và các báo cáo mà nó sẽ tạo. Vì J2ObjC chỉ cần biết về mã đã chết, bạn nên tắt tất cả các tính năng tối ưu hoá và ghi nhật ký không liên quan; tệp được chuyển đến J2ObjC phải chỉ 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 tệp mã byte (jar) cho ứng dụng tương ứng với tệp nguồn. Bạn có thể sử dụng tệp cấu hình sau, được sao chép từ hướng dẫn sử dụng ProGuard làm mẫu để tạo đầ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ỏ bất cứ thứ gì không nên. Nếu jar của bạn là một ứng dụng chứ không chỉ là thư viện, hãy chỉ định phương thức main() như chúng ta đã thấy được thực hiện ở đây nên giữ lại mọi thứ cần thiết; bạn có thể kiểm tra kết quả đầu ra từ ProGuard để kiểm tra tính hợp lý.

Đang chạy ProGuard

Sau khi bạn có tệp mã byte của ứng dụng và một tệp cấu hình ProGuard tuỳ chỉnh (được gọi là giả sử usage.pg), bạn có thể tạo 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. Tệp này liệt kê các lớp và phương thức không dùng đến trong ứng dụng.

Chạy J2ObjC với tính năng loại bỏ mã bị chết

Giờ đây, khi đã có báo cáo mức 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>. Bả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 Mục tiêu-C.