1. 程式人生 > >Android2.3.1系統原始碼編譯

Android2.3.1系統原始碼編譯

    1. 環境準備:

        編譯安卓原始碼只能在Linux上面,建議使用64位電腦進行編譯,這裡使用Ubuntu14.04系統來進行編譯

       

        Java環境,需要使用Oracle的JDK, Android5.0以後才可以使用OpenJDK來進行編譯,推薦去Oracle官網下載壓縮包自己配置環境變數來安裝:(後面編譯發現編譯2.3.1版本Android系統原始碼需要jdk1.6)

       

        編譯依賴包準備: ( sudo apt-get install -y flex bison gperf libesd0-dev build-essential zip curl valgrind git-core gnupg)

               

    2. 原始碼下載:

        Google使用repo來封裝git對android原始碼進行管理,方便開發,這裡先獲取repo執行指令碼並放到/bin目錄以便執行:

        sudo apt-get install phablet-tools

       

        repo放到/bin目錄後,新建一個資料夾,然後可以下載程式碼了:

        (repo init -u https://android.googlesource.com/platform/manifest -> 這是下載最新的程式碼,現在估計是android7.x了吧,正如研究linux的都喜歡先看linux0.11原始碼,這裡也不求新,先看透2.3.1的原始碼,所以,這裡需要指定下載的原始碼分支)

     

        然後就是漫長的等待過程了……………………

       

        中途如果網路斷開,重新執行"repo sync"即可。Tips: 下載原始碼需要科學上網,哈哈~

        大約花了3小時,下載完成後如下:

       

        根目錄就一個Makefile,看看那裡面有啥:

       

        它只是包含了build/core/main.mk主入庫編譯,再看看它的內容:

        

        接近800行,現在先不看它,先編譯再說,如果編譯都通過不了,看懂了好像不懂,因為你後面都沒法進行程式執行測試。

    3. 原始碼編譯,在原始碼根目錄直接執行make,將編譯Android系統的全部模組

       

        報錯,提示需要JDK1.6版本,那就安裝唄,另外,對於許可權禁止的,增加可執行許可權即可:

       

        上面的執行生成jdk6的包:

        

         新增環境變數即可:

         

          //

         

        接著我們再make一次看看,出現如下錯誤:

       

        安裝依賴庫:

       

        再次make,出現如下錯誤:

       

        安裝依賴庫:

       

        再次make,報錯:

       

        修改檔案frameworks/base/tools/aapt/Android.mk,在28行加多一個引數"-fpermissive":

       

        再次make,提示類似錯誤,修改檔案frameworks/base/libs/utils/Android.mk,在60行增加-fpermissive引數:

       

        再次編譯出現如下錯誤:

       

        安裝依賴包: sudo apt-get install zlib1g-dev && sudo apt-get install lib32z1-dev && sudo apt-get install libncurses5-dev:i386

        另外,為了編譯順利,建議降級gcc和g++到4.4版本:

      sudo apt-get install gcc-4.4 g++-4.4

      sudo rm -rf /usr/bin/gcc

      sudo rm -rf /usr/bin/g++

      sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc

      sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++

      再次make,出現如下錯誤:

     

      編輯提示的檔案,增加如下的28行:

      

       再次make, 出現如下錯誤:

       

        zlib1g-dev有個標頭檔案修改了路徑,及zconf.h放到了/usr/include/x86_64-Linux-gnu/,所以將其拷貝到/usr/include/下即可:

        sudo cp /usr/include/x86_64-linux-gnu/zconf.h /usr/include/

         再次make:

        

         sudo apt-get install libswitch-perl

         再次make,等了半個多小時,終於編譯成功:

        

     4. 生成SDK,可用於開發Android應用程式

           make sdk 

          

     5. 執行

           啟動Android模擬器需要四個檔案:

           1. Linux核心映象檔案--> zImage

           2. Android系統映象檔案--> system.img, userdata.img, ramdisk.img,上面已經編譯生成,在目錄out/target/product/generic下面

           export PATH=$PATH:~/Documents/source_code/android-2.3.1/out/host/linux-x86/bin (out/host/linux-x86/bin目錄下是Android模擬器的位置,這裡加入到環境變數中)

           export ANDROID_PRODUCT_OUT=~/Documents/source_code/android-2.3.1/out/target/product/generic

           啟動模擬器:

           1.  不加任何引數表示已經配置好上面兩行的環境變數: emulator

           2. 如果不配置環境變數,則要加引數指定映象檔案的位置

                emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img

           啟動模擬器提示如下錯誤:

          

           安裝依賴包:(來自StackOver Flow: https://stackoverflow.com/questions/4841908/sdl-init-failure-reason-is-no-available-video-device/22625691)

sudo apt-get install libsdl1.2debian:i386
           然後再次啟動:

          

         可以看看其系統資訊:

         

    6. 下載Linux核心原始碼

          上面使用repo下載同步的Android原始碼並不包含Linux核心原始碼,因此,如果需要定製Linux核心原始碼,就要下載下來自己進行修改編譯,從上面也可以看到Android2.3.1使用的Linux核心位2.6.29。

          我們在Android系統原始碼根目錄下進行如下操作:

          mkdir kernel && cd kernel

          git clone https://android.googlesource.com/kernel/goldfish.git

         

           下載完成後,我們需要checkout核心版本為2.6.29版本的分支:

            cd goldfish

            git branch -a

           git checkout remotes/origin/android-goldfish-2.6.29

          

    7. 編譯Linux核心原始碼

          準備工作:

          修改Makefile檔案,修改目標CPU架構(ARCH)為arm和交叉編譯工具(CROSS_COMPILE),如下195和196行:

         

         Android原始碼提供的交叉編譯工具位於prebuild/linux-x86/toolchain目錄下。

         編譯步驟:

         1. 配置交叉編譯工具的環境變數: export PATH=$PATH:~/Documents/source_code/android-2.3.1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

         2. 生成指定CPU架構的硬體配置檔案

             首先看看模擬器的CPU體系結構版本,為arm v5的,因此使用goldfish_defconfig檔案,若為arm v7的,則使用goldfish_armv7_defconfig:

             

              make goldfish_defconfig

             

         3. 編譯make生成Linux核心映象檔案zImage

        

    8. 基於定製編譯的Linux核心原始碼啟動Android模擬器

          emulator -kernel kernel/goldfish/arch/arm/boot/zImage -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img

          和前面命令相比,就是修改了核心檔案的路徑而已,這裡使它基於剛剛編譯的核心來啟動:

         

    到這裡,Android2.3.1原始碼的開發環境搭建和編譯、模擬器啟動都完成了,可以進入下一步學習了。

        後記:

        原本打算記錄一下流程,結果因為是新配置的Ubuntu虛擬機器,在編譯原始碼那裡遇到一堆問題,總算搞定了,不知不覺,時間到了00:11,趕緊睡覺,明天還要搬磚,啊哈~~