Android原始碼定製(1)——Android6.0的編譯流程

語言: CN / TW / HK

一、前言

最近在研究Xposed框架定製,恰好又看到看雪上兩個大佬關於原始碼定製Xposed原始碼定製的帖子,所以嘗試基於Android6.0版本,詳細記錄一下從原始碼下載到Xposed框架定製的全過程。

二、Android 原始碼下載

1.環境準備

| 實驗平臺: | Ubuntu 16.0.4 | | -------------- | --------------------------- | | 執行記憶體: | (實體記憶體4G+交換記憶體8G) | | 磁碟空間: | 300G |

(1)記憶體配置

我們首先給虛擬機器分配一個實體記憶體4G 然後設定虛擬記憶體8G,開始實驗之前記得快照,考慮到原始碼編譯可能需要很大的記憶體,我們提前配置好交換記憶體

java (1)在Home目錄建立一個大小為8G的swap檔案 $ sudo dd if=/dev/zero of=/swapfile bs=1M count=8k 注:從 /dev/zero 檔案讀出內容並存到/swapfile檔案中,塊大小為1MByte,總共 16K 個塊,也就是總共 8GB (2)格式化新增的swap檔案: $ sudo mkswap /swapfile (3)啟動新增的swap檔案 $ sudo swapon /swapfile (4)通過free命令就可以看到,swap分割槽增大了8G $ free (5)關閉新增的swap檔案 $ sudo swapoff /swapfile 再次通過free命令就可以看到,swap分割槽減小了8G (6)開機後自動啟動新增的swap檔案,在/etc/fstab中新增如下命令 $ vim /etc/fstab /swapfile none swap sw 0 3

(2)磁碟擴充套件

我們可以為虛擬機器設定一個比較大的磁碟空間,但是如果你的虛擬機器已經分配了一個磁碟空間,可能你需要擴充套件你的磁碟空間,這裡可以詳細參考磁碟空間擴充套件,去擴大你的虛擬機器磁碟,這裡最好保證自己的磁碟空間充足。

2.配置adb和fastboot

(1)下載platform-tools壓縮包

我們到後面需要使用adb和fastboot,所以我們需要下載platform-tools資源包

然後我們解壓到自己的目錄

java mkdir -p /home/user/Android unzip platform-tools_r30.0.5-linux.zip -d /home/user/Android

(2)配置環境變數

我們配置環境變數

``` vim ~/.bashrc 新增:

add Android Sdk platform tools to path

add START

export ADB_PATH=/home/tom/Android/platform-tools export PATH=$PATH:$ADB_PATH

add END

啟用環境: source ~/.bashrc ```

我們可以測試一下配置:

image-20210926214750048

(3)安裝repo命令

建立必要目錄,git-repo工具儲存目錄,這裡需要儲存在bin目錄下,不然後面可能出問題

mkdir /home/tom/bin ##沒有就建立

由於使用Google的repo源需要掛代理,所以我們使用清華的源repo源,無需掛程式碼就可以很快下載Android原始碼了

java curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o /home/tom/bin/repo cp repo ~/bin/

後面是對應的repo儲存路徑

image-20210929092905942

image-20210929092947786

設定許可權:

java chmod +x /home/tom/bin/repo

由於bin的環境變數已經配置過了,所以我們只需要去加入REPO_URL,來更新映象源

配置環境變數:

```java vim  ~/.bashrc

在bashrc中新增

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

啟用環境變數

source  ~/.bashrc ```

配置環境變數或下載repo失敗時,注意一下空格,大部分是此原因導致的

(4)下載原始碼

清華的映象源官網上我們可以看見有兩種方法:

<1>使用每月更新的初始化包

我們初始化程式碼倉庫:

cd /home/tom/SourceCode/

我們下載初始包,我們需要下載最新的aosp-latest.tar檔案以及對應的md5值,官方映象網址

image-20210929103113870

我們可以驗證檔案的完整性,進行MD5校驗

md5sum aosp-latest.tar

下載完畢後可以使用tar -zxvf aosp-latest.jar指令解壓該檔案,解壓出來資料夾名稱為aosp,裡面只有一個叫.repo的隱藏資料夾,該資料夾就是倉庫,安卓原始碼都在裡面,可以使用CTRL+H來檢視該隱藏資料夾

tar -zxvf aosp-latest.jar

然後我們只需要在目標資料夾下同步即可

repo sync

<2>傳統的初始化方法

我們進入我們的目標資料夾

cd SourceCode/Android6

然後我們初始化廠庫:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20

image-20210929102809637

這裡注意我們的每個分支應該根據我們的裝置情況而選定,詳細參考官網:Android原始碼

初始化成功後,系統將顯示一條訊息,告訴您 Repo 已在工作目錄中完成初始化。客戶端目錄中現在應包含一個 .repo 目錄,清單等檔案將儲存在該目錄下

同步原始碼樹:

repo sync

(5)編寫不死指令碼

由於我們在下載原始碼的過程中,時間太長可能會中途失敗,所以我們需要編寫不死指令碼down.sh,保持執行

```java

!/bin/bash

echo  "==========start repo sync===" repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r20 repo sync -j4 -d --force-sync --no-clone-bundle while [ $? = 1 ]; do
echo “======sync failed, re-sync again======”
sleep 3
repo sync -j4 -d --force-sync --no-clone-bundle done ```

然後我們將down.sh啟動

java chmod a+x down.sh ./down.sh

三、Android 原始碼編譯

1.實驗準備

(1)實驗環境

由於關於原始碼下載的過程比較緩慢,這裡方便實驗,就不演示下載的流程了,這裡會給大家在附件提供各個版本的android系統原始碼,方便大家進行實驗,本文所需要的實驗:

| 實驗平臺: | Ubuntu 16.0.4 (執行記憶體4GB+CPU 4+磁碟300G) | | ----------------- | ----------------------------------------------- | | Android原始碼: | android-6.0.1_r1 | | 實驗手機 | Google nexus5 |

(2)JDK配置

我們在Android原始碼編譯過程中,一定要注意對應Android版本的平臺要求,和Android版本所需要的JDK版本,參考官方網址

image-20210926214750048

image-20210926214816258

<1> 常見方法

經過網上的資料查詢,考慮到Ubuntu16倉庫裡面的映象已經沒有OpenJDK7的版本,所以要替換映象源:

首先進行備份一下:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

進行修改:

sudo gedit /etc/apt/sources.list

下面是一些映象源:

阿里源

官方配置

```java deb http://mirrors.aliyun.com/ubuntu/ xenial main deb-src http://mirrors.aliyun.com/ubuntu/ xenial main

deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main

deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe

deb http://mirrors.aliyun.com/ubuntu/ xenial-security main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe ```

清華源

官方配置

```java

預設註釋了原始碼映象以提高 apt update 速度,如有需要可自行取消註釋

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

預釋出軟體源,不建議啟用

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse

deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse

```

ubuntu映象

java deb http://cn.archive.ubuntu.com/ubuntu/ groovy main universe restricted multiverse deb-src http://cn.archive.ubuntu.com/ubuntu/ groovy main universe restricted multiverse #Added by software-properties deb http://security.ubuntu.com/ubuntu/ groovy-security main universe restricted multiverse deb-src http://cn.archive.ubuntu.com/ubuntu/ groovy-security main universe restricted multiverse #Added by software-properties deb http://cn.archive.ubuntu.com/ubuntu/ groovy-updates main universe restricted multiverse deb-src http://cn.archive.ubuntu.com/ubuntu/ groovy-updates main universe restricted multiverse #Added by software-properties

然後我們需要將apt install更新一下

```

apt-get update

```

然後我們需要向ubuntu的映象裡面新增openjdk7 的倉庫,開始下載:

java sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openjdk-7-jdk

這樣就可以將openjdk7下載完成,但是這裡好像並不適用,所以我在這裡直接給出我找到的壓縮包,大家解壓一些就可以了

<2> 壓縮包解壓

我們將壓縮包直接解壓,壓縮包見附件

java tar -zxvf jdk-7u80-linux-i586.tar.gz

image-20210927093209306

配置環境變數:

java sudo gedit /etc/profile 在檔案最後新增環境變數 export JAVA_HOME=/home/tom/bin/java-se-7u75-ri export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin

啟用環境變數

source /etc/profile

檢測jdk版本

image-20210927093720491

這樣我們的jdk環境就配置完成,當然我們為了方便後續多版本切換,我們還可以設定jdk版本切換

(3)JDK版本切換

<1>設定序列號

我們需要使用update-alternatives設定序列號方便我們選擇

```java

update-alternatives --install /usr/bin/java java /home/tom/bin/java-se-7u75-ri/bin/java 3

update-alternatives --install /usr/bin/javac javac /home/tom/bin/java-se-7u75-ri/bin/javac 3

```

<2>切換設定jdk版本

java # update-alternatives --config java

image-20210927093720491

我們選擇對於的版本序號

image-20210927094633711

然後我們再次驗證版本:

image-20210927094633711

我們可以同樣的配置javac,這樣我們就可以完成jdk的版本切換了

<3>刪除設定版本

java update-alternatives –remove java /home/tom/bin/java-se-7u75-ri/bin/java

(4)常見錯誤

下面主要介紹jdk配置引起的錯誤:

<1>錯誤1

image-20210927094918651

原因分析:

(1)這可能是倉庫中沒有openjdk引起 (2)這可能是沒有更新apt的下載源

解決辦法:

切換映象源,然後更新 apt-get update,詳細可以參考上文常見方法中映象源的設定

<2>錯誤2

image-20210927094918651

原因分析:

java (1)使用java版本選擇工具可能無法識別到jdk1.7 (2)進行make會提示jdk1.7是不能識別的openJDK1.7,這裡主要是makefile裡的正則表示式判斷失誤,所以需要修改makefile

解決辦法:

1.修改安卓原始碼目錄下的/build/envsetup.sh

sudo gedit build/envsetup.sh 直接搜尋set_java_home 然後將三處地方修改成我們的路徑

image-20210927094918651

2.註釋版本檢測的終止語句

```java1

編輯主make檔案

sudo gedit build/core/main.mk

註釋掉第 171 行的終止命令

$(error stop)

```

image-20210927094918651

儲存後按照正常的編譯命令進行make就可以了

<3>錯誤3

image-20210927094918651

原因分析:

java 經過檢查原來是我們javac環境沒有切換,我們將javac環境切換,然後重新編譯

解決辦法:

配置javac

image-20210927094918651

<4>錯誤4

image-20210927094918651

原因分析:

這是由於javadoc沒有配置導致的

問題解決:

配置javadoc

```java

update-alternatives --install /usr/bin/javadoc javadoc /home/tom/bin/java-se-7u75-ri/bin/javadoc 3

```

2.環境配置

(1)原始碼準備

我們可以通過使用repo來從官方的映象來下載Android原始碼,但是這樣需要的時間較長,這裡我們直接提供了各個版本系統原始碼的壓縮包,大家直接匯入後,進行解壓即可

解壓命令:tar -zxvf android-6.0.1_r1

image-20210926204554020

(2)配置驅動檔案

我們需要下載對應裝置的驅動檔案,這裡我們使用的是Google nexus5,我們可以去官方網址下載:

image-20210926204554020

我們可以看到這裡的裝置驅動型號很多,我們可以根據我們的裝置型號去選擇對應的裝置驅動,這裡我們就將這三個裝置驅動下載並放入我們的原始碼下

image-20210926204554020

然後我們依次的執行驅動檔案

java sh extract-broadcom-hammerhead.sh

按Enter鍵一行行的檢視,經過實驗,當不停的確認到了8條後e結束,需要我們輸入I ACCEPT,這樣就解壓到了vendor 目錄下,其他兩個指令碼同樣這樣執行

image-20210926204554020

三個檔案解壓後的目錄:

image-20210926204554020

(3)初始化編譯環境

<1>修改原始碼

首先我們需要修改原始碼,修改原始碼檔案中:art/build/Android.common_build.mk裡的內容

image-20210927100604203

不然容易報錯:

image-20210927100604203

原因分析:

java 修改的目的是把 CLANG 這個編譯選項關掉,這個錯誤只會在 Ubuntu16.04 上遇到,Ubuntu14.04 則不存在這個問題

<2>設定快取記憶體

我們在編譯原始碼之前為了提高編譯的速率:

在 .bashrc檔案末尾新增:export USE_CCACHE = 1

echo export USE_CCACHE=1 >> ~/.bashrc

為了提高編譯效率,設定編譯器快取記憶體:

prebuilts/misc/linux-x86/ccache/ccache -M 50G

<3>清空輸出和初始化環境

我們可以在開始編譯之前清楚之前所有編譯操作的輸出,避免出現錯誤,首次編譯不需要:

make clobber

image-20210926204554020

然後使用build目錄中的envsetup.sh指令碼初始化環境:

source build/envsetup.sh 或 . build/envsetup.sh

image-20210926204554020

(4)選擇編譯目標

我們選擇編譯的具體目標,也就是指我們是將我們的原始碼編譯到虛擬機器還是具體的手機上執行,這裡我們可以先看官方給的型號圖

image-20210926210739483

我們輸入指令:lunch

image-20210926213243118

參考官方解釋:

image-20210926211110079

image-20210926212512938

我們可以理解為:

java user--------->終端使用者機 userdebug---->除錯測試機 eng---------->工程機

(5)編譯程式碼

這裡我們開始編譯原始碼,執行make -j4,4為同時編譯的執行緒數,大家可以根據自己的裝置情況選擇

make -j4

檢視cpu核心個數命令:

cat /proc/cpuinfo

編譯結束,經過了漫長的過程,我們總算可以看見我們編譯成功

image-20210926213243118

我們進入輸出的目錄資料夾下:

image-20210926213243118

Android映象結構分析詳細可以見(8)

(7)編寫刷機指令碼

我們將手機進入bootloader模式:

adb reboot bootloader

手機如果沒有解鎖,我們需要解鎖

fastboot oem unlock

我們將選中映象匯出,並刷入手機,編寫刷機指令碼,windows上檔案字尾.bat,linux上檔案字尾.sh

fastboot flash boot boot.img fastboot flash system system.img fastboot flash cache cache.img fastboot flash userdata userdata.img fastboot reboot

然後我們啟動刷機指令碼,就可以看見手機正常的刷入

image-20210926213243118

image-20210926213243118

(8)Android主要映象解析

刷機包目錄:

image-20210927105814789

主要映象:

image-20210927104439801

詳細參考部落格:android 主要映象(image)解析

(9)常見錯誤

<1>錯誤1

image-20210927104439801

類似錯誤:make:Nothing to be done for 'all_modules' 或 make:***No rule to make target Android.mk Stop等

解決辦法:

java (1)進入目錄:/out/target/common/obj/JAVA_LIBRARIES,刪除services_intermediates這個資料夾 (1)進入目錄:/out/target/product/XXX/obj/JAVA_LIBRARIES,刪除services_intermediates這個資料夾

<2>錯誤2

image-20210927104439801

問題分析:

這個錯誤的好像是由於在make一個任務時,並沒有結束,這時在進行make就會報

我們使用命令:

make clobber

make clobber的功能是把上一次make命令生成的檔案或目錄清除掉,效果比make clean更嚴格

四、實驗總結

本文詳細記錄了從Android6.0原始碼下載到Android原始碼編譯的詳細過程,其中參考了看雪上面的兩位大佬帖子和網路上的一些部落格,中間遇到了很多問題,並逐一解決,這裡將所有的錯誤情況總結並放在了錯誤區,大家可以詳細的對照,通過原始碼編譯的過程,對Android系統的理解更加的深入了,接下來便開始進行Xposed原始碼的編譯和定製,本文有什麼問題就請大佬們指正了。

這裡給大家提供android版本的原始碼和OpenJDK7的下載包,大家也可以去github上免費下載,後續都會上傳到github上:github網址

五、參考文獻

JDK環境配置:

(1)https://blog.csdn.net/u014709812/article/details/114584639?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.searchformbaiduhighlight&spm=1001.2101.3001.4242 (2)https://blog.csdn.net/xiangzi10/article/details/95730747 (3)https://forum.xda-developers.com/t/q-kitkat-hammerhead-aosp-compilation-errors.2736673/ (4)https://blog.csdn.net/qq_42824983/article/details/110236257

Android原始碼下載:

(1)https://bbs.pediy.com/thread-264521.htm (2)https://www.cnblogs.com/coffee520/p/9639417.html (3)https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ (4)https://source.android.com/source/downloading

Android原始碼編譯:

(1)https://bbs.pediy.com/thread-218513.htm (2)https://blog.csdn.net/pengtgimust/article/details/90758507 (3)https://blog.csdn.net/fuchaosz/article/details/51487585 (4)https://juejin.cn/post/6844904191693946887 (5)https://blog.csdn.net/u012417380/article/details/72843185 (6)https://www.cxyzjd.com/article/xjkelwh/103045055 (7)https://blog.csdn.net/cnliwy/article/details/52189349 (8)https://blog.csdn.net/warticles/article/details/81063377

本文由安全後廚團隊分享,轉載請註明來源,違者必究!