Jack là một chuỗi công cụ Android đã biên dịch mã nguồn Java thành mã bytecode dex của Android. Bạn không cần phải làm bất cứ điều gì khác để sử dụng Jack — chỉ cần sử dụng các lệnh makefile chuẩn của bạn để biên dịch cây hoặc dự án của bạn. Android 8.1 là phiên bản cuối cùng sử dụng Jack.
Về Jack
Jack hoạt động như trong Hình 1.

Định dạng thư viện Jack
Jack có định dạng tệp .jack
riêng chứa mã dex được biên dịch trước cho thư viện, cho phép biên dịch nhanh hơn (pre-dex).

Jill
Công cụ Jill dịch các thư viện .jar
hiện có sang định dạng thư viện mới, như được hiển thị bên dưới.

.jar
hiện cóMáy chủ biên dịch Jack
Lần đầu tiên sử dụng Jack, nó sẽ khởi chạy một máy chủ biên dịch Jack cục bộ trên máy tính của bạn. Máy chủ này:
- Mang lại tốc độ tăng nội tại vì nó tránh khởi chạy JRE JVM máy chủ mới, tải mã Jack, khởi tạo Jack và khởi động JIT ở mỗi lần biên dịch. Nó cũng cung cấp thời gian biên dịch rất tốt trong quá trình biên dịch nhỏ (ví dụ: ở chế độ tăng dần).
- Là một giải pháp ngắn hạn để kiểm soát số lượng Jack biên dịch song song. Máy chủ tránh làm quá tải máy tính của bạn (vấn đề về bộ nhớ hoặc đĩa) vì nó giới hạn số lượng biên dịch song song.
Máy chủ Jack tự tắt sau một thời gian nhàn rỗi mà không có bất kỳ quá trình biên dịch nào. Nó sử dụng hai cổng TCP trên giao diện localhost và không có sẵn bên ngoài. Tất cả các tham số (số lần biên dịch song song, thời gian chờ, số cổng, v.v.) có thể được sửa đổi bằng cách chỉnh sửa tệp $HOME/.jack
.
Tệp $ HOME / .jack
Tệp $HOME/.jack
chứa các cài đặt sau cho các biến máy chủ Jack theo cú pháp bash đầy đủ:
-
SERVER=true
cho phép tính năng máy chủ của Jack. -
SERVER_PORT_SERVICE=8072
đặt số cổng TCP của máy chủ cho mục đích biên dịch. -
SERVER_PORT_ADMIN=8073
đặt số cổng TCP của máy chủ cho mục đích quản trị. -
SERVER_COUNT=1
không được sử dụng. -
SERVER_NB_COMPILE=4
đặt số lượng tối đa các phép tổng hợp song song được phép. -
SERVER_TIMEOUT=60
đặt số giây nhàn rỗi mà máy chủ phải đợi mà không có bất kỳ biên dịch nào trước khi tự tắt. -
SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
đặt tệp nơi ghi nhật ký máy chủ. Theo mặc định, biến này có thể được nạp chồng bởi một biến môi trường. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
đặt lệnh mặc định được sử dụng để khởi chạy JVM trên máy chủ. Theo mặc định, biến này có thể được nạp chồng bởi biến môi trường.
Khắc phục sự cố biên dịch Jack
Vấn đề | Hoạt động |
---|---|
Máy tính của bạn không phản hồi trong quá trình biên dịch hoặc bạn gặp lỗi Jack biên dịch không thành công do Lỗi hết bộ nhớ | Giảm số lần tổng hợp Jack đồng thời bằng cách chỉnh sửa $HOME/.jack và thay đổi SERVER_NB_COMPILE thành giá trị thấp hơn. |
Quá trình tổng hợp không thành công trên Không thể khởi chạy máy chủ nền | Nguyên nhân rất có thể là các cổng TCP đã được sử dụng trên máy tính của bạn. Thay đổi các cổng bằng cách chỉnh sửa $HOME/.jack (các biến SERVER_PORT_SERVICE và SERVER_PORT_ADMIN ). Để bỏ chặn tình huống này, hãy tắt máy chủ biên dịch Jack bằng cách chỉnh sửa $HOME/.jack và thay đổi SERVER thành false . Thật không may, điều này làm chậm đáng kể quá trình biên dịch của bạn và có thể buộc bạn phải khởi chạy make -j với kiểm soát tải (tùy chọn -l of make ). |
Quá trình biên dịch gặp khó khăn mà không có bất kỳ tiến trình nào | Để bỏ chặn tình huống, hãy giết máy chủ nền Jack bằng jack-admin kill-server ) sau đó xóa các thư mục tạm thời có trong jack-$USER của thư mục tạm thời của bạn ( /tmp hoặc $TMPDIR ). |
Tìm nhật ký Jack
Nếu bạn chạy lệnh make
với mục tiêu dist, thì nhật ký Jack được đặt tại $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
. Nếu không, bạn có thể tìm thấy nhật ký bằng cách chạy jack-admin server-log
. Trong trường hợp lỗi Jack có thể tái tạo, bạn có thể nhận được nhật ký chi tiết hơn bằng cách đặt biến sau:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Sử dụng các lệnh makefile tiêu chuẩn để biên dịch cây (hoặc dự án của bạn) và đính kèm đầu ra và lỗi tiêu chuẩn. Để xóa nhật ký bản dựng chi tiết, hãy chạy:
unset ANDROID_JACK_EXTRA_ARGS
Jack giới hạn
- Theo mặc định, máy chủ Jack chỉ có thể được sử dụng bởi một người dùng trên máy tính. Để hỗ trợ thêm người dùng, hãy chọn số cổng khác nhau cho từng người dùng và điều chỉnh
SERVER_NB_COMPILE
cho phù hợp. Bạn cũng có thể tắt máy chủ Jack bằng cách đặtSERVER=false
trong$HOME/.jack
. - Quá trình biên dịch CTS chậm do tích hợp
vm-tests-tf
hiện tại. - Các công cụ thao tác Bytecode (chẳng hạn như JaCoCo) không được hỗ trợ.
Sử dụng Jack
Jack hỗ trợ ngôn ngữ lập trình Java 1.7 và tích hợp các tính năng bổ sung được mô tả bên dưới.
Pre-dexing
Khi tạo tệp thư viện Jack, .dex
của thư viện được tạo và lưu trữ bên trong tệp thư viện .jack
dưới dạng pre-dex. Khi biên dịch, Jack sử dụng lại pre-dex từ mỗi thư viện. Tất cả các thư viện đều được dexed trước.

Jack không sử dụng lại pre-dex của thư viện nếu việc thu nhỏ, làm xáo trộn hoặc đóng gói lại được sử dụng trong quá trình biên dịch.
Biên dịch tăng dần
Biên dịch tăng dần có nghĩa là chỉ các thành phần được chạm vào kể từ lần biên dịch cuối cùng (và các phần phụ thuộc của chúng) mới được biên dịch lại. Biên dịch tăng dần có thể nhanh hơn đáng kể so với biên dịch đầy đủ khi các thay đổi được giới hạn trong một tập hợp các thành phần.
Tính năng biên dịch tăng dần bị tắt theo mặc định (và tự động bị vô hiệu hóa khi kích hoạt tính năng thu nhỏ, làm xáo trộn, đóng gói lại hoặc kế thừa nhiều dex). Để bật các bản dựng tăng dần, hãy thêm dòng sau vào tệp Android.mk
của dự án mà bạn muốn xây dựng theo từng bước:
LOCAL_JACK_ENABLED := incremental
Thu nhỏ và làm rối loạn
Jack sử dụng các tệp cấu hình ProGuard để cho phép thu nhỏ và làm mờ.
Các tùy chọn phổ biến bao gồm:
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(chỉ hỗ trợ 1 lọ đầu ra) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
Các tùy chọn thu hẹp bao gồm những điều sau:
-
-dontshrink
Các tùy chọn giải mã bao gồm những điều sau:
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
Các tùy chọn bị bỏ qua bao gồm:
-
-dontoptimize
(Jack không tối ưu hóa) -
-dontpreverify
(Jack không xác minh trước) -
-skipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclassmembers
-
-keepdirectories
-
-target
-
-forceprocessing
-
-printusage
-
-whyareyoukeeping
-
-optimizations
-
-optimizationpasses
-
-assumenosideeffects
-
-allowaccessmodification
-
-mergeinterfacesaggressively
-
-overloadaggressively
-
-microedition
-
-verbose
-
-dontnote
-
-dontwarn
-
-ignorewarnings
-
-printconfiguration
-
-dump
Đóng gói lại
Jack sử dụng các tệp cấu hình jarjar để đóng gói lại. Mặc dù Jack tương thích với các loại quy tắc "rule", nhưng nó không tương thích với các loại quy tắc "zap" hoặc "keep".
Hỗ trợ Multidex
Jack cung cấp hỗ trợ multidex nguyên bản và kế thừa. Vì tệp dex bị giới hạn ở 65 nghìn phương thức, nên các ứng dụng có hơn 65 nghìn phương thức phải được chia thành nhiều tệp dex. Để biết thêm chi tiết, hãy tham khảo Bật đa cực cho các ứng dụng có hơn 64K phương pháp .