Ubuntu 18.04(虛擬機(jī))環(huán)境下編譯Android 源碼

掘金專欄地址:https://juejin.im/post/5b0e591451882515662234cd
android源碼編譯的四個(gè)流程:1.源碼下載;2.構(gòu)建編譯環(huán)境;3.編譯源碼;4模擬器運(yùn)行

  • 1.源碼下載

    • 首先確保自己已經(jīng)安裝了Git.

      sudo apt-get install git 
      git config –global user.email “test@test.com” 
      git config –global user.name “test”
      
      
    • 使用清華大學(xué)鏡像

      mkdir ~/bin
      PATH=~/bin:$PATH
      curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      chmod a+x ~/bin/repo
      //拒絕連接可以使用tuna的git-repo鏡像,將地址換成清華大學(xué)的鏡像地址
      詳情查看網(wǎng)址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
      
      • 使用每月更新的初始化包(也可以傳統(tǒng)的初始化方法澎嚣,因?yàn)榫W(wǎng)絡(luò)慢會(huì)下載失敗放刨,還是直接把初始化包下載下來再進(jìn)行同步)

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

      • 由于所有代碼都是從隱藏的 .repo 目錄中 checkout 出來的矾克,所以只保留了 .repo 目錄竣况,下載后解壓 再 repo sync 一遍即可得到完整的目錄

      使用方法如下:
      
      wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-mo nthly/aosp-latest.tar # 下載初始化包
      tar xf aosp-latest.tar
      cd AOSP   # 解壓得到的 AOSP 工程目錄
      # 這時(shí) ls 的話什么也看不到,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄
      repo sync # 正常同步一遍即可得到完整目錄
      # 或 repo sync -l 僅checkout代碼
      
      • 同步完代碼之后需要直接進(jìn)行編譯的話就是編譯主分支的源碼,如果需要特定版本,則需要自己切換分支,再次同步就切換到指定分支的源碼了端三,執(zhí)行以下命令(這里切換到8.0版本 支持設(shè)備 Pixel XL、Pixel)

        分支列表 代號鹃彻、標(biāo)記和細(xì)分版本號

        repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2
        repo sync
        
  • 2.構(gòu)建編譯環(huán)境

    • 硬件要求:

    • 64位的操作系統(tǒng)只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那么需要32位的操作系統(tǒng).
      磁盤空間越多越好,至少在100GB以上.意思就是,你可以去買個(gè)大點(diǎn)的硬盤了
      如果你想要在是在虛擬機(jī)運(yùn)行l(wèi)inux,那么至少需要16GB的RAM/swap.

    • 軟件要求

    • 安裝 openJDK 8

      sudo apt-get update
      sudo apt-get install openjdk-8-jdk
      
      
    • 依賴設(shè)置:

      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
      
      • 依賴設(shè)置中有可能會(huì)出現(xiàn)“無法定位軟件包 libesd0-dev” 這個(gè)問題
        解決方案:
        在etc/apt   的sources.list 添加鏡像源   deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
        
        然后 sudo apt-get update  接著繼續(xù)使用該命令安裝就可以了
        
    • 操作系統(tǒng)要求

      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
  • 官方編譯環(huán)境搭建文檔地址

    搭建編譯環(huán)境

  • 初始化編譯環(huán)境

    source build/envsetup.sh 
    或者
    . build/envsetup.sh
    
    
    • 選擇目標(biāo)
    . lunch aosp_arm64-eng
    
    
    • 該命令表示針對模擬器進(jìn)行完整編譯郊闯,并且所有調(diào)試功能均處于啟用狀態(tài)。
      如果您沒有提供任何參數(shù)就運(yùn)行命令,lunch 將提示您從菜單中選擇一個(gè)目標(biāo)团赁。
      所有編譯目標(biāo)都采用 BUILD-BUILDTYPE 形式育拨,其中 BUILD 是表示特定功能組合的代號。

    • BUILDTYPE 是以下類型之一:

      編譯類型 使用情況
      user 權(quán)限受限欢摄;適用于生產(chǎn)環(huán)境(沒有root權(quán)和dedug等)
      userdebug 在user版本的基礎(chǔ)上開放了root權(quán)限和debug權(quán)限.
      eng 開發(fā)工程師的版本,擁有最大的權(quán)限,此外還附帶了許多debug工具
  • 3.編譯源碼

    • 您可以使用make編譯任何代碼熬丧。GNUMake可以借助 -jN參數(shù)處理并行任務(wù),通常使用的任務(wù)數(shù)N介于編譯時(shí)所用計(jì)算機(jī)上硬件線程數(shù)的1-2倍之間怀挠。例如析蝴,在一臺雙核 E5520 計(jì)算機(jī)(2 個(gè) CPU,每個(gè) CPU 4 個(gè)內(nèi)核绿淋,每個(gè)內(nèi)核2個(gè)線程)上闷畸,要實(shí)現(xiàn)最快的編譯速度,可以使用介于make -j16 到 make -j32 之間的命令躬它。
    make -j8
    
    • 編譯中

      源碼編譯中
  • 4.編譯完成運(yùn)行

    編譯完成
    • 運(yùn)行模擬器

      //依次輸入以下命令(如果是在編譯成功源碼之后直接想運(yùn)行模擬器腾啥,則直接輸入emulator命令就行东涡,因?yàn)榍懊婢幾g源碼已經(jīng)輸入過以上兩條命令)
      
      . build/envsetup.sh
      
      lunch(選擇剛才你編譯源碼設(shè)置的目標(biāo)版本)
      
      emulator
      
      
      運(yùn)行模擬器
  • 將源碼導(dǎo)入Android Studio 查看

    • 編譯idegen

      source build/envsetup.sh // 將執(zhí)行文件設(shè)置為臨時(shí)變量
      mmm development/tools/idegen/  //生成idegen.jar文件(#### build completed successfully (49 seconds) #### 標(biāo)識生成idegen.jar文件)
      
      
    • 執(zhí)行腳本 idegen.sh

      . development/tools/idegen/idegen.sh
      
      

      看到下圖冯吓,表示編譯idegen完成,執(zhí)行成功后在asop的根目錄下生成android.ipr和android.iml兩個(gè)個(gè)文件:

      • android.ipr 一般保存了工程相關(guān)的設(shè)置疮跑,比如modules和modules libraries的路徑组贺,編譯器配置,入口點(diǎn)等。
      • android.iml 用來描述modules。它包括modules路徑才写、 依賴關(guān)系傲茄,順序設(shè)置等。一個(gè)項(xiàng)目可以包含多個(gè) *.iml 文件移盆。


        image
      • 打開Android Studio,選擇File->Open彈出路徑選擇框,輸入相應(yīng)的源碼根路徑仪吧,然后選擇android.ipr文件,就開始導(dǎo)入源碼,導(dǎo)入快慢和電腦性能有關(guān)鞠眉,一般10至20分鐘薯鼠。
      • 至此整個(gè)源碼編譯完成,并可進(jìn)行源碼查看械蹋。
  • 編譯中遇到的坑

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

      image
      • 解決 :
        1.重新同步代碼 并加入sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
        2.確認(rèn)是否配置好了JDK的環(huán)境變量
  • openJDK 配置環(huán)境變量方法

    1.用gedit文本編輯器在/etc/profile中添加環(huán)境變量:
    命令 : 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出現(xiàn)問題

    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
    

    參考解決辦法地址

  • 編譯出現(xiàn) Try increasing heap size with java option '-Xmx<size>'出皇,編譯失敗

    解決方案,依次執(zhí)行以下命令
    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
    jack-admin kill-server && jack-admin start-server
    

    參考解決辦法地址

最后

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佑颇,一起剝皮案震驚了整個(gè)濱河市顶掉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挑胸,老刑警劉巖痒筒,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茬贵,居然都是意外死亡簿透,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門解藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老充,“玉大人,你說我怎么就攤上這事螟左》茸牵” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵胶背,是天一觀的道長巷嚣。 經(jīng)常有香客問我,道長钳吟,這世上最難降的妖魔是什么廷粒? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮砸抛,結(jié)果婚禮上评雌,老公的妹妹穿的比我還像新娘。我一直安慰自己直焙,他們只是感情好景东,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奔誓,像睡著了一般斤吐。 火紅的嫁衣襯著肌膚如雪搔涝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天和措,我揣著相機(jī)與錄音庄呈,去河邊找鬼。 笑死派阱,一個(gè)胖子當(dāng)著我的面吹牛诬留,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贫母,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼文兑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腺劣?” 一聲冷哼從身側(cè)響起绿贞,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橘原,沒想到半個(gè)月后籍铁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾断,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年拒名,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼冰。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡狞,死狀恐怖耻警,靈堂內(nèi)的尸體忽然破棺而出隔嫡,到底是詐尸還是另有隱情,我是刑警寧澤甘穿,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布腮恩,位于F島的核電站,受9級特大地震影響温兼,放射性物質(zhì)發(fā)生泄漏秸滴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一募判、第九天 我趴在偏房一處隱蔽的房頂上張望荡含。 院中可真熱鬧,春花似錦届垫、人聲如沸释液。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误债。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寝蹈,已是汗流浹背李命。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箫老,地道東北人封字。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像耍鬓,于是被迫代替她去往敵國和親周叮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 還記得那年端午 斯襌 人越長大界斜,越懷念以前每一次過節(jié)的場景仿耽,生活也是越有儀式感。一年有很多個(gè)節(jié)日各薇,有很多...
    斯禪閱讀 325評論 0 1
  • 【禪語】 “禮佛一拜项贺,滅罪河沙;念佛一聲峭判,福增無量”开缎,當(dāng)心地清凈,一塵不染林螃,放棄自私自利奕删,損人利己的念頭,發(fā)利益...
    武漢如心閱讀 414評論 0 1