エンジニア未満がエンジニア以上を目指す日々(仮)

戦力外通告の悔しさをバネに自身の技術力向上を目指した技術ブログ

Nexus7 用 kernel ビルド

すっかり間があいてしまった。

以前、会社の先輩に言われたことを思い出した。
手順等はブログで情報を集める前に公式をしっかり読むべき。
その上で理解できない部分や不足を先人のブログで補填すると。

というわけで、今回は kernel のビルドと書き換えです。
参考にしたのは google 公式の以下。

Building Kernels | Android Developers

Nexus7 は flo なので msm を取得。

$ cd <android top>
$ mkdir kernel
$ cd kernel
$ git clone https://android.googlesource.com/kernel/msm.git

kernel version を確認

$ cd <android top>/out/target/product/flo/
$ dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
Linux version 3.4.0-gb736a74 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT Fri Dec 13 15:38:16 PST 2013

kernel は 3.4.0-gb736a74 とのこと。
これは Nexus7 の Settings -> About tablet でも確認できるね。

kernel branch を確認

$ cd <android top>/kernel/msm
$ git branch -r
  origin/android-msm-flo-3.4-jb-mr2
  origin/android-msm-flo-3.4-kitkat-mr0
  origin/android-msm-flo-3.4-kitkat-mr1

今回、androidandroid-4.4.2_r2 を使用しているので、きっと最新。

$ git checkout -b my_android-msm-flo-3.4-kitkat-mr1 origin/android-msm-flo-3.4-kitkat-mr1

ビルド準備&ビルド。

$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ make flo_defconfig
$ make -j4 2>&1 | tee log_build.txt

kernel image の組み込み

$ cd <android top>
$ export TARGET_PREBUILT_KERNEL=kernel/msm/arch/arm/boot/zImage
$ make -j4 2>&1 | tee log_build_flo-eng_kernel.txt

boot.img のみを焼き直し。

$ fastboot flash boot out/target/product/flo/boot.img 
$ fastboot reboot

起動。
f:id:hielf:20140412235415j:plain:w300
kernel version が 3.4.0-gac9222c になりましたが、
特に新しい機能が追加になったわけでもなく、
変哲のない AOSP 版 Nexus7 ですね。

余談。
対象デバイス向けの defconfig が存在しない場合に、
対象デバイスから直接 kernel config を取得する方法を確認。

参考にしたのは以下のサイト。
Nexus 7 のカーネルをビルド、あとCIFSとか。 - y-log.net

で、Nexus7 から adb で config.gz を引っ張ろうとするが、、、

$ adb pull /proc/config.gz
remote object '/proc/config.gz' does not exist

あらま、ないね。。
別の方法、boot.img からの取得を試みる。
参考にしたのは以下のサイト。
NEXUS 7 自分でモジュールをbuildするメモ | treffen @ memo

$ cd <android top>/kernel/msm
$ scripts/extract-ikconfig <android top>/out/target/product/flo/boot.img > arch/arm/configs/nexus7_defconfig

これで、対象デバイスで使用されている kernel config を取得完了。