官术网_书友最值得收藏!

2.2 Android源代碼下載及編譯過程

前面已經完成了Ubuntu Linux、OpenJDK和編譯Android源碼所需的系統工具包的安裝和配置,接下來開始下載和編譯Android 8.1.0源代碼,這個過程簡單但花費的時間比較長。

2.2.1 工作目錄設置

Android 8.0的代號為Oreo,簡稱O,中文名稱奧利奧。采用名稱Oreo作為本書選用Android 8.1.0版本源代碼的根目錄,在用戶根目錄下新建代碼根目錄Oreo文件夾,并設置此目錄為工作目錄,在.bashrc中增加export $oreo=~/code/Oreo。

注意

在Android開發過程中,配置工作目錄的環境變量有利于提升工作效率,主要體現在一些Android工具命令、代碼路徑、編譯結果路徑等配合工作目錄的環境變量使用會簡化操作,讀者在使用過程中可逐步體會;后續涉及的$oreo即是Android 8.1.0源代碼的根目錄路徑。

2.2.2 源代碼下載

Android 8.1.0源代碼的本地目錄已經建立,接下來就要開始下載代碼了,相關操作及說明如下:

repo腳本是Android項目編寫的Python腳本,用來統一管理Android項目的代碼倉庫

$ sudo apt-get install python
$ curl https://storage.googleapis.com/git-repo-downloads/repo > repo
$ chmod a+x repo

注意

在~/用戶主目錄下新建一個bin目錄,并將此目錄設置在PATH目錄中;我們將在此目錄下保存常用的一些腳本或二進制可執行程序,以后不必更新系統環境變量就能在任意目錄執行這些腳本或可執行程序。

$ mkdir ~/bin
$ vi ~/.bashrc
//在文件最后一行增加PATH=~/bin:$PATH,保存退出
$ source .bashrc//立即生效配置的PATH目錄
$ mv repo ~/bin/
$ cd $oreo
//配置git個人信息
$ git config --global user.name android_tele
$ git config --global user.email android_tele @163.com
//查看配置的git信息
$ cat ~/.gitconfig
[user]
         name = android_tele
         email = android_tele @163.com
[color]
         ui = auto
//獲取Android源碼分支信息
$ repo init -u https://android.googlesource.com/platform/manifest
  ......
  * [new tag]            android-8.0.0_r32 -> android-8.0.0_r32
  * [new tag]            android-8.0.0_r33 -> android-8.0.0_r33
  * [new tag]            android-8.0.0_r34 -> android-8.0.0_r34
  * [new tag]            android-8.0.0_r35 -> android-8.0.0_r35
  * [new tag]            android-8.0.0_r36 -> android-8.0.0_r36
  * [new tag]            android-8.0.0_r4 -> android-8.0.0_r4
  * [new tag]            android-8.0.0_r7 -> android-8.0.0_r7
  * [new tag]            android-8.0.0_r9 -> android-8.0.0_r9
  * [new tag]            android-8.1.0_r1 -> android-8.1.0_r1
  ......
//讀者可根據實際情況,選擇最新的Android源碼分支下載,本書選擇android-8.1.0_r1分支下載
$ repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1
 repo has been initialized in /home/android/Oreo
$ repo sync –j8 //開始下載Android O源碼,工作進程數量,本例中使用8個,讀者可以根據網絡帶寬進行調整

//這個過程花費的時間很長,視網絡情況而定;建議讀者在晚上下載,如果中途代碼下載中斷了,也不必擔心,
//repo sync支持續傳

2.2.3 開始編譯Android源代碼

Android 8.1.0源代碼下載完成后,可以開始編譯源碼,詳情見如下操作及相關說明。

$ cd $oreo
$ source build/envsetup.sh //或者. build/envsetup.sh //加載編譯腳本
//使用第二種方法需要注意,build前有一個空格
including device/asus/fugu/vendorsetup.sh
including device/generic/car/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
......
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including sdk/bash_completion/adb.bash
$ lunch //選擇編譯的產品信息

You're building on Linux

Lunch menu...... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     ......
     28. aosp_angler-userdebug
     29. aosp_bullhead-userdebug
     30. aosp_bullhead_svelte-userdebug
     31. hikey-userdebug
     32. hikey960-userdebug

Which would you like? [aosp_arm-eng] aosp_arm64-eng
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=8.1.0 //Android O版本
TARGET_PRODUCT=aosp_arm64 //lunch選擇aosp_arm64-eng
TARGET_BUILD_VARIANT=eng
......
BUILD_ID=OPM1.171019.011 //編譯號
OUT_DIR=out
AUX_OS_VARIANT_LIST=
============================================
$ make –j8
//編譯時間長,編譯過程中輸出的日志很大,這里對編譯日志進行了省略
//以下是編譯成功日志信息,可以看出成功編譯出system.img鏡像文件
encoding RS(255, 253) to '/tmp/tmpGZPyrs_verity_images/verity_fec.img' for input files:
        1: 'out/target/product/angler/obj/PACKAGING/systemimage_intermediates/system.img'
        2: '/tmp/tmpGZPyrs_verity_images/verity.img'
appending /tmp/tmpGZPyrs_verity_images/verity_fec.img to
 /tmp/tmpGZPyrs_verity_images/verity.img
Running:  append2simg
out/target/product/angler/obj/PACKAGING/systemimage_intermediates/system.img/tmp/
tmpGZPyrs_verity_images/verity.img

 [100% 89721/89721] Install system fs image: out/target/product/generic_arm64/system.img
 out/target/product/angler/system.img+out/target/product/generic_arm64/obj/PACKAGING/
recovery_patch_intermediates/recovery_from_boot.p maxsize=3288637440 blocksize=135168
total=1048456853 reserve=33251328

#### build completed successfully (02:26:35 (hh:mm:ss)) ####

第一次編譯時間較長,不同的計算機花費的時間不同。作者使用較老的筆記本電腦(酷睿 2 代i7+8GB)編譯Android O源碼,共使用了6.5小時。如果計算機處理能力較強,可使用更多的工作進程,比如:make –j16,增加編譯工作進程數從而減少編譯時間。編譯完成后,進入$oreo/out/target/product/generic_arm64目錄,關注此目錄下的system.img、ramdisk.img、userdata.img三個IMG鏡像文件,以及data、obj、root、system等目錄。請讀者自己查看,編譯完成后究竟生成了一些什么文件,這里重點關注system目錄,其主要目錄結構如下。

? app/priv-app(應用apk文件,如TeleService.apk、Mms.apk等)

? bin(可執行文件,app_process32/64、toybox、netd等)

? etc(系統配置信息)

? fonts(字體文件)

? framework(主要保存一些jar包,framework.jar、telephony-common.jar等)

? lib/lib64(主要保存一些so動態鏈接庫文件,libbrillo.solibsurfaceflinger.so等)

? usr(用戶配置信息)

? xbin(系統的一些可執行文件)

2.2.4 編譯單個模塊

整個Android編譯環境搭建已經完成了60%。在前面曾經談到為什么要搭建這樣的編譯環境,那就是能夠調試、運行修改的內容。如果在Telephony應用里修改了Android源碼增加日志打印功能,是不是也要通過make來編譯呢?這樣的話,在編譯方面就需要花很多時間。在Android中能夠按照模塊進行模塊的單獨編譯,可減少不必要的編譯時間開銷。

注意

在進行分模塊編譯之前,必須先完成整體編譯后才能進行,否則不能成功編譯需要單個編譯的模塊。

分模塊編譯主要有三種方式。第一種,在$oreo代碼根目錄下執行mmm module path命令;第二種,進入對應的應用模塊代碼所在目錄執行mm命令;第三種,在$oreo代碼根目錄下執行make module name命令,詳情見如下操作及相關說明。

$ cd $oreo
$ source build/envsetup.sh //或者. build/envsetup.sh
//使用第二種方法需要注意build前有一個空格
$ mmm packages/service/Telephony/      //編譯TeleService應用
$ mmm frameworks/base/                 //編譯framework.jar

$ cd packages/service/Telephony        //TeleService應用代碼目錄
$ mm                                   //編譯TeleService模塊
$ cd $oreo
$ cd frameworks/base                   //進入framework代碼目錄
$ mm                                   //編譯framework
$ cd $oreo
$ make TeleService                     //編譯TeleService應用
$ make framework                       //編譯framework.jar應用

不論采用什么方式編譯單個模塊,編譯成功后,均有類似如下的日志。

[100% 10/10] Install:
out/target/product/generic_arm64/system/priv-app/TeleService/TeleService.apk
#### build completed successfully (01:16 (mm:ss)) ####
[100% 131/31] Install:
out/target/product/generic_arm64/system/framework/arm64/boot.art
#### build completed successfully (05:28 (mm:ss)) ####

注意

建議使用make module name和mmm方式分模塊編譯,編譯過程不涉及目錄的切換,可以減少工作量。而這兩種方式中優先選擇mmm的編譯方式,因為比起make module name方式,它更加省時。

主站蜘蛛池模板: 赤水市| 嫩江县| 石台县| 马关县| 开远市| 永清县| 兴化市| 城步| 彩票| 阿克| 博客| 泽普县| 房山区| 灵石县| 慈溪市| 东阳市| 左权县| 彭山县| 綦江县| 从化市| 诸暨市| 惠水县| 龙游县| 申扎县| 西华县| 沭阳县| 余庆县| 广汉市| 凉城县| 绥江县| 祁连县| 盱眙县| 剑阁县| 阿坝| 金溪县| 广汉市| 河池市| 舟曲县| 河东区| 津南区| 游戏|