Ubuntu16.04編譯Android源碼7.1.2踩坑

Ubuntu16.04編譯Android源碼7.1.2踩坑

參考鏈接:

1.    https://blog.csdn.net/u012195899/article/details/82078384

2.    https://www.jianshu.com/p/266155193716

3.    https://www.jianshu.com/p/5e63b8aedd5f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation


一、前言

        本文不涉及源碼下載過程,主要記錄自己的編譯源碼過程及其中遇到的問題,並最終運行在真機上。

二、預置環境

        1、ubuntu16.04,16G內存,130G硬盤

        2、上位機:RK3399

        3、編譯源碼版本爲android-7.1.2

        版本選擇參考鏈接:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds,根據你的真機型號選擇對應的源碼版本。

三、編譯要求:編譯RK3399  Android7.1 Industry 固件(主要維護)

要求

參考鏈接:http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/compile_android_industry_firmware.html

需要jdk、python、gnu make、git

下載編譯須知:

Android7.1 industry 版本(主要維護)在工業和平板和盒子等領域的使用上範圍更加廣泛,而且性能穩定大批量生產驗證過, 該版本也作爲我司主要維護版本,適用於我司RK3399系統的所有機型。

準備工作

編譯 Android 對機器的配置要求較高:

  • 64 位 CPU

  • 16GB 物理內存+交換內存

  • 30GB 空閒的磁盤空間用於構建,源碼樹另外佔用大約 25GB

官方推薦 Ubuntu 14.04 操作系統,經測試,Ubuntu 12.04 也可以編譯運行成功,只需要滿足 http://source.android.com/source/building.html 裏的軟硬件配置即可。編譯環境的初始化可參考 http://source.android.com/source/initializing.html

  • a、設置java環境   安裝 OpenJDK 8

           此時要編譯源碼7.1.2版本,Ubuntu下要求java環境爲OpenJDK8

            執行命令安裝:

            //正常來說命令行配置jre即可
            sudo apt-get install openjdk-8-jre
            //但我同時安裝了jdk
            sudo apt-get install openjdk-8-jdk

            執行命令查看是否安裝成功:

            java -version
            javac -version

            如果安裝過程沒有出錯,那麼此時應該能夠看到openjdk1.8環境

提示:安裝 openjdk-8-jdk,會更改 JDK 的默認鏈接,這時可用:

$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

 

  • b、設置python

            ubuntu中自帶python環境,且版本爲2.7,可通過執行python命令查看。

  • c、設置gnu make

            ubuntu中自帶gnu make,版本爲4.1,但由於我們此時編譯Android版本爲7.1,可以在該版本執行,因此也不作改變。可通過執行make命令查看版本。

  • d、安裝需要的庫文件

        sudo apt install g++-multilib
        sudo apt install gperf
        sudo apt install libxml2-utils
        sudo apt install curl
        sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
        sudo apt-get install m4

  • Ubuntu 12.04 軟件包安裝:

sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
g++-multilib mingw32 tofrodos gcc-multilib ia32-libs \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
lzop libssl1.0.0 libssl-dev
  • Ubuntu 14.04 軟件包安裝:

sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev \
libesd0-dev libwxgtk2.8-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline-gplv2-dev gcc-multilib libswitch-perl \
libssl1.0.0 libssl-dev   

四、下載 Android SDK

Android SDK 源碼包比較大,可以通過如下方式獲取Android7.1源碼包: [下載鏈接]

下載完成後先驗證一下 MD5 碼:

$ md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.001

afb279a7d2966908bcf53ce2c2c05edc  rk3399-firefly-industry-71-20190926.7z.001

$md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.002

2bc5a41fd1056f1d1ab1f7e84f666bee  rk3399-firefly-industry-71-20190926.7z.002

確認無誤後,就可以解壓:

mkdir -p ~/proj/firefly-rk3399-Industry
cd ~/proj/firefly-rk3399-Industry
7z x /path/to/rk3399-firefly-industry-71-20190926.7z.001 -r -o.
git reset --hard

注意:解壓後務必要先更新下遠程倉庫。 以下爲從 gitlab 處更新的方法:

1. 進入SDK根目錄
cd ~/proj/firefly-rk3399-Industry  

2. 下載遠程bundle倉庫
git clone https://gitlab.com/TeeFirefly/rk3399-industry-nougat-bundle.git .bundle

3. 若下載倉庫失敗,目前bundle倉庫大約1.4G左右,所以同步的時候可能會出現卡住或失敗的問題,
可以從下方百度雲鏈接下載並解壓到SDK根目錄,解壓指令如下:

7z x rk3399-industry-nougat-bundle.7z  -r -o. && mv rk3399-industry-nougat-bundle/ .bundle/

4. 更新SDK,並且後續更新不需要再次拉取遠程倉庫,直接執行以下命令即可
.bundle/update

5. 按照提示已經更新內容到 FETCH_HEAD,同步FETCH_HEAD到firefly分支
git rebase FETCH_HEAD  

bundle壓縮包

Firefly-RK3399 整體編譯打包方法

  • 默認爲 HDMI+DP 顯示編譯

整體編譯:
./FFTools/make.sh -j8 -d rk3399-firefly -l rk3399_firefly-userdebug
打包固件:
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly-userdebug

打包完成會在 rockdev/Image-rk3399_firefly/ 生成打包好的固件.

make -j8

這裏的工作線程數可以設置爲物理內核數-邏輯內核數之間的數字,我的電腦物理內核爲4,邏輯內核數爲8,因此設置-j參數爲8.

 

五、編譯7.1踩坑

有時候編譯的時候會一直報錯,這個時候可以執行make clobber/make clean命令清除之前編譯生成的環境和文件,全部重新執行生效。

a、JACK報錯處理&多用戶編譯:參考 https://www.jianshu.com/p/266155193716

/bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.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.11.ALPHA.jar 4.11.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.32.CANDIDATE.jar 4.32.CANDIDATE || exit 47 )"
Jack server already installed in "/home/system1/.jack-server"
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'

報錯原因

jack不支持多用戶同時編譯,所以經常出現jack server報錯的現象

解決方法

編輯 $home/.jack$home/.jack-settings$home/.jack-server/config.properties,修改SERVER_PORT_SERVICESERVER_PORT_ADMIN的端口號,然後保存。

執行:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

如果權限不對可以執行下面的命令修改權限:

chmod 600 .jack
chmod 600 .jack-settings
chmod 700 .jack-server

報錯的處理

建議先清理.jack-server/logs/內的文件,然後再編譯驗證,出錯後,可以查看此路徑下的日誌文件中的具體錯誤,再根據錯誤進行處理。

b、

ninja: Entering directory `.'
bison/bison: m4 subprocess failed: No such file or directory
[  0% 1/34696] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d  --defines=out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
/bin/bash: prebuilts/misc/linux-x86/bison/bison: No such file or directory
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

修復:

sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
c、

FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39: fatal internal error, exec of /usr/bin/m4 failed
[  1% 760/49025] target Java: core-all (out/targe...bj/JAVA_LIBRARIES/core-all_intermediates/classes)
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.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

修復:

sudo apt-get install m4

d、

Communication error with Jack server (52). Try 'jack-diagnose'

修復:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

這裏需要注意的是,當執行kill-server時,查看jack服務器是否已經成功停止。

啓動時,查看啓動是否成功。如果啓動成功,可繼續編譯。通常如果機器配置不夠,再次執行會報問題e錯誤。

e、

Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by [email protected])).
GC overhead limit exceeded.

修復:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

這也是Jack服務器編譯過程中會報的錯,修改啓動參數即可。

打開文件prebuilts/sdk/tools/jack-admin,搜索 JACK_SERVER_VM_ARGUMENTS關鍵字符串,在-cp參數前添加--Xmx3g 即可。

1.    JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx3g -cp $LAUNCHER_JAR $LAUNCHER_NAME"

2.    JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -mx3g}"

此時再按照d問題解決方案,首先stop-server,然後重新啓動start-server,並查看啓動返回日誌中的參數是否有我們修改後的-Xmx3g

f、 報錯如下:

Internal compiler error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by [email protected])).
no mapping specified for register.

 

問題原因:是推行 Jack 工具遇到了極大的困難,對Java 8 特性的支持方式將轉向 javac和dx,將會在Android Studio中做相關支持。

解決方法:參考 Android 新一代編譯 toolchain Jack 初探

https://www.jianshu.com/p/5e63b8aedd5f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

在android_sdk/external/jetty/Android.mk中添加如下:

LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
LOCAL_BUILT_MODULE_STEM := javalib.jar
LOCAL_UNINSTALLABLE_MODULE := false

修改後的代碼如下:

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
        servlet-api:lib/javax.servlet-3.0.0.v201112011016.jar \
        slf4j-api:lib/slf4j-api-1.6.1.jar \
        slf4j-jdk14:lib/slf4j-jdk14-1.6.1.jar \

include $(BUILD_MULTI_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := jetty-util
LOCAL_SRC_FILES := lib/jetty-util-6.1.26.jar
LOCAL_JACK_FLAGS := -D jack.import.jar.debug-info=false
#LOCAL_UNINSTALLABLE_MODULE := true

LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
LOCAL_BUILT_MODULE_STEM := javalib.jar
LOCAL_UNINSTALLABLE_MODULE := false

include $(BUILD_PREBUILT)

總結

1 Jack 的目的是讓 Android 支持更多的 Java 8 特性;
2 Google 將會把 Jack 的功能轉移到 javac 和 dx 上;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章