首頁 > 軟體

編譯Android核心 For Nexus 5 燒錄過程記錄

2020-06-16 17:14:17

參考Android系統原始碼情況分析第二章進行實踐,為了提高效率,也為了增加實踐機會,使用Nexus5進行核心編譯。需要說明的是,Android原始碼工程預設是不包含它所使用的Linux核心原始碼,如果需要執行客製化的Linux核心,就要單獨下載核心原始碼,並且對它進行編譯。Nexus Android原始碼的編譯參考  http://www.linuxidc.com/Linux/2017-05/144123.htm

1、下載nexus5 對應的核心原始碼

    Android系統使用的是Linux核心,但與主線分枝的Linux核心又有一些差異,各個不同的廠商又有自己的修改。核心原始碼位於谷歌境外伺服器,不FQ無法存取,這給同步原始碼造成很大的不便。幸好清華大學的開源伺服器上也同步了AOSP核心的原始碼,使得我們無須FQ就可以同步原始碼。

  對映關係如下:

名稱     Google GIT地址     清華伺服器地址
common     https://android.googlesource.com/kernel/common.git     https://aosp.tuna.tsinghua.edu.cn/kernel/common.git
exynos     https://android.googlesource.com/kernel/exynos.git     https://aosp.tuna.tsinghua.edu.cn/kernel/exynos.git
goldfish     https://android.googlesource.com/kernel/goldfish.git     https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
hikey-linaro     https://android.googlesource.com/kernel/hikey-linaro     https://aosp.tuna.tsinghua.edu.cn/kernel/hikey-linaro.git
lk         https://aosp.tuna.tsinghua.edu.cn/kernel/lk.git
msm     https://android.googlesource.com/kernel/msm.git     https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
omap     https://android.googlesource.com/kernel/omap.git     https://aosp.tuna.tsinghua.edu.cn/kernel/omap.git
samsung     https://android.googlesource.com/kernel/samsung.git     https://aosp.tuna.tsinghua.edu.cn/kernel/samsung.git
tegra     https://android.googlesource.com/kernel/tegra.git     https://aosp.tuna.tsinghua.edu.cn/kernel/tegra.git
x86_64     https://android.googlesource.com/kernel/x86_64.git     https://aosp.tuna.tsinghua.edu.cn/kernel/x86_64.git
由於nexus5使用的是高通處理器,所以直接同步msm的連結
ninjame@Ubuntu1604:~/aosp$ mkdir kernel
ninjame@ubuntu1604:~/aosp$ cd kernel
ninjame@ubuntu1604:~/aosp/kernel$ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git

git branch 檢視Android核心原始碼的程式碼版本分支

ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -a
* (頭指標分離於 7717f76)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/android-4.4
  remotes/origin/android-4.4.y
……
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
  remotes/origin/android-msm-hammerhead-3.4-kk-fr1
  remotes/origin/android-msm-hammerhead-3.4-kk-fr2
  remotes/origin/android-msm-hammerhead-3.4-kk-r1
  remotes/origin/android-msm-hammerhead-3.4-l-preview
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-release
  remotes/origin/android-msm-hammerhead-3.4-m-preview
  remotes/origin/android-msm-hammerhead-3.4-marshmallow
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3
…… 

和nexus5 相關的且是adnoid6.0 版本的核心分支共有4個,到底checkout哪個分支呢?對於Android的原始碼與Android核心原始碼版本的對應關係,很難說得清楚。經過摸索,找到一種比較討巧的方法,直接進入手機設定,檢視關於手機

 

核心版本是3.4.0-g7717f76

ninjame@ubuntu1604:~/aosp/kernel/msm$ git checkout 3.4.0-g7717f76

當發現真的把相應分支原始碼的原始碼給同步過來,竟然有種意外的驚喜,這是怎麼回事呢?

ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -r --contains 7717f769b2d0bf26db19598d8826a01b82ab6540
  origin/android-msm-hammerhead-3.4-marshmallow-mr1
  origin/android-msm-hammerhead-3.4-marshmallow-mr2
  origin/android-msm-hammerhead-3.4-marshmallow-mr3

7717f76對應著原始碼中的一個commit節點,可以看做是git庫上最小的分支(分支都是從commit節點拉出來的,那麼每一個節點都可以看做一個分支,當然某些分支中只包含它自己)

3.4.0-g7717f76  就可以解讀為該核心版本大的分支為linux3.4.0,具體的原始碼對應於commit節點為7717f76 那一次提交程式碼對應的快照。

2、設定編譯環境

由於是在 Linux / Mac OS X 上進行編譯,所以交叉編譯的環境變數是必須要設定的,一共涉及到三個。

首先設定 ARCH,–注意,由於 Nexus 5 是32位元架構,所以取值為 arm,如果是64位元,則要取值為 arm64

export ARCH=arm

然後設定 CROSS_COMPILE,同上,64位元要取值 aach64-linux-android-

export CROSS_COMPILE=arm-eabi-

對應地,告訴編譯系統到哪裡尋找編譯器

export PATH=$PATH:/home/ninjame/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin

 3、編譯

開始編譯之前,不要著急開始,先使用 help 看有哪些預定義好的設定

make help

從上面可以找到 hammerhead_defconfig,這正是 Nexus 5 的預設設定

make hammerhead_defconfig

上述就是生成設定,如果需要調整,則可以繼續執行

make menuconfig

最後執行編譯吧

make

成功編譯後,可以看到類似如下的輸出:
OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  DTC    arch/arm/boot/msm8974-hammerhead-rev-11.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-11j.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-10.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-c.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-b.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-bn.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-a.dtb
  DTC    arch/arm/boot/msm8974-hammerhead-rev-f.dtb
  CAT    arch/arm/boot/zImage-dtb
  Kernel: arch/arm/boot/zImage-dtb is ready
make[1]: Nothing to be done for 'arch/arm/boot/dtbs'.

編譯碰到的問題;

問題1:
File "/home/ninjame/aosp/kernel/msm/scripts/gcc-wrapper.py", line 55
    print "error, forbidden warning:", m.group(2)

解決:由於本人把機器上的python給改成3.5了,不支援這種print語法
sudo rm /usr/bin/python,刪除
sudo ln -s /usr/bin/python2.7 /usr/bin/python,預設設定成python2.7

這樣在終端中輸入python預設就是 2.7版本了http://www.linuxidc.com/Linux/2011-05/36339.htm

http://www.linuxidc.com/Linux/2009-08/21314.htm

問題2:  
CHK    include/linux/version.h
  CHK    include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
  CC      kernel/bounds.s
arm-eabi-gcc: No such file or directory
Is your PATH set correctly?
/home/ninjame/aosp/kernel/msm/./Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 2
Makefile:993: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2
解決:環境變數沒設定好,最開始設定成了
export PATH=$PATH:/home/ninjame/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/arm-eabi/bin
提示再明顯不過了
ninjame@ubuntu1604:~/aosp/prebuilts$ find -name "arm-eabi-gcc"
./gcc/darwin-x86/arm/arm-eabi-4.8/bin/arm-eabi-gcc
./gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gcc

問題3:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/ninjame/aosp/kernel/msm/kernel/Makefile:129: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:953: recipe for target 'kernel' failed
make: *** [kernel] Error 2
解決:
其實,提示的錯誤資訊已經明確告訴你了,你應該省略defined() 。開啟 kernel/timeconst.pl
將if (defined(@val)) 改為if (@val),再次編譯就可以通過
 

4、重新整理核心

進入到了 Android 原始碼目錄,設定環境變數,告知已編譯好的新核心地址

ninjame@ubuntu1604:~/aosp/kernel/msm$ cd arch/arm/boot/
ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ ls -l zImage-dtb
-rw-rw-r-- 1 ninjame ninjame 8441144 5月  23 00:27 zImage-dtb
ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ pwd
/home/ninjame/aosp/kernel/msm/arch/arm/boot

export TARGET_PREBUILT_KERNEL=/home/ninjame/aosp/kernel/msm/arch/arm/boot/zImage-dtb

重新編譯bootimage

make bootimage

成功後,若有類似如下的輸出:

Copy: out/target/product/hammerhead/kernel
Target boot image: out/target/product/hammerhead/boot.img
out/target/product/hammerhead/boot.img maxsize=23519232 blocksize=135168 total=9369600 reserve=270336

#### make completed successfully (03:29 (mm:ss)) ####

重新啟動手機進入bootloader模式

adb reboot bootloader

刷入核心

fastboot flash boot boot.img

重新啟動手機

fastboot reboot

~曬圖,換上自己的簽名了,哈哈~  ,不過g4ad03fa 打臉了。。。


IT145.com E-mail:sddin#qq.com