Android AOSPカーネルをコンパイルし、Androidエミュレーターでテストする方法は?
-
05-07-2019 - |
質問
Androidカーネルを正常にコンパイルしてAndroidエミュレーターでテストした人はいますか?もしそうなら、特別なことをする必要がありますか?
SDKのドキュメントは優れていますが、カーネルのコンパイルとエミュレーターでのカスタムマシンのセットアップに関するドキュメントは見つけるのが困難でした。
解決
2009年8月以降、カーネルは、指示に従ってアンドロイドオープンソースプロジェクトのソースコードをダウンロードしたときに取得する標準のレポジトリマニフェストの一部ではなくなりました。エミュレーターで特定のカーネルを正常にダウンロード、ビルド、実行するために必要な手順は次のとおりです。
- Androidカーネルをリポジトリマニフェストに追加するか、次を実行して手動で取得します:
git clone https://android.googlesource.com/kernel/goldfish.git
- エミュレータを使用するための正しいブランチ、つまりgoldfishを確認します:
git checkout -t origin/android-goldfish-2.6.29 -b goldfish
- エミュレーター構成を生成します(qemuエミュレーターはアームコード、つまりアーム構成を実行します):
make ARCH=arm goldfish_defconfig
- それが機能しない場合は、
make ARCH=arm goldfish_armv7_defconfig
を試してください
- それが機能しない場合は、
- 今、オープンソースプロジェクトとともに配布されているクロスコンパイルツールを使用してカーネルを構築します:
make ARCH=arm CROSS_COMPILE=mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- この方法でビルドされたカーネルは、カーネルツリーのarch / arm / bootフォルダー(git cloneからコードを配置する場所)に配置されるはずです
- カーネルでエミュレータを実行するには、2つの方法があります。オープンソースプロジェクトのビルド済みカーネルフォルダにコピーして、標準カーネルを置き換えます。もう1つのオプションは、カーネルオプションを設定してエミュレーターを起動することです:
emulator -kernel mydroid/kernel/common/arch/arm/boot/zImage
上記の説明でデフォルトのパスを使用していることに注意してください。設定に適用するものに変更する必要があります。前回これをテストしてからしばらく経ちましたが、うまくいくと思います。
追加情報:
標準のAndroidオープンソース配布では、カーネルはmydroid/prebuilt/android-arm/kernel
フォルダーにビルド済みバイナリとして配布され、ソースコードは含まれていません。カーネルソースは、2つの理由により、デフォルトのマニフェストから削除されました。 1つは、ほとんどの人があまり作業しないプラットフォームコンポーネントのために、多くの帯域幅とディスクスペースを必要とすることです。もう1つの理由は、カーネルはaospビルドシステムの一部としてではなく、カーネルビルドシステムでビルドされているため、カーネルを分離したままにしておくのが理にかなっているからです。カーネルの共通ブランチは、エミュレーターによって使用されるものです。また、experimental、msm(Qualcommプラットフォーム)、Omap(TIプラットフォーム)などのブランチもあります。ハードウェアでAndroidカーネルを使用したい場合、これらはより興味深いかもしれません。
他のヒント
BMBの投稿からいくつかの点を修正するだけです(これは非常に便利で、プロジェクトを保存しました):
- git clone git://android.git.kernel.org/kernel/common.git(カーネルが見つかりません);
- git checkout -t origin / android-goldfish-2.6.29 -b goldfish(同じ);
- make ARCH = arm goldfish_defconfig(idem);
- make ARCH = arm CROSS_COMPILE = mydroid / prebuilt / linux-x86 / toolchain / arm-eabi-4.2.1 / bin / arm-eabi-(idem)
- emulator -avd my_avd -kernel mydroid / kernel / common / arch / arm / boot / zImage(ここでコマンドに avd を追加しましたが、私なしでは機能しませんでした)
これは、BMBおよびArnaud LMの回答の更新です。
金魚のブランチ名は2011/03/03に変更されたようです。
金魚の枝をチェックアウトするとき、これを使用します:
git checkout -t origin/archive/android-gldfish-2.6.29 -b goldfish
android-gldfish-2.6.29で欠落している「o」に注意してください!
これにより誰かの時間を節約できます。
2012年現在、カーネルのダウンロードはsource.google.comで十分に文書化されていますが、コンパイルには数回の試行が必要でした。 ARMエミュレータ用のカーネルを構築するために使用したコマンドは次のとおりです。
cd /kernel/source/root
make mrproper
adb pull /proc/config.gz # from the emulator
gunzip config
mv config .config # now you have a (perhaps slightly outdated kernel .config)
make ARCH=arm silentoldconfig # update the .config - take the defaults if prompted
make ARCH=arm menuconfig # make any further changes
time make -j4 ARCH=arm CROSS_COMPILE=/path/to/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- 2>&1 | tee ../../logs/$(date +%Y%m%d-%H%M)-make-kernel.log
emulator -kernel /kernel/source/root/kernel/goldfish/arch/arm/boot/zImage -avd myAVD &
これに答えてくれたすべての人に感謝します-私はこの答えから少しずつそれをすることができました。 Amaundの「あなたにはAVDが必要です」が最後に苦労した部分です。
Ubuntu 17.10ホスト上の完全に自動化されたAndroid 8.1ゲスト
# Download the source. Takes several minutes.
curl https://storage.googleapis.com/git-repo-downloads/repo >repo
chmod a+x repo
./repo init -b android-8.1.0_r1 --depth 1 -u https://android.googlesource.com/platform/manifest
./repo sync -c -j $(($(nproc) - 2)) --no-tags --no-clone-bundle
# Do the actual build. Takes minutes / hours.
. build/envsetup.sh
lunch aosp_x86_64-eng
USE_CCACHE=1 CCACHE_DIR=ccache make -j $(($(nproc) - 2))
# Run the emulator.
emulator -show-kernel
out/
ビルドディレクトリは約90 GB、残りのツリーはCCACHEを除く約40 GBを占有します。
エミュレータを起動してから約1〜2分後に、ホーム画面に次のように表示されます。
Androidが起動されたホスト端末でEnterキーを押すと、ホスト端末のAndroidシステムにシェルが表示されます:
注:
-
./repo init -b
タグを指す必要があります。master
ブランチは常に壊れているため、-release
ブランチも壊れています。タグのリストは、 https://android.googlesource.com/platform/にあります。マニフェストまたはそのリポジトリのクローンを作成します。
ブランチが常に壊れるのには、おそらく2つの理由があります:
-
Androidは密室で開発され、コードは削除されました。そのため、GoogleとOEM開発者は既に公開の<!> quot; master <!> quot;の上に大量のパッチを用意しており、すでに問題を修正しています。
同じ理由で、マスターでビルドエラーを報告しようとしても役に立たない可能性があります。エラーは既に報告され、修正されています。また、ビルドの失敗を報告するための適切な公式の場所を見つけることさえできます。
ブランチでの -
repo sync
は、すべての650 gitリポジトリの最新バージョンをサブモジュールのように同期せずに単純にプルします。したがって、互換性を保証するものは何もありません。ただし、タグはすべてのリポジトリの特定のタグを取得します。
-
-
--depth 1
およびsync -c --no-tags --no-clone-bundle
は、非常に遅いクローンをより高速にする試みでした。それがどれほど成功したかはわかりません。参照: AOSPリポジトリの同期に時間がかかりすぎる -
x86仮想化拡張機能をホストするため、ARMよりも高速に実行されるため、ARMの代わりに
lunch aosp_x86_64-eng
を使用します。代わりにARMバージョンをビルドするには、代わりに
lunch aosp_arm-eng
を使用します。さらに、ARMイメージはバグがありますが、これはおそらく遅さによるものですか? GUIが起動すると(運がよければ)、<!> quot; System UI is not responding <!> quot;と表示されます。参照: Androidエミュレーターでプロセスシステムが応答していません
-
-show-kernel
はターミナルをシリアルにリンクします。つまり、ブートメッセージが表示され、最後にシェルが表示されます。これはデバッグに非常に役立ちます。 -
type emulator
は、引数なしのemulator
の単なるエイリアスであることを示しています。 AndroidエミュレーターでカスタムROMを実行は、明示的に選択するためにいくつかの引数を渡す方法を尋ねますROM。エミュレーター
-help
ターゲットは驚くほど洞察力に富んでいます:emulator -help emulator -help-build-images emulator -help-disk-images
次のコマンドを使用して、正確なQEMUコマンドライン引数を決定できます。
emulator -verbose | grep 'emulator: argv'
で言及されているように: Androidエミュレーターの起動時にQEMUに渡されるオプションを表示する方法は?
これは、いくつかのカスタムオプションを示します。
-android-hw
、したがって、QEMUを分岐している必要があります: QEMU vs Androidエミュレータ:コマンドラインオプションソースは明らかに5分ごとに位置を移動します: Androidエミュレーターソースコードの変更
それは簡単です。ソースコードを取得してコンパイルするには、 http://source.android.com/download の手順に従ってください。全体のアンドロイド。それには時間がかかりますが、それほど複雑ではありません。
それをビルドすると、<android>/out
ディレクトリに出力されます。これには、ROMイメージの他に、エミュレーターを含む多くのツールも含まれます。エミュレータは<android>/out/host/linux-x86/bin/emulator
にあります。 ANDROID_PRODUCT_OUT
という名前の環境変数を<android>/out/target/product/generic
に設定し、オプションなしでエミュレーターを実行すると、コンパイル済みのROMが実行されます。
2012年5月の時点で、カーネルのコンパイルに「goldfish_defconfig」を使用できないことがわかりました。 goldfish_armv7_defconfig 'を使用する必要があります。これは、JonnyLambadaのエミュレータから構成を抽出する方法(ビルド済みカーネル用)が機能する理由を説明するものであり、必要です。
goldfish_defconfigは、カーネルをARM 926プロセッサーで実行するように構成しますが、エミュレーターはCoretex A8(ARM V7 CPU)として実行するように構成されます。そのため、動作させるには、新しいdefconfigを使用する必要があります(または、エミュレーターから構成をプルします)。
参考までに。
コンパイルしたAOSP ROMを起動する方法は、コンパイルされたsystem.imgを〜/ .android / avd / Froyo.avd /にコピーすることでした ただし、system.imgを抽出し、ルートバージョンのsuとbusyboxを追加してからsystem.imgを再作成すると、エミュレーターが起動しません。私はまだその部分を把握しようとしています:S