Biên dịch với Jack (AOSP 6.0 – 8.1)

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 tệp Android dex mã byte. Bạn không phải làm gì khác để sử dụng Jack - chỉ cần sử dụng các lệnh makefile chuẩn để biên dịch cây hoặc dự án của bạ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.

Tổng quan về giắc cắm.

Hình 1. Tổng quan về giắc cắm.

Định dạng thư viện Jack

Jack có định dạng tệp .jack riêng có 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 trong thư viện Jack.

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

jill

Như minh hoạ trong hình sau, công cụ Jill dịch .jar sang định dạng thư viện mới.

Quy trình làm việc để nhập thư viện "jar." hiện có.

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 giắc cắm

Lần đầu tiên Jack được sử dụng, máy chủ này 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 độ nội tại vì nó tránh khởi chạy máy chủ lưu trữ JRE JVM mới, tải mã Jack, khởi chạy Jack và khởi động JIT ở từng thời điểm biên dịch. API này cũng cung cấp thời gian biên dịch rất tốt trong khi các cấu hình biên dịch mã (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 giắc cắm song song video tổng hợp. 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ì công cụ này giới hạn số lượng các thao tác biên dịch song song.

Máy chủ Jack tự tắt sau thời gian không hoạt động mà không có biên dịch nào. Nó sử dụng 2 cổng TCP trên giao diện localhost và không sử dụng được bên ngoài. Tất cả các thông số (số lần biên dịch song song, thời gian chờ, số cổng số, 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 chế độ cài đặt sau đây cho Jack các biến máy chủ 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 chưa được sử dụng.
  • SERVER_NB_COMPILE=4 đặt số lượng tối đa các bài hát song song được phép video tổng hợp. SERVER_TIMEOUT=60 đặt số giây không hoạt động mà máy chủ phải đợi mà không biên dịch trước khi tự tắt. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} đặt tệp nơi nhật ký máy chủ được ghi. Theo mặc định, biến này có thể là bị quá tải bởi một biến môi trường.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} đặt làm mặc định dùng để khởi chạy một JVM trên máy chủ lưu trữ. Theo mặc định, biến này có thể là bị quá tải bởi biến môi trường.

Khắc phục sự cố khi biên dịch Jack

Sự cố Hành độ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 trải nghiệm Không biên dịch được giắc cắm khi Lỗi hết bộ nhớ Giảm số lượng giắc cắm đồng thời bằng cách chỉnh sửa $HOME/.jack và thay đổi Hãy chuyển SERVER_NB_COMPILE sang 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 rất có thể là do 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 (SERVER_PORT_SERVICESERVER_PORT_ADMIN biến). Để bỏ chặn tình huống này, hãy vô hiệu hoá Máy chủ biên dịch giắc cắm bằng cách chỉnh sửa $HOME/.jack và thay đổi SERVER đến false. Rất tiếc, quá trình 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 khi tải đối chứng (lựa chọn -l/make).
Quá trình biên dịch bị lỗi 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 jack-admin kill-server), sau đó xoá các thư mục tạm thời có trong jack-$USER 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 có mục tiêu xa nhất, thì nhật ký Jack sẽ đặt 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 lỗi Jack có thể tái tạo, bạn có thể lấy 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 chuẩn để biên dịch cây (hoặc dự án của bạn) và đính kèm dữ liệu đầu ra và lỗi chuẩn. Để xoá nhật ký bản dựng chi tiết, hãy chạy mã:

unset ANDROID_JACK_EXTRA_ARGS

Hạn chế của giắc cắm

Theo mặc định, chỉ một người dùng trên Jack mới có thể sử dụng máy chủ Jack một máy tính. Để hỗ trợ những người dùng khác, hãy chọn số cổng khác nhau cho mỗi thiết bị 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 thiết lập 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. Không hỗ trợ các công cụ thao tác mã byte (chẳng hạn như JaCoCo).

Sử dụng giắc cắm

Jack hỗ trợ ngôn ngữ lập trình Java 1.7 và tích hợp tính năng được mô tả bên dưới.

Pre-dex

Khi tạo tệp thư viện Jack, .dex của thư viện sẽ là đượ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 tệp dex trước đó trong mỗi thư viện. Tất cả thư viện đều chuyển sang định dạng dex.

Thư viện Jack với pre-dex.

Hình 4. Thư viện Jack có pre-dex.

Jack không sử dụng lại thư viện ở dạng tệp dex khi rút gọn, 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 gia tăng

Biên dịch gia tăng có nghĩa là chỉ các thành phần được tiếp cận kể từ lần biên dịch (và các phần phụ thuộc của chúng) được biên dịch lại. Việc biên dịch gia tăng có thể nhanh hơn đáng kể so với biên dịch đầy đủ khi các thay đổi bị giới hạn ở một tập hợp các thành phần.

Tính năng biên dịch gia tăng bị tắt theo mặc định (và tự động bị huỷ kích hoạt khi rút gọn, làm rối mã nguồn, đóng gói lại hoặc sử dụng nhiều định dạng dex bật). Để bật các bản dựng gia tăng, hãy thêm dòng sau vào lệnh Tệp Android.mk của dự án mà bạn muốn tạo dần:

LOCAL_JACK_ENABLED := incremental

Thu hẹp và làm rối mã nguồn

Jack sử dụng 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 đầu ra)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Các tùy chọn thu hẹp bao gồm:

  • -dontshrink

Sau đây là các tuỳ chọn làm rối mã nguồn:

  • -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 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. Khi Jack đang tương thích với "quy tắc" các loại quy tắc này không tương thích với "zap" hoặc "giữ" loại quy tắc.

Hỗ trợ Multidex

Jack cung cấp tính năng hỗ trợ multidex tích hợp sẵn và cũ. Vì các tệp dex bị giới hạn đến 65.000 phương thức, ứng dụng có hơn 65.000 phương thức phải được chia thành nhiều tệp dex tệp. Để biết thêm thông tin, hãy tham khảo Bật multidex cho các ứng dụng có hơn 64.000 phương thức