Jack là chuỗi công cụ bản dựng mặc định của Android cho Android 6.0 – 8.1
Jack là một chuỗi công cụ Android biên dịch nguồn Java thành mã byte dex của Android. Bạn không cần làm gì khác để sử dụng Jack – chỉ cần sử dụng các lệnh makefile tiêu chuẩn để biên dịch cây hoặc dự án. Android 8.1 là bản phát hành cuối cùng sử dụng Jack.
Giới thiệu về Jack
Jack hoạt động như minh hoạ trong Hình 1.
Hình 1. Tổng quan về Jack.
Đị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).
Hình 2. Nội dung tệp thư viện Jack.
Jill
Như minh hoạ trong hình sau, công cụ Jill dịch các thư viện .jar
hiện có sang định dạng thư viện mới.
Hình 3. Quy trình nhập thư viện .jar
hiện có.
Máy chủ biên dịch Jack
Trong lần đầu sử dụng Jack, máy chủ biên dịch Jack cục bộ sẽ khởi chạy trên máy tính của bạn. Máy chủ này:
- Mang đến tốc độ 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 chạy Jack và khởi động JIT ở mỗi lần biên dịch. API này cũng cung cấp thời gian biên dịch rất tốt trong các 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 hoạt động biên dịch Jack 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ì máy chủ giới hạn số lượng các hoạt động biên dịch song song.
Máy chủ Jack tự tắt sau một khoảng thời gian rảnh mà không có bất kỳ quá trình biên dịch nào.
Giao thức này sử dụng hai cổng TCP trên giao diện localhost và không có sẵn bên ngoài. Bạn có thể sửa đổ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.) bằng cách chỉnh sửa tệp $HOME/.jack
.
tệp $HOME/.jack
Tệp $HOME/.jack
chứa các chế độ cài đặt sau đây cho các biến máy chủ Jack trong cú pháp bash đầy đủ:
SERVER=true
bật 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 biên dịch song song được phép.SERVER_TIMEOUT=60
đặt số giây rảnh mà máy chủ phải đợi mà không có bất kỳ quá trình 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ể bị biến môi trường nạp chồng.JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
đặt lệnh mặc định dùng để khởi chạy JVM trên máy chủ. Theo mặc định, biến môi trường có thể nạp chồng biến này.
Khắc phục sự cố biên dịch Jack
Sự cố | Thao tác |
---|---|
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 Hết bộ nhớ khi biên dịch Jack | Giảm số lượng bản biên dịch đồng thời của Jack bằng cách chỉnh sửa $HOME/.jack và thay đổi SERVER_NB_COMPILE thành một giá trị thấp hơn. |
Quá trình biên dịch không thành công trên Không thể chạy máy chủ nền | Nguyên nhân 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ổng bằng cách chỉnh sửa $HOME/.jack (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 . Rất tiếc, việc này sẽ làm chậm đáng kể quá trình biên dịch và có thể buộc bạn phải khởi chạy make -j có kiểm soát tải (tuỳ chọn -l /make ). |
Quá trình biên dịch bị treo mà không có tiến trình nào | Để bỏ chặn tình huống này, hãy tắt máy chủ nền Jack bằng cách sử dụng jack-admin kill-server ), sau đó xoá các thư mục tạm thời có trong jack-$USER của thư mục tạm thời (/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, nhật ký Jack sẽ nằm tại $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
.
Nếu không, bạn có thể tìm nhật ký bằng cách chạy jack-admin server-log
.
Trong trường hợp Jack gặp lỗi có thể tái hiện, bạn có thể xem 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. Để xoá nhật ký bản dựng chi tiết, hãy chạy mã:
unset ANDROID_JACK_EXTRA_ARGS
Giới hạn về giắc cắm
Theo mặc định, chỉ một người dùng trên máy tính mới có thể sử dụng máy chủ Jack. Để hỗ trợ thêm người dùng, hãy chọn các 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 đặt SERVER=false
trong $HOME/.jack
.
Quá trình biên dịch CTS bị chậm do quá trình tích hợp vm-tests-tf
hiện tại.
Các công cụ thao tác mã byte (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 thêm các tính năng được mô tả bên dưới.
Chuyển sang định dạng .dex trước
Khi tạo tệp thư viện Jack, .dex
của thư viện sẽ được tạo và lưu trữ bên trong tệp thư viện .jack
dưới dạng tệp dex trước.
Khi biên dịch, Jack sử dụng lại tệp dex trước đó trong mỗi thư viện. Tất cả thư viện đều được tạo sẵn tệp dex.
Hình 4. Thư viện Jack có pre-dex.
Jack không sử dụng lại thư viện trước khi tạo dex nếu quá trình thu nhỏ, làm rối mã nguồ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
Quá trình biên dịch gia tăng có nghĩa là chỉ các thành phần được chạm vào kể từ lần biên dịch gần nhất (và các phần phụ thuộc của chúng) mới được biên dịch lại. Quá trình biên dịch gia tăng có thể nhanh hơn đáng kể so với quá trình biên dịch đầy đủ khi các thay đổi chỉ giới hạn ở một nhóm 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 hoá khi bạn bật tính năng rút gọn, làm rối mã nguồn, đóng gói lại hoặc multi-dex cũ). Để bật 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 tạo bản dựng tăng dần:
LOCAL_JACK_ENABLED := incremental
Rút gọn và làm rối mã nguồn
Jack sử dụng các tệp cấu hình ProGuard để bật tính năng rút gọn và làm rối mã nguồn.
Sau đây là các lựa chọn phổ biến:
@
-include
-basedirectory
-injars
-outjars
(chỉ hỗ trợ 1 tệp jar đầu ra)-libraryjars
-keep
-keepclassmembers
-keepclasseswithmembers
-keepnames
-keepclassmembernames
-keepclasseswithmembernames
-printseeds
Các tùy chọn thu hẹp bao gồm:
-dontshrink
Có các tuỳ chọn làm rối mã nguồn sau:
-dontobfuscate
-printmapping
-applymapping
-obfuscationdictionary
-classobfuscationdictionary
-packageobfuscationdictionary
-useuniqueclassmembernames
-dontusemixedcaseclassnames
-keeppackagenames
-flattenpackagehierarchy
-repackageclasses
-keepattributes
-adaptclassstrings
Sau đây là các tuỳ chọn bị bỏ qua:
-dontoptimize
(Jack không tối ưu hoá)-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ù tương thích với các loại quy tắc "rule" (quy tắc), nhưng Jack không tương thích với các loại quy tắc "zap" (xoá) hoặc "keep" (giữ lại).
Hỗ trợ Multidex
Jack cung cấp tính năng hỗ trợ multidex tích hợp và cũ. Vì các tệp dex bị giới hạn ở 65K phương thức, nên các ứng dụng có hơn 65K phương thức phải được chia thành nhiều tệp dex. Để biết thêm thông tin, hãy tham khảo bài viết Bật multidex cho các ứng dụng có hơn 64K phương thức