自我進階(二) Aandroid 源碼編譯

Android官方是提供了Android 源碼編譯的方法,在國外的話就相對來說比較簡單了,一是語言無障礙,二是網絡無限制,在國內的話困難就比較多了,網絡就是最大的一點限制

一、 源碼編譯

在編譯之前首先明確一個概念repo

1.1 repo

定義: 一種代碼版本管理工具,它是由一系列的Python腳本組成,封裝了一系列的Git命令,用來統一管理多個Git倉庫

它其實就是用來統一管理git 倉庫的一個管理工具,有一系列的python腳本支撐,Android 源碼的編譯完全依賴於各類python 腳本的執行

1.2 使用外網下載Android 源碼、編譯

1. wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
2. chmod 777 repo
3. cp repo /bin/

緊接着創建放置源碼所需要的文件夾,我這邊是AndroidSource
4. mkdir AndroidSource
5. cd AndroidSource
初始化repo 倉庫
6. repo init -u https://dl-ssl.google.com/dl/googlesource/git-repo/repo
同步repo 的源碼 (時間較長)
7. repo sync

進到源碼目錄,執行make 命令

1.2 使用清華ASOP鏡像同步源碼、編譯

  • repo
1. git clone https://aosp.tuna.tsinghua.edu.cn/git-repo/
2. chmod a+x git-repo/repo
// 使用echo $PATH 命令查看一環境變量
3. export PATH=路徑/git-repo:$PATH
// 配置好環境變量之後,使用vim 打開repo 文件,修改一下repo_url,repo的下載地址
4. sudo vim repo 使用vim編輯,找到repo_url 修改其路徑爲
 https://mirrors.tuna.tsinghua.edu.cn/git/git-repo

以上就是使用清華ASOP安裝了repo

  • 下載源碼
// 創建源碼文件夾AndroidSource
1. mkdir AndroidSource
2. cd AndroidSource
3. repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
// 進到repo中的git 分支管理目錄
4. cd .repo/manifests.git/
// 查看git 的所有分支
5. git branch -a
// 拉取指定版本的分支 android-8.1.0_r41 
6. repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r41
// 執行完畢之後 同步代碼
7. repo sync

// 時間較長,期間遇到問題,重試幾遍即可

查看下載的代碼的版本:

Android源碼已全編譯過,在out/target/product/generic_arm64/system/build.prop裏面查看ro.build.version.release的值
  • 編譯

在編譯之前確保已經進行了環境配置、所需工具、依賴等的安裝《自我進階(一) Android 源碼編譯,環境準備》

  • 編譯之前看一下編譯步驟中的操作的意義
  1. . build/envsetup.sh

主要作用:

  1. 加載了編譯時使用到的函數命令,如 help、lunch、mmm等
  2. 添加兩個編譯選項: generic-eng 和 simulator ,兩個選項是系統默認選項
  3. 查找vendor/<-廠商目錄>/和vendor/<廠商目錄>/build/目錄下的vendorsetup.sh,如果存在的話,加載執行它,添加廠商自己定義產品的編譯選項
    其實,上述第3條是向編譯系統添加了廠商自己定義產品的編譯選項,裏面的代碼就是:add_lunch_combo xxx-xxx。
// cd 到源碼目錄 初始化編譯環境
4. . build/envsetup.sh
// 初始化編譯環境後引入了一些執行腳本,包括lunch命令,lunch指令可以設置編譯目標(編譯目標就是編譯後運行的設備) ,在此編譯目標爲aosp_arm64-eng
5. lunch aosp_arm64-eng
// j8 編譯開啓8個線程進行編譯 最大不能超過CPU內核的2倍,可以使用cat /proc/cpuinfo查看相關cpu信息
6. make -j8

二、 常見問題

說明:在編譯的時候我就遇見了兩個問題及缺失的依賴,具體依賴在《自我進階(一) Android 源碼編譯,環境準備》中有記錄

  • jdk 版本問題,

根據error 提示安裝相應的jdk

  • sizeof (_nl_value_type_LC_TIME[0]))’ ???

使用export LC_ALL=C 去除本地化配置

  • 其他

具體問題可以聯繫我,同步一下常見問題

三、運行模擬器

當走到這一步的時候基本上已經搞定了Android源碼的編譯,

  • 使用emulator 運行模擬器
// 模擬器需要四個文件
1. Linux Kernel
2. system.img
3. userdata.img
4. ramdisk.img

在lunch 命令時選擇的是aosp_arm64-eng,因此linux默認使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件則是使用的source/out/target/product/generic64目錄下的system.img、userdata.img和ramdisk.img。這些文件都是編譯得來的

  • 使用emulator之後會出現Android 模擬器,並啓動
    在這裏插入圖片描述

這就完成了Android 源碼的編譯,那麼花費如此多的時間我們編譯就是爲了運行模擬器嗎?當然不是,接下來要做的就是,使用Google提供的命令來單獨編譯模塊,

  • 比如說是單獨編譯SystemUI \StorageManager等等,
  • 這麼向Android 系統中添加自己創建的模塊
  • 通過自己創建的模塊 觀察分析Activity的啓動方式、進程間的通信機制、各種控件是怎麼繪製的怎麼展示的等等
  • 具體都會在自我進階系列中更新

編譯命令解析,參考於 Android編譯詳解之lunch命令

下一篇: 自我進階(三) 編譯完源碼我們應該怎麼做

上一篇:
自我進階(一) Android 源碼編譯,環境準備

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章