【Android原始碼篇】ubuntu上編譯I.MX6Q原始碼
參考文件:
一、Android刷機的元件含義
-
Android 啟動流程:
- 當你的Android手機啟動時首先會啟動RADIO,然後是SPL。
- 此時SPL 會根據你的按鍵,確定進入哪個模式( 例如Recovery,Fastboot等等),
- 如果沒有按其他鍵,那麼spl 會將kernel 載入到記憶體中,ramdisk 也會載入到你的裝置的根目錄
-
imag檔案: Kernel 作業系統核心作業系統核心是指大多數Linux作業系統的核心部分。它由作業系統中用於管理儲存器、檔案、外設和系統資源的那些部分組成。作業系統核心通常執行程序,並提供程序間的通訊
- data目錄:安卓data目錄,存放使用者的一些私有檔案, 會被掛載到 /data
- root目錄:安卓root檔案系統,裡面存放init init.rc等檔案,會被掛載到 /
- recovery目錄:當啟動到recovery模式時,做root檔案系統,一般不會直接使用
- system目錄:安卓system目錄,存放二進位制檔案和庫,會被掛載到 /system
- recovery.img:EXT4格式的img檔案,由recovery目錄生成
- userdata.img 使用者檔案系統其實就是userdata目錄的內容
- system.img 系統檔案系統其實就是system目錄中的內容
- boot.img 整合核心的zImage、ramdisk.img、dtb(裝置樹檔案)還有啟動引數
- ramdisk.img 其實就是/檔案目錄下的內容,由root目錄生成,然後被整合到boot.img,不會被直接使用
- vendor.img: 包含平臺二進位制檔案,位於/vendor
- partition-table.img:GPT分割槽表映像,,用於SD卡。
二、搭建Android原始碼編譯環境
-
需要使用 Linux 或 Mac OS,我採用的是Ubuntu 14.0.4
-
搭建一些必須的程式包:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
-
初始化git,替換自己的郵箱和名字
git config –global user.email “[email protected]” git config –global user.name “test”
-
-
make編譯需求:
- Android 4.0.x (Ice Cream Sandwich) 及更低版本需要將 make 3.82 還原到較低版本,以避免出現編譯錯誤
-
需要的Linux版本
- Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)
- Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)
- 2.3以下需要32位的系統
-
對應的JDK版本:
- Android 7.0 (Nougat) - Android 8.0 (O):Ubuntu - OpenJDK 8;Mac OS - jdk 8u45 或更高版本
- Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
- Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
- Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
注:
如果 Ubuntu >= 15.04 請執行以下命令: sudo apt-get update sudo apt-get install openjdk-8-jdk
I.MX6Q Android端編譯流程
1. 編譯命令(Ubuntu 16.04下編譯)
-
安裝需要的包 sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g+±multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
-
安裝jdk sudo apt-get install openjdk-8-jdk
-
如果在Ubuntu 14.04下 sudo apt-get update sudo apt-get install openjdk-8-jdk
-
repo工具及原始碼下載
mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo mkdir androidsource cd androidsourc repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest -b android-8.0.1_r3 repo sync 注: 在此處有碰到幾個問題: 1. 提示無法連線到 gerrit.googlesource.com,預設repo會去訪問google連結 解決:1. 編輯 ~/bin/repo檔案,修改內容REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo' 2.如果1方法還不行,則在bashrc環境變數中新增export REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo' 2. 中間可能碰到下載卡死或失敗的情況 Crtl+Z中止後repo sync恢復下載,可嘗試多次,防止下載不全面 3. 在下載原始碼時,通過repo branches指令,檢視repo分支,選擇自己需要的指令即可
-
repo在下載原始碼過程中會經常終止,啟動指令碼同步,其中j8,根據電腦配置,為處理器執行緒的2倍
#!/bin/bash echo “======= repo sync =======” repo sync -j8 while [ $? == 1 ]; do echo “====== error re-sync again =====” sleep 3 repo sync -j8 done
-
獲取I.MX Android build原始碼
cd ~ (or any other directory you like) tar xzvf imx-o8.0.0_1.0.0_ga.tar.gz source ~/imx-o8.0.0_1.0.0_ga/imx_android_setup.sh # By default, the imx_android_setup.sh script will create the source code build environment in the folder ~/android_build # ${MY_ANDROID} will be refered as the i.MX Android source code root directory in all i.MX Andorid release documentation export MY_ANDROID=~/android_build
-
編譯imx Android
cd ${MYANDROI} source build/envsetup.sh lunch sabresd_6q-userdebug make 2>&1 | tee build-log.txt #編譯完成後,檢視log檔案,是否有錯誤,更改build_id或者build_number,更新${MY_ANDROID}目錄的 build_in.mk #Android system image production build method 2 #$ make PRODUCT-sabreauto_6q-userdebug 2>&1 | tee build-log.txt 注:在此處碰到問題: 1. 編譯android 7.0 出現Try increasing heap size with java option '-Xmx<size>'錯誤解決方案 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" ./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server 然後繼續編譯
-
cd ~/androidsource git clone git://git.freescale.com/imx/linux-2.6-imx.git kernel_imx cd kernel_imx git checkout imx-o8.0.0_1.0.0_ga
-
cd ~/androidsource/bootable cd bootloader git clone git://git.freescale.com/imx/uboot-imx.git uboot-imx cd uboot-imx git checkout imx-o8.0.0_1.0.0_ga
部分實用指令
-
更新預設的 Java 版本
sudo update-alternatives --config java sudo update-alternatives --config javac
repo指令
Google原始碼編譯介紹 repo是我們以 Git 為基礎構建的程式碼庫管理工具。Repo 可以在必要時整合多個 Git 程式碼庫,將相關內容上傳到我們的修訂版本控制系統,並自動執行 Android 開發工作流程的部分環節。Repo 並非用來取代 Git,只是為了讓您在 Android 環境中更輕鬆地使用 Git。Repo 命令是一段可執行的 Python 指令碼,您可以將其放在路徑中的任何位置。使用 Android 原始碼檔案時,您可以使用 Repo 執行跨網路操作。例如,您可以藉助單個 Repo 命令,將檔案從多個程式碼庫下載到本地工作目錄。
- repo status 列出檔案狀態
- repo diff 檢視未提交的修改
- repo start 新建一個主題分支
- git add 暫存更改
- repo upload 將更改上傳到稽核伺服器
- repo sync 同步所有可用專案的檔案 此處可用於檢測檔案是否下載完全,或者從新開始下載,在檔案下載終止或卡住時,可用Ctrl+Z,中止指令後重新恢復
- repo branches 檢視現有分支的列表
- repo prune 安全移除已過時的主題分支 在本地檔案分支出問題時可呼叫