定製化ROM採坑之路(1):魔趣8.1版本源碼下載和編譯過程

前言

記得當年剛接觸Android的時候,就看有關老羅的文章倒是讓我的安卓內功提升不少,但是由於工作都是停留在應用層的緣故,我幾乎對這塊並沒有深入研究,最近公司的新產品對Framework層的開發有所涉及,需要製作自己的ROM包,我用一個星期來調研,查國內外的很多資料,發現國內的魔趣的開源項目是基於CM和AOSP來進行二次開發的,社區論壇也比較活躍,這裏的Android ROM我就選擇從魔趣的源碼來進行編譯開發了,剛好手裏有一臺紅米5A手機,以下的開發過程就圍繞這部手機型號來進行展開。

源碼的下載

配置SSH長連接

我們的用戶端和服務端鏈接過程中長時間不輸入後會導致自動斷開,我參考《解決SSH自動斷開問題》進行配置,下載的時候,因爲同步命令會記錄上次下載的位置,所以可以繼續執行。在編譯的時候特別重要,因爲斷開後,他很多變量都是配置到當前會話中的,斷開SSH會話後,編譯命令無法找到,我們就需要重新的去編譯源碼。

選定源碼版本

我們來看下魔趣官網中對於源碼版本的選定
在這裏插入圖片描述
上面我在魔趣下載網站上對於5A機型ROM源碼的查看,幾乎每天都在更新,那麼我們這裏下載的肯定就是魔趣的8.1的源碼了(MK8.1就是代表魔趣的ROM是基於8.1來進行開發的)。

安裝repo

在這裏我主要參考的是官網的repo安裝,我在掛載的服務器硬盤路徑中創建我們下載的文件夾,並且添加到環境變量中。

$ mkdir /var/android/rom/mokee/source
$ PATH=/var/android/rom/mokee/source:$PATH

使用魔趣的鏡像下載repo

 $ curl https://download.mokeedev.com/git-repo-downloads/repo > /var/android/rom/mokee/source/repo
 $ chmod a+x /var/android/rom/mokee/source/repo

在這裏插入圖片描述初始化repo分支

$ repo init -u https://github.com/MoKee/android -b mko-mr1

下載好後有一個.repo的隱藏文件夾,cd進去:

$ ls
local_manifests  manifests      project-objects  projects
manifest.xml     manifests.git  project.list     repo

更改國內鏡像地址

目前下載的時候,如果使用默認的http://android.googlesource.com/需要我們進行翻牆操作,可能網速不穩定,這裏就需要我們再.repo/manifest.xml文件去修改我們的下載地址,通過這篇《魔趣開源項目定製版Repo-全程無需科學上網環境同步完整Android源碼庫》帖子,我們可以進行下載環境的搭建。這裏我們就選擇了清華大學鏡像,改爲https://aosp.tuna.tsinghua.edu.cn/在這裏插入圖片描述
更改後初始化repo並且同步下載8.1的源碼:

$ repo sync

來看一張下載完成後的效果圖:
在這裏插入圖片描述
上面的紅框是我在編譯源碼的過程中產生的,這裏可以忽略掉,下載完成後是沒有這些文件的。

安裝編譯環境

安裝OpenJDK

在這裏插入圖片描述
官網中要求,編譯7.0和8.0版本源碼我們這裏就安裝OpenJDK安裝,參考這篇文章《CentOS7 使用yum命令安裝Java SDK(openjdk)》
在這裏插入圖片描述

安裝所需的軟件包

雖然官方給我們推薦的是Ubuntu,但是我們公司給我提供的服務器環境是centos 6.5
在這裏插入圖片描述這裏我找了些資料去安裝我們的環境,我看了這篇文章CentOS7上編譯Android系統執行了下面的命令。

$ sudo yum install -y gcc make libstdc++.i686 libstdc++-devel.i686 zlib-devel openssl-devel perl cpio expat-devel gettext-devel autoconf glibc.i686 glibc-devel.i686 zlib-devel.i686 libstdc++.i686 libX11-devel.i686 ncurses-devel.i686 ncurses-libs.i686 gperf flex gcc-c++ bison patch

注意:因爲我之後又在Unbuntu平臺下安裝了一遍所以這裏可以給搭建一些我Unbuntu的命令

bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

將上面的軟件使用apt-get命令去安裝即可。
參考鏈接:https://wiki.lineageos.org/devices/natrium/build

編譯中產生的問題

在小節內容都是我在編譯中產生的問題,放在編譯小結前面,主要是讓大家先閱覽產生印象,如果你在編譯過程中也產生了類似的問題,可以參考我發的鏈接進行修改,目前編譯的出現報錯的問題我分爲兩類:

  • 安裝包的缺失和不適配問題
  • 編譯機器配置問題

安裝包的問題

這裏安裝包的問題,我們可以提前的解決編譯的時候,就可以節省很多時間,因爲,我是自己摸索編譯的相關資料很少,就自己採坑後重新編譯。

  • Glibc 版本過舊的問題
    在編譯過程中,會提示我編譯需要Glibc 2.15,由於我們當前的版本是2.13,達不到編譯的要求會出現錯誤,這裏我們參考看這篇文章進行版本升級和安裝。

  • 缺失ImageMagick軟件包

============================================
ninja: no work to do.
ninja: no work to do.
/var/android/rom/mokee/source/out/build-mk_rolex.ninja is missing, regenerating...
[1070/1081] including ./vendor/mk/bootanimation/Android.mk ...
**********************************************
The boot animation could not be generated as
ImageMagick is not installed in your system.

Please install ImageMagick from this website:
https://imagemagick.org/script/binary-releases.php
**********************************************

這裏我們參考這篇文章《Centos7安裝ImageMagick》

  • Zlib版本不適配
FAILED: 
/var/android/rom/mokee/source/out/host/linux-x86/bin/aapt: 
/lib64/libz.so.1: version `ZLIB_1.2.3.4' not found (required by /var/android/rom/mokee/source/out/host/linux-x86/bin/aapt)
ninja: build stopped: subcommand failed.

參考《version ZLIB_1.2.3.4 not found 解決方法》按照這篇文章我的編譯是成功的,但是我們需要注意一個點,修改後再次查看命令還是1.2.3版本:

[mujf@pbx-test01 lib64]$ rpm -qa | grep zlib
zlib-1.2.3-29.el6.i686
zlib-devel-1.2.3-29.el6.x86_64
zlib-devel-1.2.3-29.el6.i686
zlib-1.2.3-29.el6.x86_64

也就是說使用文章的方法安裝Zlib並沒有覆蓋原有的版本進行升級的效果,這裏我暫時沒有找到好的方案去升級。

編譯機器配置問題在這裏插入圖片描述

在官網的要求中,這需要16G的內存是標配,但是公司給的內存也就是8G所以常常會出現內存不足的情況,因爲編譯的時候是用的jack,這裏我也是勉強的去使用,就需要更改下配置。
在這裏插入圖片描述

  • 修改Jack內存配置
FAILED: /var/android/rom/mokee/source/out/soong/build.ninja
/var/android/rom/mokee/source/out/soong/.bootstrap/bin/soong_build  -t -b /var/android/rom/mokee/source/out/soong -d /var/android/rom/mokee/source/out/soong/build.ninja.d -o /var/android/rom/mokee/source/out/soong/build.ninja Android.bp
fatal error: runtime: out of memory

編譯的時候,顯示log出錯,內存不足,我查看本機的內存發現還有4個G。我參考了這篇文章《編譯CM14.1 提示Jack “Out of memory error”錯誤》,配置適合本機的Jack內存爲8G。
在這裏插入圖片描述
在上面的路徑下找到我們的jack-admin文件,按照下面的命令去修改
在這裏插入圖片描述
這裏的修改命令,Xmx4096對應的內存是8G,修改後進行錯誤的重啓。

#先停止服務
prebuilts/sdk/tools/jack-admin stop-server
#重新開始服務
prebuilts/sdk/tools/jack-admin start-server

效果圖:
在這裏插入圖片描述

  • JVM內存不足的問題
[ 83% 80128/96322] Docs droiddoc: /var/android/rom/mokee/source/out/target/common/docs/api-stubs
FAILED: /var/android/rom/mokee/source/out/target/common/docs/api-stubs-timestamp
/bin/bash /var/android/rom/mokee/source/out/target/common/docs/api-stubs-timestamp.rsp
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c4180000, 103809024, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 103809024 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /var/android/rom/mokee/source/hs_err_pid13087.log
ninja: build stopped: subcommand failed.

今天在編譯到83%的時候,曝出上面的錯誤,看網上的文章應該是內存不夠,本來我編譯的時候只有8GB內存,編譯8.1的源碼肯定會出現問題。我參考了這篇文章創建swap(交換區)方案,當內存不夠的時候使用交換空間去做臨時方案。

編譯源碼

如果提前解決上面的問題,那麼現在我們編譯肯定是順風順水了,在魔趣論壇的《5行命令教你編譯魔趣》這個帖子中,我瞭解到了一些流程,現在就動手實踐一下:

source build/envsetup.sh
lunch  mk_rolex-userdebug
mka bacon -j1 > make.log

PS:這裏有個指令 make clobber 是清除編譯緩存,簡單說就是刪掉out文件夾下面內容。

下面的source命令,就是初始化編譯環境變量這些變量的設置只有在當前的會話中有用,如果出現斷網後面的lunchmka命令就無法執行,需要重新執行source命令。

  • lunch命令
    lunch命令後的跟的是開發代號,這裏我們可以在魔趣設備支持列表中找到紅米5A代號。
    在這裏插入圖片描述

  • mka bacon -j1 > make.log
    這裏當上面命令完成後,我們將使用一個cpu去編譯所有源碼這裏可以根據自身的配置,來使用-j[num]來編譯,數字代表使用幾個cpu內核來編譯,這裏的log是我們編譯中產生的日誌信息。

    關於命令的的作用參考《Android編譯系統詳解(一)——build/envsetup.sh》

注意點

在編譯過程中,我們可能會出現各種相對自己機子的報錯,但是我們並不需要重新的去編譯我們的文件,當我們解決當前報錯的問題後,在SSH沒有斷開的情況下重新執行編譯命令mka bacon -j1 > make.log會繼續我們上次報錯的點來繼續編譯。

寫到這裏我們對命令的簡單實用應該已經基本知曉了,但是正所謂知其所以然,我們要了解命令背後的含義還需要看一下老羅的這篇文章《Android編譯系統環境初始化過程分析》

編譯完成

下面放一張編譯完成後的效果圖:
在這裏插入圖片描述
在這裏插入圖片描述
上面的鏡像文件就是我們通常刷機時候需要的文件,我們再來看看MK81.0-rolex-201901191847-UNOFFICIAL.zip文件內容。在這裏插入圖片描述
在官方發佈的rom每夜版MK81.0-rolex-201901211301-NIGHTLY.zip中和我們編譯後產生的zip包命名很類似,在這裏我們應該已經猜測到了,每夜版本就是通過這種方式產生的,我們來看下官方發佈的zip包中的內容證實一下。
在這裏插入圖片描述
文件名稱完全是一樣的,在這裏我們就可以肯定,官方的代碼也是通過我們的這種方式得到。

結束語

在編譯的整個過程中,因爲我是最低的配置去編譯8.1的源碼,總共就花費了將近20個小時。期間還出現了很多問題,不過總算是編譯完成,其實有點幸運的成分在其中,畢竟我因爲內存吃緊報錯出現了很多問題了,都幾度想放棄還是堅持下來了。編譯只是第一步,下面我們需要將編譯出來的魔趣OS刷機包刷入到手機中,這樣我們才能進行後續的研發工作,感興趣的可以看我的下一篇文章《定製ROM採坑之路(2):魔趣OS刷入小米5A手機過程詳解》

參考文章

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