Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Biên dịch với Jack cho Android 6.0–8.1

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.

Tổng quan về Jack
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).

Nội dung tệp thư viện Jack
Hình 2. Nội dung tệp thư viện Jack

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.

Nhập thư viện .jar với Jill
Hình 3. Quy trình làm việc để nhập thư viện .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_SERVICESERVER_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 đặt SERVER=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.

Thư viện Jack với pre-dex
Hình 4. Các thư viện Jack với pre-dex

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 .