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

Jack là chuỗi công cụ xây dựng Android mặc định 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 phải 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 của bạn. Android 8.1 là phiên bản cuối cùng sử dụng Jack.

Giới thiệu 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 tin thư viện Jack.

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

Jill

Như thể hiện trong hình dưới đây, công cụ Jill dịch các thư viện .jar hiện có sang định dạng thư viện mới.

Quy trình nhập thư viện `jar.` hiện có.

Hình 3. Quy trình nhập thư viện .jar hiện có.

Máy chủ biên dịch Jack

Lần đầu tiên Jack được sử dụng, 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 khả năng tăng 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 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 các lần biên dịch nhỏ (ví dụ: ở chế độ tăng dần).
  • Là giải pháp ngắn hạn để kiểm soát số lượng bộ sưu tập Jack song song. Máy chủ tránh làm máy tính của bạn bị quá tải (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ượng 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 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ị viên.
  • SERVER_COUNT=1 không được sử dụng.
  • SERVER_NB_COMPILE=4 đặt số lượng biên dịch song song tối đa được phép. SERVER_TIMEOUT=60 đặt số giây nhàn rỗi mà máy chủ phải chờ mà không cần 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 ghi nhật ký máy chủ. Theo mặc định, biến này có thể bị quá tải bởi 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ể bị quá tải bởi biến môi trường.

Khắc phục sự cố tổng hợp 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 phải lỗi biên dịch Jack do lỗi hết bộ nhớ Giảm số lượng bộ sưu tậ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 biên dịch bị lỗi Không thể khởi 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 (các biến SERVER_PORT_SERVICESERVER_PORT_ADMIN ). Để bỏ chặn tình huống này, hãy vô hiệu hóa 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 của make ).
Quá trình biên dịch bị kẹt mà không có bất kỳ tiến triển nào Để bỏ chặn tình huống này, hãy tiêu diệt máy chủ nền Jack bằng cách sử dụng jack-admin kill-server ) sau đó xóa các thư mục tạm thời có trong jack-$USER trong 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, 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 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

Hạn chế của jack

  • 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ợ người dùng bổ sung, hãy chọn số cổng khác nhau cho mỗi 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 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 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 có pre-dex.

Hình 4. Thư viện Jack có 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 soạn 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. Quá trình biên dịch tăng dần có thể nhanh hơn đáng kể so với quá trình biên dịch đầy đủ khi các thay đổi được giới hạn ở một tập hợp thành phần.

Quá trình biên dịch gia tăng bị tắt theo mặc định (và tự động bị tắt khi thu gọn, làm xáo trộn, đóng gói lại hoặc kế thừa đa dex được bật). Để 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 tăng dần:

LOCAL_JACK_ENABLED := incremental

Thu gọn và làm xáo trộn

Jack sử dụng các tệp cấu hình ProGuard để cho phép thu gọn và làm rối mã nguồn.

Các tùy chọn phổ biến bao gồm:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (chỉ hỗ trợ 1 jar đầu ra)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

Các tùy chọn thu nhỏ bao gồm:

  • -dontshrink

Các tùy chọn xáo trộn bao gồm:

  • -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 "quy tắc", nhưng nó không tương thích với các loại quy tắc "zap" hoặc "keep".

Hỗ trợ đa điểm

Jack cung cấp hỗ trợ multidex tích hợp và kế thừa. Vì các tệp dex bị giới hạn ở các phương thức 65K nên các ứng dụng có trên 65K 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 multidex cho các ứng dụng có trên 64K phương thức