參考文檔:
基礎(chǔ)知識(shí)
一、Android刷機(jī)的組件含義
- Android 啟動(dòng)流程:
- 當(dāng)你的Android手機(jī)啟動(dòng)時(shí)首先會(huì)啟動(dòng)RADIO,然后是SPL。
- 此時(shí)SPL 會(huì)根據(jù)你的按鍵,確定進(jìn)入哪個(gè)模式( 例如Recovery,F(xiàn)astboot等等),
- 如果沒有按其他鍵,那么spl 會(huì)將kernel 載入到記憶體中,ramdisk 也會(huì)載入到你的設(shè)備的根目錄
- imag文件:
Kernel 操作系統(tǒng)內(nèi)核操作系統(tǒng)內(nèi)核是指大多數(shù)Linux操作系統(tǒng)的核心部分。它由操作系統(tǒng)中用于管理存儲(chǔ)器、文件、外設(shè)和系統(tǒng)資源的那些部分組成。操作系統(tǒng)內(nèi)核通常運(yùn)行進(jìn)程,并提供進(jìn)程間的通信- data目錄:安卓data目錄,存放用戶的一些私有文件, 會(huì)被掛載到 /data
- root目錄:安卓root文件系統(tǒng),里面存放init init.rc等文件,會(huì)被掛載到 /
- recovery目錄:當(dāng)啟動(dòng)到recovery模式時(shí),做root文件系統(tǒng),一般不會(huì)直接使用
- system目錄:安卓system目錄,存放二進(jìn)制文件和庫,會(huì)被掛載到 /system
- recovery.img:EXT4格式的img文件,由recovery目錄生成
- userdata.img 用戶文件系統(tǒng)其實(shí)就是userdata目錄的內(nèi)容
- system.img 系統(tǒng)文件系統(tǒng)其實(shí)就是system目錄中的內(nèi)容
- boot.img 集成內(nèi)核的zImage、ramdisk.img、dtb(設(shè)備樹文件)還有啟動(dòng)參數(shù)
- ramdisk.img 其實(shí)就是/文件目錄下的內(nèi)容,由root目錄生成,然后被集成到boot.img,不會(huì)被直接使用
- vendor.img: 包含平臺(tái)二進(jìn)制文件,位于/vendor
- partition-table.img:GPT分區(qū)表映像,,用于SD卡。
二、搭建Android源碼編譯環(huán)境
詳細(xì)可參考:https://source.android.com/source/initializing
-
需要使用 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 “test@test.com” git config –global user.name “test”
-
-
make編譯需求:
- Android 4.0.x (Ice Cream Sandwich) 及更低版本需要將 make 3.82 還原到較低版本,以避免出現(xiàn)編譯錯(cuò)誤
-
需要的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位的系統(tǒng)
-
對(duì)應(yīng)的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 請(qǐng)運(yùn)行以下命令: 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 注: 在此處有碰到幾個(gè)問題: 1. 提示無法連接到 gerrit.googlesource.com,默認(rèn)repo會(huì)去訪問google鏈接 解決:1. 編輯 ~/bin/repo文件,修改內(nèi)容REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo' 2.如果1方法還不行,則在bashrc環(huán)境變量中添加export REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo' 2. 中間可能碰到下載卡死或失敗的情況 Crtl+Z中止后repo sync恢復(fù)下載,可嘗試多次,防止下載不全面 3. 在下載源碼時(shí),通過repo branches指令,查看repo分支,選擇自己需要的指令即可 -
repo在下載源碼過程中會(huì)經(jīng)常終止,啟動(dòng)腳本同步,其中j8,根據(jù)電腦配置,為處理器線程的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文件,是否有錯(cuò)誤,更改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 出現(xiàn)Try increasing heap size with java option '-Xmx<size>'錯(cuò)誤解決方案 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 然后繼續(xù)編譯 -
獲取I.MX Kernel
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 -
獲取I.MX U-boot
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
部分實(shí)用指令
-
更新默認(rèn)的 Java 版本
sudo update-alternatives --config java sudo update-alternatives --config javac
repo指令
Google源碼編譯介紹
repo是我們以 Git 為基礎(chǔ)構(gòu)建的代碼庫管理工具。Repo 可以在必要時(shí)整合多個(gè) Git 代碼庫,將相關(guān)內(nèi)容上傳到我們的修訂版本控制系統(tǒng),并自動(dòng)執(zhí)行 Android 開發(fā)工作流程的部分環(huán)節(jié)。Repo 并非用來取代 Git,只是為了讓您在 Android 環(huán)境中更輕松地使用 Git。Repo 命令是一段可執(zhí)行的 Python 腳本,您可以將其放在路徑中的任何位置。使用 Android 源代碼文件時(shí),您可以使用 Repo 執(zhí)行跨網(wǎng)絡(luò)操作。例如,您可以借助單個(gè) Repo 命令,將文件從多個(gè)代碼庫下載到本地工作目錄。
- repo status 列出文件狀態(tài)
- repo diff 查看未提交的修改
- repo start 新建一個(gè)主題分支
- git add 暫存更改
- repo upload 將更改上傳到審核服務(wù)器
- repo sync 同步所有可用項(xiàng)目的文件 此處可用于檢測(cè)文件是否下載完全,或者從新開始下載,在文件下載終止或卡住時(shí),可用Ctrl+Z,中止指令后重新恢復(fù)
- repo branches 查看現(xiàn)有分支的列表
- repo prune 安全移除已過時(shí)的主題分支 在本地文件分支出問題時(shí)可調(diào)用
- repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
初始化 Android 源代碼到工作目錄 -b 來指定相應(yīng)分支