カスタムカーネルを実行するAndroidカーネル

Androidカーネルを取得するには2つの方法があります。1つはデバイスからカーネルを抽出する方法です。この記事には、他の記事「Androidカーネルカーネルの抽出」を参照してください。それは公式のウェブサイトからカーネルのソースコードをダウンロードし、それをコンパイルしてから携帯電話にフラッシュすることです。ここでは、2番目の方法について説明します。

私のコンパイル環境はMac10.10、AndroidデバイスはNexus4、AOSPバージョンはAndroid4.4です。

1.カーネルソースコードを取得する

デバイスのカーネルの責任者に応じて、カーネルソースコードを取得する方法は多数あります。GoogleはAOSP対応デバイス用のカーネルgitリポジトリを提供しており、OEMはさまざまな方法を使用してカーネルソースコードを公開できます。しかし、LinuxカーネルはGPL協定に準拠しているため、カーネルは何であれ確実にリリースされます。ここでは主にAOSPカーネルソースコードについて説明します。
まず、http://source.android.com/source/building-kernels.htmlにアクセスして、デバイスの名前に対応するカーネルソースコードのgitパスを見つけます。デバイスの名前はどのようにしてわかりますか?デバイスのコマンドラインで次のコマンドを入力します。
getprop ro.hardware
デバイスチップモデルの確認方法 デバイスのコマンドラインで次のコマンドを入力します。
shell@mako:/data $ ls /dev/block/platform/                                     
msm_sdcc.1
私のデバイスはNexus4、デバイスのロゴはmako、チップはmsm(クアルコムのチップ)です。
このようにして、カーネルソースコードのアドレスがわかります。AOSPルートディレクトリの下に次のコマンドを入力するだけです。
BriansdeMacBook-Pro:Android4.4 brian$ mkdir kernel && cd $_
BriansdeMacBook-Pro:kernel brian$ git clone https://android.googlesource.com/kernel/msm
数分で完了しますが、マスターブランチの下のAOSPカーネルツリーが常に空であるため、ファイルがないことがわかります。Gitリポジトリの.gitディレクトリには、開発履歴の作業コピーを復元するために必要なすべての情報が含まれています。デバイスのカーネルは特定のコミットバージョンに基づいています。このバージョンを見つけてチェックアウトする必要があります。このコミットバージョンを見つける方法は、デバイスのコマンドラインに次のコマンドを入力することです。
shell@mako:/data $ cat /proc/version                                           
Linux version 3.4.0-perf-ga6edd5e ([email protected]) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Wed Apr 16 09:33:17 PDT 2014
上記の出力では、7つの16進数のa6edd5eがコミットバージョンであり、git checkout a6edd5eコマンドを使用してカーネルソースコードを取得できます。

2.カーネルソースコードをコンパイルする

カーネルソースコードをコンパイルするには、まずコンパイル環境を構築する必要があります。ここでは、AOSPソースコードを正しくコンパイルできることを前提としています。その後、jdkやいくつかのクロスコンパイルツールなどの基本的なものが正しくインストールされています。次に、AOSPのルートディレクトリに移動して、次のコマンドを入力します。
BriansdeMacBook-Pro:Android4.4 brian$ source build/envsetup.sh 
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including sdk/bash_completion/adb.bash
BriansdeMacBook-Pro:Android4.4 brian$ lunch

You're building on Darwin

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_x86-eng
     3. aosp_mips-eng
     4. vbox_x86-eng
     5. aosp_deb-userdebug
     6. aosp_flo-userdebug
     7. aosp_grouper-userdebug
     8. aosp_tilapia-userdebug
     9. mini_armv7a_neon-userdebug
     10. mini_mips-userdebug
     11. mini_x86-userdebug
     12. aosp_hammerhead-userdebug
     13. aosp_mako-userdebug
     14. aosp_manta-userdebug

Which would you like? [aosp_arm-eng] aosp_mako-userdebug

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4.4
TARGET_PRODUCT=aosp_mako
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
HOST_ARCH=x86
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-14.5.0-x86_64-i386-64bit
HOST_BUILD_TYPE=release
BUILD_ID=KTU84P
OUT_DIR=out
============================================

1つ目は、build / envsetup.shを実行してコンパイル環境を初期化し、いくつかの環境変数を設定してから、コンパイルターゲットを選択することです。さらに、3つの環境変数を設定する必要があります。そうしないと、エラーが発生します。
BriansdeMacBook-Pro:Android4.4 brian$ export CROSS_COMPILE=arm-eabi-
BriansdeMacBook-Pro:Android4.4 brian$ export SUBARCH=arm
BriansdeMacBook-Pro:Android4.4 brian$ export ARCH=arm
arm-linux-androideabiコンパイラーの代わりにarm-eabiコンパイラーが使用されていると、正しく使用しないとコンパイルが失敗します。

カーネルはコンパイル前に構成する必要があります。これは、Linuxカーネルが多くのアーキテクチャとハードウェアコンポーネントをサポートしているためです。構成の任意の組み合わせのカーネルイメージをコンパイルできるようにするため、Linuxカーネルは拡張可能な構成サブシステムを使用します。Linuxカーネルは、Opportunity QTのグラフィカルユーザーインターフェイス、テキストベースのメニュー、質問と回答のインターフェイスなど、構成サブシステム用のさまざまな構成インターフェイスも提供します。Android開発者サイト(http://source.android.com/devices/tech/config/kernel.html)のドキュメントでは、Androidカーネルで必要な推奨される構成オプションについて説明しています。
ただし、1つずつ指定するのは面倒なので、Linuxカーネルは、さまざまなデバイスに対応する構成テンプレートをカプセル化する構成テンプレートdefconfigも提供します。構成テンプレートを指定するだけで済みます。カーネルソースコードを前に見つけるパスページの最初に、デバイスに対応する構成テンプレートを見つけることができる表があります。構成テンプレートを見つけたら、カーネルソースコードのルートディレクトリに移動し、次のコマンドを入力して構成を完了します。構成テンプレートはmako_defconfigです。
BriansdeMacBook-Pro:msm brian$ make mako_defconfig
上記のコマンドを入力すると、カーネルコンパイルシステムは、まず構成テンプレートファイルの処理に使用されるいくつかの依存関係をコンパイルし、次に構成テンプレートを読み取り、.configファイルに書き込みます。
次に、makeコマンドを入力してカーネルのコンパイルを完了し、カーネルイメージファイルarch / arm / boot / zImageを取得します。

3. boot.imgイメージファイルを作成してインストールする

以前にカーネルのイメージファイルを取得したので、それを電話にフラッシュする方法は? Androidカーネルのカーネル抽出 記事を読んだ場合、電話機のブートパーティションイメージファイルにカーネルイメージファイルとルートパーティションイメージファイルが含まれていること がわかるので、コンパイルしたカーネルイメージから新しいboot.imgを作成する必要があります。次に、ファイルを電話にスワイプします。
まず、携帯電話からコンピューターにboot.imgをエクスポートし、次にabootimgツール(前述の記事のダウンロードアドレス)を使用して、コンパイルされたカーネルイメージファイルをboot.imgに更新します。
BriansdeMacBook-Pro:boot brian$ abootimg -u boot.img -k zImage-new 
reading kernel from zImage-new
Writing Boot Image boot.img
カーネルイメージが大きくなると、abootimgは同様のエラー「new-boot.img:更新がブートイメージには大きすぎます(4534272 vs 4505600バイト)」をプロンプトします。このとき、boot.imgファイル全体を解凍する必要があります:
BriansdeMacBook-Pro:boot brian$ abootimg -x boot.img 
writing boot image config in bootimg.cfg
extracting kernel in zImage
extracting ramdisk in initrd.img
次に、次のコマンドを入力します。
BriansdeMacBook-Pro:boot brian$ abootimg --create new-boot.img -f bootimg.cfg -k zImage-new -r initrd.img -c "bootsize=4534272"
このサイズはboot.img全体のサイズであることに注意してください。abootimgの使用法についてはここでは説明しません。githubで概要を確認できます。
この時点で、ブートイメージファイルが作成されます。インストールするには、まず電話をfastbootモードにして、次のコマンドを入力する必要があります。
BriansdeMacBook-Pro:boot brian$ adb reboot bootloader
デバイスが再起動し、fastbootモードに入ります。コンパイルしたカーネルを電話で実行するには、2つの方法があります。1つは新しいboot.imgから直接開始する方法、もう1つは新しいboot.imgをデバイスのブートパーティションに書き込む方法です。最初の方法の利点は、失敗した場合、再起動することによってのみ回復できるが、永続的ではなく、2番目の方法は永続的であるということです。
まず最初の方法を見て、コンピューターのコマンドラインにコマンドを入力します。
BriansdeMacBook-Pro:boot brian$ fastboot boot new-boot.img 

2番目の方法は、コンピューターのコマンドラインに次のように入力します。
BriansdeMacBook-Pro:boot brian$ fastboot flash boot new-boot.img
BriansdeMacBook-Pro:boot brian$ fastboot reboot

その後、再起動し、実際にスワイプされているかどうかを確認し、電話のコマンドラインを入力して、次のコマンドを実行します。
shell@mako:/ $ cat /proc/version
Linux version 3.4.0-perf-gc7ee689-dirty ([email protected]) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Fri Nov 11 12:06:19 CST 2016
前の出力とは異なることがわかります。


この時点で、カーネルを正常にコンパイルして電話にフラッシュできます。独自のコードをカーネルに追加したり、カーネルコードをデバッグしたり、必要なことを行うこともできます。もちろん、カーネルモジュールを自分で作成し、insmodを使用して直接カーネルにロードすることもできます。より詳細なコンテンツについては、後で紹介します。この記事はこちらです。








元の記事を60件公開 44のよう 訪問数340,000以上

おすすめ

転載: blog.csdn.net/beyond702/article/details/53175154