1. 程式人生 > >【Android原始碼篇】ubuntu上編譯I.MX6Q原始碼

【Android原始碼篇】ubuntu上編譯I.MX6Q原始碼

參考文件:

一、Android刷機的元件含義

  1. Android 啟動流程:

    • 當你的Android手機啟動時首先會啟動RADIO,然後是SPL。
    • 此時SPL 會根據你的按鍵,確定進入哪個模式( 例如Recovery,Fastboot等等),
    • 如果沒有按其他鍵,那麼spl 會將kernel 載入到記憶體中,ramdisk 也會載入到你的裝置的根目錄
  2. 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原始碼編譯環境

  1. 需要使用 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”
      
  2. make編譯需求:

    • Android 4.0.x (Ice Cream Sandwich) 及更低版本需要將 make 3.82 還原到較低版本,以避免出現編譯錯誤
  3. 需要的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位的系統
  4. 對應的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
    

部分實用指令

  1. 更新預設的 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 命令,將檔案從多個程式碼庫下載到本地工作目錄。

  1. repo status 列出檔案狀態
  2. repo diff 檢視未提交的修改
  3. repo start 新建一個主題分支
  4. git add 暫存更改
  5. repo upload 將更改上傳到稽核伺服器
  6. repo sync 同步所有可用專案的檔案 此處可用於檢測檔案是否下載完全,或者從新開始下載,在檔案下載終止或卡住時,可用Ctrl+Z,中止指令後重新恢復
  7. repo branches 檢視現有分支的列表
  8. repo prune 安全移除已過時的主題分支 在本地檔案分支出問題時可呼叫