1. 程式人生 > >Android7.0成長之路---新特性Jack server

Android7.0成長之路---新特性Jack server

準備

今天正式擔任Android7.0(N)專案模組的開發和維護工作,藉此機會git和make了一套系統程式碼用來研究。在編譯的過程中,與以往系統不同的是Android7.0系統編譯工具鏈使用了全新的Jack server來取代以往的編譯器工具,所以在編譯的過程中可能出現一些小問題,後面將為大家總結介紹!

Jack server

一、介紹

我們先來看一下關於Jack server官方介紹:

  Jack is a new Android toolchain that compiles Java source into Android dex bytecode. It replaces the
previous Android toolchain, which consists of multiple tools, such as javac, ProGuard, jarjar, and dx.

Jack編譯器工具是一套新的Android編譯工具用來將Java程式碼轉換為Android dex位元組程式碼。

二、Jack server優點

1.適用於AOSP,意思就是說這套編譯器是開源的,開發者也可以為其進行完善。
2.Jack server能夠減少編譯的時間
3.使用第三方包例如ProGuard將不在是必要的。
這裡寫圖片描述

三、.jack庫檔案介紹

Jack擁有其自己的檔案格式,即為:.jack。此檔案包含了預編譯dex程式碼的一些庫檔案,使得在預編譯的過程中變的更快。
這裡寫圖片描述

四、Jill工具

從官方的介紹中可以看到,Jill還處於Jack編譯器之前,它的用處是用來將已存在的.jar庫轉換成一種新格式的庫檔案格式Jayce用來適配編譯器Jack。

這裡寫圖片描述

五、Jack編譯(重點)

當我們瞭解了Jack server這一個在Android7.0的新特性後,我們接下來就可以使用Jack來對我們的系統進行整編譯了。

這裡寫圖片描述

如圖,我們開啟$HOME路徑下的.jack檔案,看到的是如下引數:

SERVER=true 開啟jack server.

SERVER_PORT_SERVICE=8072 設定TCP伺服器埠號用來進行彙編編譯

SERVER_PORT_ADMIN=8073
設定TCP伺服器埠號用來管理員的編譯管理
SERVER_COUNT=1 當前未使用,一般為預設 SERVER_NB_COMPILE=4 同時編譯最大執行緒 SERVER_TIMEOUT=60 如果server沒有在60s內沒有反應,那麼將會關掉此服務 SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} Log輸出的位置 JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} 啟動JVM命令

Jack編譯遇到的問題—Failed to contact Jack server

如果你在編譯的過程中,出現瞭如下的問題:

warning: string 'bluetooth_map_email_settings_app_icon' has no default translation.
warning: string 'bluetooth_map_email_settings_cancel' has no default translation.
warning: string 'bluetooth_map_email_settings_count' has no default translation.
warning: string 'bluetooth_map_email_settings_intro' has no default translation.
warning: string 'bluetooth_map_email_settings_no_account_slots_left' has no default translation.
warning: string 'bluetooth_map_email_settings_save' has no default translation.
warning: string 'bluetooth_map_email_settings_title' has no default translation.
warning: string 'bluetooth_share_file_name' has no default translation.
warning: string 'incoming_file_confirm_Notification_caption' has no default translation.
warning: string 'incoming_file_toast_msg' has no default translation.
warning: string 'map_acceptance_timeout_message' has no default translation.
warning: string 'map_auth_notif_message' has no default translation.
warning: string 'map_auth_notif_ticker' has no default translation.
warning: string 'map_auth_notif_title' has no default translation.
warning: string 'map_authentication_timeout_message' has no default translation.
warning: string 'map_defaultname' has no default translation.
warning: string 'map_defaultnumber' has no default translation.
warning: string 'map_localPhoneName' has no default translation.
warning: string 'map_session_key_dialog_header' has no default translation.
warning: string 'map_session_key_dialog_title' has no default translation.
warning: string 'map_unknownName' has no default translation.
warning: string 'noti_caption' has no default translation.
warning: string 'permdesc_handoverStatus' has no default translation.
warning: string 'permlab_handoverStatus' has no default translation.
warning: string 'process' has no default translation.
warning: string 'sharedUserId' has no default translation.
[ 33% 13407/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IMMSdkService.aidl
[ 33% 13408/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IFeatureManager.aidl
[ 33% 13409/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IEffectFactory.aidl
[ 33% 13410/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IEffectHalClient.aidl
[ 33% 13411/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IEffectHal.aidl
[ 33% 13412/40165] Aidl: mediatek-framework <= vendor/mediatek/proprietary/frameworks/base/camera/mmsdk/java/com/mediatek/mmsdk/IEffectListener.aidl
[ 33% 13413/40165] Protoc: out/target/common/obj/JAVA_LIBRARIES/sap-api-java-static_intermediates/src/proto/Proto.stamp <= hardware/ril/librilutils/proto/sap-api.proto
[ 33% 13414/40165] Aidl: android-support-v4 <= frameworks/support/v4/java/android/support/v4/media/session/IMediaSession.aidl
[ 33% 13415/40165] Aidl: android-support-v4 <= frameworks/support/v4/java/android/support/v4/os/IResultReceiver.aidl
[ 33% 13416/40165] Aidl: android-support-v4 <= frameworks/support/v4/java/android/support/v4/media/session/IMediaControllerCallback.aidl
[ 33% 13417/40165] Aidl: android-support-v4 <= frameworks/support/v4/java/android/support/v4/app/INotificationSideChannel.aidl
[ 33% 13418/40165] Export includes file:  -- out/target/product/tb6580p2_gmo512m_p/obj/SHARED_LIBRARIES/libja3m_intermediates/export_includes
[ 33% 13419/40165] Protoc: out/host/linux-x86/gen/STATIC_LIBRARIES/libaapt2_intermediates/proto/frameworks/base/tools/aapt2/Format.pb.cc <= frameworks/base/tools/aapt2/Format.proto
[ 33% 13420/40165] Updated header file out/host/linux-x86/gen/STATIC_LIBRARIES/libaapt2_intermediates/proto/frameworks/base/tools/aapt2/Format.pb.h.
[ 33% 13421/40165] Export includes file: out/host/linux-x86/gen/STATIC_LIBRARIES/libaapt2_intermediates/proto/frameworks/base/tools/aapt2/Format.pb.h -- out/host/linux-x86/obj/STATIC_LIBRARIES/libaapt2_intermediates/export_includes
[ 33% 13422/40165] Import includes file: out/host/linux-x86/obj/EXECUTABLES/aapt2_intermediates/import_includes
[ 33% 13423/40165] Ensure Jack server is installed and started
FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar  2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
Writing client settings in /home/user3/.jack-settings
Installing jack server in "/home/user3/.jack-server"
Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log
Failed to contact Jack server: Problem reading /home/user3/.jack-server/client.pem. Try 'jack-diagnose'
Failed to contact Jack server: Problem reading /home/user3/.jack-server/client.pem. Try 'jack-diagnose'
[ 33% 13423/40165] host C++: aapt2 <= frameworks/base/tools/aapt2/Main.cpp
[ 33% 13423/40165] host C++: dexdump2 <= art/dexdump/dexdump.cc
[ 33% 13423/40165] Compiling SDK Stubs: out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes.jar
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1

注意!此處為解決問題的關鍵:

Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log

Failed to contact Jack server: Problem reading /home/user3/.jack-server/client.pem. Try 'jack-diagnose'

此問題是在於Android N新特性中,將同一個使用過的TCP埠將視為唯一,所以遇到這種情況下需要修改兩處檔案。具體步驟如下:
1.修改$HOME路徑下的.jack檔案:
這裡寫圖片描述
2.修改$HOME路徑下的.jack-settings檔案:
這裡寫圖片描述
(注:此處兩個檔案的TCP埠號必須是沒有用過的,且兩個檔案的埠配置要相同!)
3.jack-admin kill-server
4.jack-admin uninstall-server
5.cd prebuilts/sdk/tools->touch jack
6.jack-admin restart-server

OK!大功告成!