Android IMX6Q源碼編譯

參考文檔:

基礎知識

一、Android刷機的組件含義

  1. Android 啟動流程:
    • 當你的Android手機啟動時首先會啟動RADIO,然后是SPL。
    • 此時SPL 會根據你的按鍵,確定進入哪個模式( 例如Recovery,Fastboot等等),
    • 如果沒有按其他鍵,那么spl 會將kernel 載入到記憶體中,ramdisk 也會載入到你的設備的根目錄
  1. 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

  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 “test@test.com” 
        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
              然后繼續編譯
    
  • 獲取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
    

部分實用指令

  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 安全移除已過時的主題分支 在本地文件分支出問題時可調用
  9. repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
    初始化 Android 源代碼到工作目錄 -b 來指定相應分支
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容