Android
 Computer >> コンピューター >  >> トラブルシューティング >> Android

Windows 10でAndroidカーネルをビルドする方法|WSL(Linuxサブシステム)を使った完全ガイド

Appual'sでは、Android Open Source Project(AOSP)からカスタムROMを作成する方法など、Android開発に関する優れたガイドを多数公開しています。しかし、これらのガイドは純粋なLinuxビルド環境を前提としていることがほとんどです。

この記事では、Windows 10上でAndroidカーネルをビルドする方法を解説します。もちろんLinuxビルド環境を使用しますが、それはWindows 10内に構築できる「Windows Subsystem for Linux(WSL)」です。Android開発に興味のあるWindows 10ユーザーは、ぜひこのガイドを参考にしてください。

本ガイドでは、ARMおよびMediaTek(MTK)デバイス向けカーネルのビルド方法、機能の追加方法、そしてGitの基本的な使い方について学びます。

必要要件

  • Windows 10 x64(Fall Creators Update適用済み)

Linux環境のセットアップ

  1. Windows 10で「設定」→「更新とセキュリティ」→「開発者向け」と進み、「開発者モード」を有効にします。
  2. 次に「コントロールパネル」→「プログラム」→「Windowsの機能の有効化または無効化」と進み、「Windows Subsystem for Linux」を有効にします。
  3. PCを再起動します。
  4. Linuxサブシステムを起動し、ダウンロードプロセスが完了するまで待ちます。パスワードを設定し、忘れないように管理してください。
  5. Microsoft StoreからUbuntuをダウンロードします。
  6. Windows 10デスクトップ上でUbuntuを起動すると、ユーザー名とパスワードの入力を求められます。
  7. Ubuntuのターミナルを開き、以下のコマンドを入力します:
    apt-get update
  8. これにより、アプリと依存関係のリポジトリがすべて更新されます。
  9. 続けてターミナルに以下を入力します:
    sudo apt-get install -y build-essential kernel-package libncurses5-dev bzip2
  10. 依存関係が正しくインストールされたか確認するため、ターミナルに gcc と入力します。
  11. gccがすでにインストールされていれば、「gcc : fatal error : no input file」と表示されるはずです。
  12. 次に make と入力します。makeがインストール済みなら「make: *** no target specified and no makefile found. stop.」というメッセージが表示されます。
  13. さらに git と入力すると、gitがインストール済みの場合は基本的なgitコマンドの一覧が表示されます。
  14. 次にツールチェーンが必要です(GCC、Linaro、その他カスタム版など複数の種類があります)。デバイスによって必要なツールチェーンは異なります。たとえば、すべてのデバイスカーネルがGCCで起動・コンパイルできるわけではありません。

ARMデバイスの場合

ここではGCC 4.7を使用します。

  1. Linuxターミナルを開き、以下を入力します:
    mkdir kernel
  2. 続けて入力:
    cd kernel
  3. フォルダ名は「kernel」である必要はありません。分かりやすさのための例なので、任意の名前を付けてかまいません。
  4. 次のコマンドを実行してツールチェーンをクローンします:
    git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7

ARM64デバイスの場合

ARM64デバイスには64ビットのカーネルコンパイラが必要です。たとえばaarch64などが該当します。

デバイスのソースファイルを入手する

ここが少し難しいポイントです。自分のデバイスのカーネルソースをホストしているGitHubリポジトリを見つける必要があります。XDAフォーラムなどで検索すれば、大抵は見つかるでしょう。

以下はカーネルソースのGitリポジトリの一例です。

ページ左上には「Branch: Completed by xxxx」という表示があります。カーネルやプロジェクトには複数のバージョンが存在し、通常は「Testing」「Beta」「Final Release」などのラベルで区切られています。

カーネルフォルダの典型的な構成は以下の通りです:

  • /arch/arm/configs:ガバナーなど、デバイス用の各種設定ファイルが含まれています。
  • /output/arch/arm/boot/:zImageが保存される場所です。
  • build.sh:ビルド作業を簡略化するスクリプトです。
  • /arm-cortex-linux-gnueabi-linaro_5.2-2015.11-2:カーネルソース内に配置されたツールチェーンです。見つけやすいように同梱されていることが多いです。

カーネルソースをダウンロードしましょう。

Linuxターミナルを開き、先ほど作成したkernelフォルダ内にいることを確認します(cd kernel)。

その後、ターミナルに以下を入力します:
git clone "GitHubカーネルのURL" -b "ブランチ名"

例:
git clone https://github.com/atxoxx/android_ke…amsung_msm8974 -b xenomTW

カーネルをビルドする

作業を簡単にするために、エクスプローラーで該当フォルダの場所を直接開いても構いません。パスは通常 /home/ユーザーID/kernel(または自分で付けたフォルダ名)です。

中にツールチェーンとカーネルソースの2つのフォルダがあるはずなので、カーネルソースのフォルダに入ります。

ARMデバイスの場合

ターミナルで以下のコマンドを入力します:

#!/bin/bash

export ARCH=arm
export CROSS_COMPILE=

mkdir output

make -C $(pwd) O=output "defconfig名と必要に応じてバリアント"
make -j4 -C $(pwd) O=output

今後のために、各コマンドの意味を簡単に解説しておきます。

  • #!/bin/bash: スクリプトをシェルコマンドとして実行することを宣言します。
  • export ARCH=arm: カーネルのアーキテクチャタイプを定義します(例:arm64など)。
  • export CROSS_COMPILE=:ツールチェーンの場所を指定します。パスは正確に一致している必要があり、末尾のハイフン(-)は必須です。
  • mkdir output: コンパイル済みzImageを保存するディレクトリを作成します。
  • make -C $(pwd) O=output:カーネルコンパイルを導くdefconfigを指定します。
  • make -j4 -C $(pwd) O=output:ビルド開始時、-j#はコンパイル速度の並列度を指定します。一般的にはCPUのコア数に応じて設定します。たとえばローエンドCPUで-j32を設定すると、深刻な不安定さを招く可能性があります。
  • cp output/arch/arm/boot/Image $(pwd)/arch/arm/boot/zImage:Imageを別のパスへ移動(コピー)するためのコマンドです。

別の記述例:

#!/bin/bash

export ARCH=arm
export CROSS_COMPILE=$(pwd)/arm-cortex-linux-gnueabi-linaro_5.2-2015.11-2/bin/arm-cortex-linux-gnueabi-

mkdir output

make -C $(pwd) O=output msm8974_sec_defconfig VARIANT_DEFCONFIG=msm8974_sec_ks01_skt_defconfig SELINUX_DEFCONFIG=selinux_defconfig
make -j4 -C $(pwd) O=output

cp output/arch/arm/boot/Image $(pwd)/arch/arm/boot/zImage

ARM64デバイスの場合

#!/bin/bash

export ARCH=arm64
export CROSS_COMPILE="ツールチェーンへのパス"(末尾は "アーキ名-something-" のような形式で終わる必要があります)

mkdir output

make -C $(pwd) O=output "defconfig名と必要に応じてバリアント"
make -j4 -C $(pwd) O=output

MediaTek(MTK)デバイスの場合

#!/bin/bash

export CROSS_COMPILE="ツールチェーンへのパス"(末尾は "アーキ名-something-" のような形式で終わる必要があります)

export ARCH=arm ARCH_MTK_PLATFORM=

make "defconfig名と必要に応じてバリアント"

make -j4

自分のカーネルアーキテクチャに必要な手順をすべて完了したら、ターミナルで以下を入力します:
sudo bash build.sh

ユーザーパスワードを入力すると、コンパイルプロセスが開始されます。

多少時間はかかりますが、通常それほど長くはありません。カーネルのコンパイルは、Android ROM全体のビルドとは違います。所要時間はCPU性能に大きく依存します。たとえばAMD Phenom X4 3.4GHz+RAM 8GBの環境なら、最初から最後まで約10分程度で完了するでしょう。

完了すると、「zimage is ready」のようなメッセージで通知されます。

ARM/ARM64デバイスの場合

「/output/arch/arm/boot/」に移動すると、zImageが見つかります。

MediaTekデバイスの場合

「/arch/arm/boot/」に移動すると、zImageが見つかります。

すべてのカーネルビルドがZImageファイルとして出力されるとは限りません。場合によっては他のイメージ形式で生成されることもあります。

重要: 再度コンパイルを行う場合は、ビルドを始める前に make cleanmake mrproper を実行することをおすすめします。

カーネルを起動可能にする

選択できる方法は2つあります。

1つ目はAnyKernel方式です(XDAユーザー@osm0sis氏がXDAスレッドで定義した手法)。チュートリアル全体を読むべきですが、手順の概要は以下の通りです:

  1. zImageをルートに配置します(カスタムdtb/dtboが必要なデバイスは、ここにdtbやdtboも配置します。含めない場合は元のファイルへフォールバックされます)。
  2. 必要なramdiskファイルは /ramdisk へ、モジュールは /modules へ配置します(/modules/system/lib/modules のようにフルパスで指定)。
  3. 必要なパッチファイル(一般にコマンドとセットで使う部分的なファイル)は /patch に配置します。
  4. anykernel.shを編集し、カーネル名、bootパーティションの場所、ramdiskファイルの権限、必要なramdisk改変のためのuseメソッドなどを追記します(任意で、bannerやversionファイルをルートに置くと、フラッシュ時に表示されます)。
  5. zip -r9 UPDATE-AnyKernel2.zip * -x .git README.md *placeholder

もう1つの方法は、同じROM(CM、TouchWiz、EMUIなど)かつ同じAndroidバージョンのboot.imgを展開し、そこからzImageを差し替えるやり方です。こちらも非常に複雑なプロセスなので、必ず詳細なチュートリアルを読んでください。手順の概要は以下の通りです:

  1. zipファイルを解凍します。
  2. コマンドラインで「unpackimg <image-filename.img>」を実行するか、単にイメージをドラッグ&ドロップします。これによりイメージが分割され、ramdiskがサブディレクトリに展開されます。
  3. ramdiskをお好みに合わせて編集します。
  4. repackimgバッチスクリプトは入力不要で、以前分割されたzImageと、新しくパックされた改変済みramdiskを、元のイメージ情報(これも分割して保存されています)を使って再結合します。
  5. cleanupバッチスクリプトはフォルダを初期状態に戻し、split_img+ramdiskディレクトリや新しく作成されたramdisk・イメージファイルを削除します。

カーネルをフラッシュする前に、必ずストックのboot.imgのバックアップを作成してください。そのうえでカーネルをフラッシュし、Androidシステムが正常に起動するか確認します。

カーネルに機能を追加する

カーネルへの機能追加は、カーネルを魅力的にする素晴らしい方法です。CPUガバナー、I/Oスケジューラ、GPUのオーバークロック、オーディオ強化など、調整できる要素はたくさんあります。

ガバナーを追加する例を紹介します(このガバナーのコードネームはIntellimmです)。

最初の2つのテキストボックスで、「arch/arm/configs/」内の「msm8974_sec_defconfig」と「cm_msm8974_sec_defconfig」が変更されているのが分かります。

これらのファイルの140行目と141行目の間に、次のテキストが追加されています:「CONFIG_CPU_FREQ_GOV_INTELLIMM=y」
(この行は、カーネルのコンパイル時にIntellimmを有効化するためのものです)

同じ手法が他のテキストボックスにも適用されます(何がどこに追加・削除されたかを確認できます)。

追加する機能によって、変更・追加・削除されるファイルの数は増減します。

まとめると、コミット(Commit)を見れば、行われたすべての変更内容を一目で把握できるのです!

便利なTips&テクニック

カーネル名とバージョンを変更する方法:

シンプルな方法:

defconfigファイル内の次の行を編集します:

"CONFIG_LOCALVERSION="-" の後にdefconfig内で任意の文字列を指定

例:CONFIG_LOCALVERSION="-XenomTW-3.2.6"

高度な方法:

カーネルソースのルートフォルダにあるMakefileへ移動し、以下の行を追加します:

CONFIG_LOCALVERSION="あなたのカーネル名"
LOCALVERSION="あなたのカーネルのバージョン"

Version、PatchLevel、Sublevel、Extraversionの各行は絶対に変更しないでください。

代替方法:

scripts/mkcompile_h を開き、以下の行を追加します:

LINUX_COMPILE_BY="好きな名前"
LINUX_COMPILE_HOST="好きな名前"

PATH問題の解決法:

「Is your path correct?」というエラーに遭遇した場合は、Linuxターミナルで以下を試してみてください:

"export PATH="ツールチェーンの場所"/bin:$PATH"

Windows 10からUbuntuフォルダへアクセスする

Ubuntuへのパスは通常、以下のようになっています:

C:\Users\"ユーザー名"\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home

ただし、Windows側から直接ファイルを編集しないでください。パーミッションが壊れることが多く、その場合はLinuxターミナルから権限をリセットし直す必要があります。

  1. Windows 10でAndroidの通知をPCで受け取る方法|連携手順を徹底解説

    Androidは世界で最も多く利用されているオペレーティングシステムの一つであり、膨大なユーザー数を誇ります。Android搭載スマートフォンの性能が年々向上するにつれ、Windows 10のPC上でAndroidの通知を受け取ることが可能になりました。仕事中やスマートフォンが手元にないときでも、わざわざ端末を取りに行かずに通知を確認できるのは大きなメリットです。Windows 10では、この通知同期機能が標準機能として組み込まれていますが、事前にいくつかの設定を行う必要があります。設定を始める前に、必要なアップデートが適用された正規版のWindows 10を使用していることを確認しておきまし

  2. Windows 11でAndroidアプリを実行する方法|Amazon Appstoreの導入手順とサイドロード術

    Windows 11のPCでもAndroidアプリが使えたら便利だと思いませんか?その夢はついに現実になりました。Windows 11では、サードパーティ製ソフトやエミュレーターを別途用意しなくても、Androidアプリを簡単に実行できます。鍵となるのが「Amazon Appstore」。Microsoft Storeからインストールすれば、厳選されたカタログの中からお気に入りのアプリやゲームを閲覧・インストールできるようになります。ただし注意点として、この機能はリリース当初、米国でのみサポートされていました。 スマートフォンだけでなくWindows PCでもアプリを活用したい——これは多く