APK → libgame.so → game
Từ một APK cũ đến game có thể chơi lại
Không có mã nguồn gốc để sử dụng. Chúng tôi lấy dữ kiện từ APK, viết lại bằng TypeScript và kiểm tra kết quả trên Cocos Creator.
Phần 1
APK cho chúng ta những gì?
Giải nén một lần để tách tài nguyên, phần Java được decompile từ package ứng dụng và thư viện native.
Cách làm
- Kiểm tra hash để chắc chắn APK không đổi.
- Chạy
scripts/inventory-apk.sh extract; script dùng JADX choclasses.dexvà táchlibgame.so. - Giữ nguyên đầu ra làm nguồn đối chiếu cho các bước sau.
jadx/resources/…
java/app-owned/PencilBlade.java
java/app-owned/R.java
native/libgame.soKết quả: 862 tài nguyên, 3 file Java được decompile từ package ứng dụng và 1 libgame.so.
Phần 2
Đọc libgame.so và nối với resource
Tìm function, hằng số và chuỗi đường dẫn; sau đó đối chiếu đường dẫn đó với tài nguyên đã tách ở Phần 1.
Cách làm
- Dùng
readelfvànm -Cđể xác định kiến trúc, symbol và địa chỉ. - Chạy
scripts/analyze-native-static.shđể lập bản đồ function, call, hằng số và string xref. - Ghép string xref với file resource cùng tên, rồi ghi hành vi thành contract có test.
0x00145538 Bomb::onEnter()
string_xref → "Bomb/bomb_X.png"
string_xref → "Sounds/boomsound.wav"Kết quả: hàm xử lý Bomb::onEnter() được nối với sprite bomb_X.png và âm thanh boomsound.wav. Cùng cách đó được dùng cho các phần còn lại.
Phần 3
Chơi thử game
Contract được viết lại bằng TypeScript, gắn với resource đã phục hồi và chạy trong Cocos Creator 3.8.8. Đây là bản phục dựng, không phải môi trường chạy gốc; bản game không nạp hay liên kết libgame.so.
Cách làm
- Mở bản Web H5.
- Bấm Chơi để tải game.
- Chọn chế độ và thử cắt trái cây.

Kết quả: bản phục dựng chạy trực tiếp trong trình duyệt và có đủ 6 chế độ chơi.