參考文檔:
基礎知識
一、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源碼編譯環境
詳細可參考: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 還原到較低版本,以避免出現編譯錯誤
-
需要的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 然后繼續編譯
-
獲取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
部分實用指令
-
更新默認的 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 安全移除已過時的主題分支 在本地文件分支出問題時可調用
- repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
初始化 Android 源代碼到工作目錄 -b 來指定相應分支