Ubuntu 18.04(虛擬機)環境下編譯Android 源碼

簡書地址:www.jianshu.com/p/2beae17c9…java

android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4模擬器運行python

  • 1.源碼下載

    • 首先確保本身已經安裝了Git.linux

      sudo apt-get install git 
      git config –global user.email 「test@test.com」 
      git config –global user.name 「test複製代碼
    • 使用清華大學鏡像android

      mkdir ~/bin
      PATH=~/bin:$PATH
      curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      chmod a+x ~/bin/repo
      //拒絕鏈接可使用tuna的git-repo鏡像,將地址換成清華大學的鏡像地址
      詳情查看網址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
      複製代碼
      • 使用每個月更新的初始化包(也能夠傳統的初始化方法,由於網絡慢會下載失敗,仍是直接把初始化包下載下來再進行同步)git

      • 下載地址 每個月更新的初始化包ubuntu

      • 因爲全部代碼都是從隱藏的 .repo 目錄中 checkout 出來的,因此只保留了 .repo 目錄,下載後解壓 再 repo sync 一遍便可獲得完整的目錄api

      使用方法以下:
      
      wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-mo nthly/aosp-latest.tar # 下載初始化包
      tar xf aosp-latest.tar
      cd AOSP   # 解壓獲得的 AOSP 工程目錄
      # 這時 ls 的話什麼也看不到,由於只有一個隱藏的 .repo 目錄
      repo sync # 正常同步一遍便可獲得完整目錄
      # 或 repo sync -l 僅checkout代碼
      複製代碼
      • 同步完代碼以後須要直接進行編譯的話就是編譯主分支的源碼,若是須要特定版本,則須要本身切換分支,再次同步就切換到指定分支的源碼了,執行如下命令(這裏切換到8.0版本 支持設備 Pixel XL、Pixel)bash

        分支列表 代號、標記和細分版本號markdown

        repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2
        repo sync
        複製代碼
  • 2.構建編譯環境

    • 硬件要求:網絡

      • 64位的操做系統只能編譯2.3.x以上的版本,若是你想要編譯2.3.x如下的,那麼須要32位的操做系統. 磁盤空間越多越好,至少在100GB以上.意思就是,你能夠去買個大點的硬盤了啊 若是你想要在是在虛擬機運行linux,那麼至少須要16GB的RAM/swap.
    • 軟件要求

    • 安裝 openJDK 8

      sudo apt-get update
      sudo apt-get install openjdk-8-jdk
      
      複製代碼
    • 依賴設置:

      sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
      sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
      sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
      sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
      sudo apt-get install git-core gnupg flex bison gperf build-essential  
      sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
      sudo apt-get install libc6-dev-i386 
      sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
      sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
      sudo apt-get install lib32z-dev ccache
      複製代碼
      • 依賴設置中有可能會出現「沒法定位軟件包 libesd0-dev」 這個問題
        解決方案:
        在etc/apt   的sources.list 添加鏡像源   deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
        
        而後 sudo apt-get update  接着繼續使用該命令安裝就能夠了
        複製代碼
    • 操做系統要求

      Android版本 編譯要求的Ubuntu最低版本
      Android 6.0至AOSP master Ubuntu 14.04
      Android 2.3.x至Android 5.x Ubuntu 12.04
      Android 1.5至Android 2.2.x Ubuntu 10.04
  • JDK版本要求

    Android版本 編譯要求的JDK版本
    AOSP的Android主線 OpenJDK 8
    Android 5.x至android 6.0 Oracle JDK 7
    Android 2.3.x至Android 4.4.x Oracle JDK 6
    Android 1.5至Android 2.2.x Oracle JDK 5
  • 官方編譯環境搭建文檔地址

    搭建編譯環境

  • 初始化編譯環境

    source build/envsetup.sh 
    或者
    . build/envsetup.sh
    
    複製代碼
    • 選擇目標
    . lunch aosp_arm64-eng
    
    複製代碼
    • 該命令表示針對模擬器進行完整編譯,而且全部調試功能均處於啓用狀態。 若是您沒有提供任何參數就運行命令,lunch 將提示您從菜單中選擇一個目標。 全部編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。

    • BUILDTYPE 是如下類型之一:

      編譯類型 使用狀況
      user 權限受限;適用於生產環境(沒有root權和dedug等)
      userdebug 在user版本的基礎上開放了root權限和debug權限.
      eng 開發工程師的版本,擁有最大的權限,此外還附帶了許多debug工具
  • 3.編譯源碼

    • 您可使用make編譯任何代碼。GNUMake能夠藉助 -jN參數處理並行任務,一般使用的任務數N介於編譯時所用計算機上硬件線程數的1-2倍之間。例如,在一臺雙核 E5520 計算機(2 個 CPU,每一個 CPU 4 個內核,每一個內核2個線程)上,要實現最快的編譯速度,可使用介於make -j16 到 make -j32 之間的命令。
    make -j8
    複製代碼
    • 編譯中

      源碼編譯中

  • 4.編譯完成運行

    編譯完成

    • 運行模擬器

      //依次輸入如下命令(若是是在編譯成功源碼以後直接想運行模擬器,則直接輸入emulator命令就行,由於前面編譯源碼已經輸入過以上兩條命令)
      
      . build/envsetup.sh
      
      lunch(選擇剛纔你編譯源碼設置的目標版本)
      
      emulator
      
      複製代碼

      運行模擬器

  • 將源碼導入Android Studio 查看

    • 編譯idegen

      source build/envsetup.sh // 將執行文件設置爲臨時變量
      mmm development/tools/idegen/  //生成idegen.jar文件(#### build completed successfully (49 seconds) #### 標識生成idegen.jar文件)
      
      複製代碼
    • 執行腳本 idegen.sh

      . development/tools/idegen/idegen.sh
      
      複製代碼

      看到下圖,表示編譯idegen完成,執行成功後在asop的根目錄下生成android.ipr和android.iml兩個個文件:

      • android.ipr 通常保存了工程相關的設置,好比modules和modules libraries的路徑,編譯器配置,入口點等。
      • android.iml 用來描述modules。它包括modules路徑、 依賴關係,順序設置等。一個項目能夠包含多個 *.iml 文件。
      • 打開Android Studio,選擇File->Open彈出路徑選擇框,輸入相應的源碼根路徑,而後選擇android.ipr文件,就開始導入源碼,導入快慢和電腦性能有關,通常10至20分鐘。
      • 至此整個源碼編譯完成,並可進行源碼查看。
  • 編譯中遇到的坑

    • Error: library-pathout/host/linux-x86/lib64/libsepolwrap.so does not exist

      • 解決 : 1.從新同步代碼 並加入sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
        2.確認是否配置好了JDK的環境變量
    • openJDK 配置環境變量方法

      1.用gedit文本編輯器在/etc/profile中添加環境變量:
      命令 : sudo gedit /etc/profile
      
      2.在打開的/etc/profile文件末尾添加下面幾行:
      export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
      export JRE_HOME=${JAVA_HOME}/jre 
      export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
      export PATH=${JAVA_HOME}/bin:$PATH
      
      複製代碼
    • 編譯Android 8.0出現問題

      loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ???
      Aborted (core dumped)
      複製代碼

      能夠在 build/envsetup.sh 最後加入

      export LC_ALL=C
      複製代碼

      參考解決辦法地址

    • 編譯出現 Try increasing heap size with java option '-Xmx',編譯失敗

      解決方案,依次執行如下命令
      export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
      jack-admin kill-server && jack-admin start-server
      複製代碼

      參考解決辦法地址

最後

相關文章
相關標籤/搜索