Tính tương thích và phạm vi bảo vệ
P4JX sẽ mã hóa các phương thức triển khai của lớp được bảo vệ và chỉ cho phép VLX JRE đi kèm với gói phần mềm đọc chúng trong lúc chạy. Để cân bằng giữa hiệu quả bảo vệ và tính tương thích với framework, nên chỉ bảo vệ các phần triển khai nghiệp vụ cốt lõi; các điểm vào framework, DTO/thực thể, các lớp cần được framework tạo hoặc sửa đổi động, cùng các phụ thuộc từ bên thứ ba không nên được bảo vệ.
1. Chạy quét tính tương thích trước
Chỉ quét, không xuất kết quả:
p4j javaapp app.jar --compat-scan
p4j springboot app.jar --compat-scan
p4j tomcat app.war --compat-scan
Quét và áp dụng các khuyến nghị thận trọng:
p4j springboot app.jar dist --compat-apply
Các tùy chọn do người dùng chỉ định sẽ có ưu tiên hơn các khuyến nghị tự động. Việc quét là phân tích heuristic tĩnh; báo cáo “Cần tiến hành kiểm tra lại.” không có nghĩa là việc áp dụng chắc chắn sẽ thất bại; báo cáo không có vấn đề cũng không thể thay thế việc kiểm thử lại trên nền tảng mục tiêu.
Khi kết quả quét yêu cầu sửa đổi mã nguồn
Nếu báo cáo GUI hiển thị Cần thực hiện thao tác. (giao diện tiếng Anh là ACTION REQUIRED), điều đó có nghĩa là: Người dùng phải sửa đổi mã nguồn của ứng dụng.; những vấn đề loại này không thể được giải quyết bằng cách điều chỉnh các tham số đóng gói. Báo cáo sẽ liệt kê các lớp và phương thức cần sửa đổi, đồng thời đưa ra các khuyến nghị xử lý tương ứng.
- Đọc ZIP/JAR từ bộ nhớ:Hãy thay đổi
ByteArrayInputStreamthành các phương thức đọc dữ liệu dựa trên tệp nhưFiles.newInputStream(Path),FileInputStream,ZipFilehoặcJarFile. - Định nghĩa lớp từ byte gốc:Không nên gọi trực tiếp
ClassLoader#defineClassđối với các lớp được bảo vệ, hãy sử dụngClass.forName()hoặcClassLoader.loadClass()thay thế để cho phép P4JX thực hiện việc tải lớp khi chương trình đang chạy.
Sau khi chỉnh sửa mã nguồn, hãy xây dựng lại tệp JAR/WAR và tiến hành quét khả năng tương thích một lần nữa; chỉ khi báo cáo không còn liệt kê vấn đề đó nữa thì mới tạo ra gói bảo vệ.
2. Mô hình bảo vệ được khuyến nghị
Đầu vào biên giới/cơ sở hạ tầng công khai → facade thông thường hoặc giao diện → Phần triển khai lõi được bảo vệ
Ví dụ:
--protect 'com.example.service.impl.**' \
--exclude 'com.example.dto.**,com.example.config.**'
3. Các lớp thường không nên được bảo vệ
- Controller, Servlet, Filter, Listener, Advice;
- Các đối tượng được tăng cường bằng Spring Configuration, AOT/CGLIB;
- Các mô hình serialization như Jackson DTO, record, JPA Entity;
- Các lớp kết nối kiểu JNI/SWT/native;
- Các lớp được viết lại hoặc định nghĩa lại bởi Agent, ORM, Mock, hot reload hoặc ClassLoader tùy chỉnh;
- Các framework bên thứ ba và các phụ thuộc mã nguồn mở;
- Các lớp cần đọc mã bytecode class thực sự của chính nó.
4. Các tính năng JVM không được hỗ trợ hoặc bị hạn chế
Môi trường chạy
- Các ứng dụng được bảo vệ phải sử dụng VLX JRE đi kèm gói phần mềm;
- Không hỗ trợ cách khởi động theo JPMS
-mvà cách khởi động từ mã nguồn đơn tập tin; - Các tập tin JAR thông thường trongclasspath phải được trình đóng gói đăng ký, không thể tự ý thêm vào khi triển khai;
- Không nên sử dụng VLX JRE để chạy các ứng dụng thông thường chưa được bảo vệ.
Gỡ lỗi và Agent
- Không hỗ trợ các công cụ gỡ lỗi JVMTI, JDWP, công cụ phân tích hiệu suất, công cụ đo tỷ lệ phủ lớp mã và hầu hết các agent APM;
- Không hỗ trợ
-javaagent,-agentlib, chức năng tải lại nhiệt và việc định nghĩa lại lớp; - Các thao tác cần việc dệt mã bytecode phải được thực hiện trước khi mã hóa.
Tối ưu hóa khi khởi động
- Không hỗ trợ CDS, AppCDS và AOT;
- ZGC và ShenandoahGC nằm ngoài phạm vi hỗ trợ tại thời gian chạy P4JX.
5. Tài nguyên lớp và trình quét
Khi đọc tài nguyên .class của các lớp được bảo vệ, người dùng chỉ nhận được dữ liệu siêu dữ liệu: giữ nguyên tên lớp, chữ ký và ghi chú, nhưng không bao gồm thân phương thức thực tế.
- Phương thức phản xạ thông thường có thể đọc siêu dữ liệu, nhưng không thể khôi phục mã byte gốc;
- Các công cụ tự phân tích tập tin ZIP vật lý mặc định sẽ không thể hiển thị nội dung của P4JX; có thể thử sử dụng
--zip-overlay scanner; - Các trình quét classpath như ClassGraph, Reflections có thể cần đến
--layout fattrong môi trường Spring Boot; - Việc phân tích P4JX từ bộ nhớ hoặc luồng mạng bằng
ZipInputStream/JarInputStreamkhông được hỗ trợ; - Giao diện zipfs chỉ có chế độ đọc, không thể chỉnh sửa tập tin nén.
6. Hành vi lưu trữ
- Phần mở rộng
.jarkhông đồng nghĩa với tập tin JAR thông thường; nội dung vẫn là P4JX; - Tập tin JAR Multi-Release sẽ được giải nén tùy theo phiên bản Java mục tiêu khi mã hóa;
- Chữ ký và thông tin chứng chỉ của tập tin JAR gốc sẽ không được giữ nguyên; khi cần thiết, phải thực hiện việc ký số cho sản phẩm cuối cùng ở bên ngoài;
- Không được sửa đổi, nén lại hoặc kết hợp các tập tin P4JX được tạo ra.