- Meta đang chuyển đổi codebase Android từ Java sang Kotlin thông qua một dự án kéo dài nhiều năm
- Hiện công ty đang quản lý một trong những codebase Android lớn nhất thế giới và đã chuyển đổi thành công hơn một nửa sang Kotlin
- Meta đã áp dụng chiến lược phát triển Kotlin-first từ năm 2020
- Lý do chuyển đổi toàn bộ mã nguồn:
- Để tận dụng tối đa lợi ích của Kotlin về "nâng cao năng suất" và "an toàn với null", Meta đã quyết định chuyển đổi cả 10 triệu dòng mã Java hiện có
- Tăng cường an toàn với null và giải quyết các vấn đề của codebase hỗn hợp
- Biên dịch hỗn hợp (biên dịch đồng thời Java và Kotlin) làm tốc độ build chậm nhất
- Phần mã Java còn lại gây ra vấn đề an toàn với null: mã Java không an toàn với null có thể trở thành nguyên nhân tiềm ẩn của NullPointerException (NPE) trong đồ thị phụ thuộc
- Kotlin đảm bảo an toàn với null bằng kiểm tra lúc runtime
Quy trình tự động hóa
- Ban đầu, nhóm đã chạy lặp đi lặp lại công cụ chuyển đổi J2K của IDE Intellij
- Với codebase quy mô lớn của Meta, việc này đòi hỏi hơn 100.000 lần nhấp chuột, mỗi lần chạy mất vài phút
- Kết quả là cách này kém hiệu quả do thiếu khả năng mở rộng
- Đã phát triển công cụ tự động hóa: Kotlinator
- Quy trình chuyển đổi gồm 6 bước
- Deep Build: build mã cần chuyển đổi để IDE có thể phân giải mọi symbol. Bao gồm dependency bên thứ ba và mã được sinh tự động
- Preprocessing: dựa trên công cụ tùy biến Editus của Meta. Bao gồm khoảng 50 bước như xử lý an toàn với null, xử lý phụ thuộc và các workaround cho J2K
- Headless J2K: chỉnh sửa J2K để có thể chạy trong môi trường server
- Postprocessing: khoảng 150 bước như thay đổi dành riêng cho Android, an toàn với null và áp dụng style Kotlin
- Linters: liên tục nâng cao chất lượng chuyển đổi thông qua tự động sửa lỗi
- Build Error-based Fixes: phân tích lỗi build để áp dụng thêm các sửa đổi
Biến J2K thành headless
- Chỉnh sửa để J2K có thể chạy từ xa:
- J2K gắn chặt với IDE Intellij nên rất khó chạy độc lập
- Ban đầu nhóm cân nhắc chạy nó bằng môi trường test của Intellij, nhưng sau khi trao đổi với chuyên gia J2K của JetBrains (Ilya Kirillov), họ chuyển sang cách kiểm tra headless
- Nhóm tạo một plugin Intellij, mở rộng lớp
ApplicationStarter và triển khai bằng cách gọi lớp JavaToKotlinConverter của J2K
- Ưu điểm của cách headless
- Giải quyết vấn đề IDE cục bộ: lập trình viên không cần trực tiếp bấm nút trong IDE
- Chuyển đổi đồng thời nhiều tệp: có thể xử lý khối lượng tệp lớn
- Giảm thời gian tiêu tốn: thời gian chuyển đổi tự thân tăng lên khoảng 30 phút, nhưng thời gian mà lập trình viên phải bỏ ra giảm mạnh
- Hỗ trợ build và sửa lỗi: có thể tự động chạy từ xa các bước hữu ích nhưng tốn thời gian (sửa sau khi build)
- Tự động hóa và code review
- Sử dụng hệ thống nội bộ của Meta để tạo batch job hằng ngày:
- Tạo diffs theo lô dựa trên tiêu chí tùy chỉnh (phiên bản pull request của Meta)
- Tự động gán reviewer, chạy test và xác minh, sau đó triển khai diff đã được phê duyệt cuối cùng
- Cung cấp web UI: lập trình viên có thể kích hoạt từ xa việc chuyển đổi một tệp hoặc module cụ thể
- Xác định thứ tự chuyển đổi
- Không ép buộc một thứ tự cụ thể:
- Ưu tiên xử lý các tệp đang được phát triển tích cực
- Kotlinator tự động xử lý đồ thị phụ thuộc để giải quyết vấn đề tương thích của các tệp bên ngoài
- Ví dụ: tự động cập nhật
foo.getName() thành foo.name
Khác
- Bổ sung các bước Preprocessing tùy biến (Java->Java) và Postprocessing (Kotlin->Kotlin)
- Nâng cao chất lượng chuyển đổi bằng công cụ nội bộ Editus của Meta và thư viện PSI của JetBrains
- Nullsafe và NullAway
Hiện tại và tương lai của việc chuyển đổi sang Kotlin
- Hơn một nửa mã Java cho Android của Meta đã được chuyển sang Kotlin (hoặc một phần mã đã bị xóa)
- Tuy nhiên, một nửa dễ hơn đã xong:
- Phần việc còn lại phức tạp và quy mô lớn
- Để có chuyển đổi hoàn toàn tự động, cần bổ sung các bước tùy biến hoặc đóng góp cải tiến cho J2K
- Với chuyển đổi bán tự động, mục tiêu là cải thiện Kotlinator để việc triển khai mượt mà và an toàn hơn
- Meta cho rằng các công ty khác cũng có thể đang gặp những vấn đề tương tự khi chuyển đổi mã Android
- Meta chia sẻ giải pháp mà họ thu được trong quá trình cải thiện và tối ưu công cụ chuyển đổi
- Đề xuất hợp tác:
- Thảo luận với các nhà phát triển khác trong kênh #j2k trên Kotlinlang Slack
- Chia sẻ các trường hợp và giải pháp của nhau để xây dựng trải nghiệm chuyển đổi tốt hơn
Chưa có bình luận nào.