文章目錄
1. 編譯下載AOSP
目標板是Nexus 5
步驟如下:
1.1. 安裝虛擬機
想必不用多說
1.2. 搭建環境
按照>>搭建編譯環境<<上的提示搭建環境。
1.3. 下載源代碼
1.3.1. 安裝 Repo
按照網址下載源代碼的提示,第一步是不成問題的,但是第二部會提示連不接不到google服務器,下面使用curl的代理功能
原命令行是這樣的。
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
給它添加代理參數
$ curl --proxy 192.168.85.1:1080 https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
這樣就可以下載 repo 工具了。
1.3.2. 初始化 Repo 客戶端
這裏繼續設置代理,終端運行:
$ export HTTP_PROXY=http://192.168.85.1:1080
$ export HTTPS_PROXY=https://192.168.85.1:1080
然後, repo 就可以走代理了。實測走代理的速度還是很不錯的。
還有一些別的什麼專有二進制文件一起下載就可以了。
1.3.3. 下載 Android 源代碼樹
之前設置過代理的話,這裏就可以下載的動。
1.4. 設置環境
$ source build/envsetup.sh
這個操作只能在當前終端中生效,換一個終端就無效了。
1.5. 選擇目標
使用 lunch 選擇編譯目標。
我這裏是:
$ lunch 19
這個操作同上一個一樣只能在當前終端中生效,換一個終端就無效了。要重新來一遍。
1.6. 編譯代碼
宿主機是8750H,我給虛擬機設置的是12核,所以直接運行
$ make -j 12
跑滿整個CPU就可以了。
1.7. 使用 fastboot 刷機
這個很容易,我這裏是:
$ cd out/target/product/hammerhead
$ fastboot flashall -w
開機後正常運行。
下一步就是寫驅動了。先從內核模塊開始。寫內核模塊就可以不用下載編譯內核了。方便很多。但是也又不方便的的就是需要手動 insmod
,當然也可以使用腳本啥的自動掛載。
2. 編寫內核模塊
目標是寫一個虛擬的存儲器,用來存放或者取出數據。不需要很大,普通的 unsigned char
就可以了。
但是不管怎麼樣,還是把內核下載下來把。參照內核文件的寫法來寫模塊。參考AOSP文檔>>編譯內核<<
2.1 選擇內核
設備 | 二進制文件所在的位置 | 源代碼所在的位置 | 編譯配置 |
---|---|---|---|
volantis | device/htc/flounder-kernel | kernel/tegra | flounder_defconfig |
hammerhead | device/lge/hammerhead-kernel | kernel/msm | hammerhead_defconfig |
flo | device/asus/flo-kernel/kernel | kernel/msm | flo_defconfig |
Nexus 5 需要選擇的高亮顯示出來了。
2.2 確定內核版本
那麼手動選擇內核版本
官方提示可以使用命令行:
dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'
來查看現有內核的版本號。
現有內核的位置是在:/home/godenfreemans/Android/device/lge/hammerhead-kernel/zImage-dtb
,那麼 cd
到這個目錄下運行上面的命令。
可以得到:
Linux version 3.4.0-gcf10b7e ([email protected]) (gcc version 4.8 (GCC) ) #1 SMP PREEMPT Mon Sep 19 22:14:08 UTC 2016
但是沒又說通過這個怎麼找內核版本。選那個最新的。
- android-msm-glowlight-3.18-nougat-dr-wear-release
- android-msm-glowlight-3.18-oreo-wear-dr
- android-msm-glowlight-3.18-pie-wear-dr
- android-msm-hammerhead-3.4-kitkat-mr1
- android-msm-hammerhead-3.4-kitkat-mr2
- android-msm-hammerhead-3.4-kk-fr1
- android-msm-hammerhead-3.4-kk-fr2
- android-msm-hammerhead-3.4-kk-r1
- android-msm-hammerhead-3.4-l-preview
- android-msm-hammerhead-3.4-lollipop-mr1
- android-msm-hammerhead-3.4-lollipop-mr1.1
- android-msm-hammerhead-3.4-lollipop-release
- android-msm-hammerhead-3.4-m-preview
- android-msm-hammerhead-3.4-marshmallow
- android-msm-hammerhead-3.4-marshmallow-mr1
- android-msm-hammerhead-3.4-marshmallow-mr2
- android-msm-hammerhead-3.4-marshmallow-mr3
- android-msm-huawei-3.10-lollipop-mr1-wear-release
- android-msm-huawei-3.10-lollipop-mr1-wear-release-1
commit | cf10b7e6209c43acf70f82b8d01997ffece88835 | [log] [tgz] |
---|---|---|
author | Daniel Rosenberg <[email protected]> | Fri Sep 09 15:26:59 2016 -0700 |
committer | Nick Desaulniers <[email protected]> | Fri Sep 16 12:04:56 2016 -0700 |
tree | c688d3c2b521b6b0018e7f179ecfe7584a7391aa | |
parent | 99666f7a393a2b84a7283e136b9460699be78630 [diff] |
目測這個cf10b7e6209c43acf70f82b8d01997ffece88835
的縮寫就會附着在Linux version 3.4.0
後面吧。就選這個了,最後一個版本的系統肯定用的是最後一個版本的內核。不然。。。。那不是很奇怪?
2.3 下載源代碼
我這裏就直接下在AOSP裏了。
$ mkdir kernel
$ cd kernel
$ git clone https://android.googlesource.com/kernel/msm
這個代碼是包括所有高通平臺的,通過不同的分支可以將對應目標籤出。
2.4 簽出對應內核代碼
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/android-4.4
remotes/origin/android-msm-2.6.35
..
remotes/origin/android-msm-glowlight-3.18-oreo-wear-dr
remotes/origin/android-msm-glowlight-3.18-pie-wear-dr
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
remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release
remotes/origin/android-msm-huawei-3.10-lollipop-mr1-wear-release-1
..
$ git checkout -b android-msm-hammerhead-3.4-marshmallow-mr3 origin/android-msm-hammerhead-3.4-marshmallow-mr3
現在裏面就有代碼了。
2.5 手動編譯內核(可選)
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ cd hikey-linaro
$ git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
$ make hikey_defconfig
$ make
就參考這個來編譯:
$ export ARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ make hammerhead_defconfig
$ make -j 12
很短時間後。。。一個報錯:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/godenfreemans/Android/kernel/msm/kernel/Makefile:129: recipe for target 'kernel/timeconst.h' failed
這好像是再說,我應該omit(忽略)defined,那就試着改一下
把
if (!defined(@val)) {
改成
if (!@val) {
可以編譯出來了。
這個內核是不能加載模塊的。需要將這個功能打開。
2.6 編譯下載可加載模塊功能的內核
讀過《Android內核模塊編譯執行》後,瞭解到這裏需要編譯一個能加載模塊的內核。
就像NuttX一樣。
$ make menuconfig
打開
[*] Enable loadable module support --->
再編譯。
$ make -j 12
下面需要將內核添加到 boot.img 中去。
設定內核位置,在AOSP下:
export TARGET_PREBUILT_KERNEL=~/Android/kernel/mem/arch/arm/boot/zImage-dtb
make bootimage
adb reboot bootloader
fastboot flash boot ./out/target/product/hammerhead/boot.img
現在應該就可以加載模塊了。
2.7 編寫驅動
Google對此沒有什麼說明,看起來只能去其他地方查看了。
參考老羅的文章:《在Ubuntu上爲Android系統編寫Linux內核驅動程序》