webdevqa.jp.net

Android AOSPカーネルをコンパイルして、Android Emulator?

誰かがAndroidカーネルを正常にコンパイルし、Androidエミュレータでテストしました。もしそうなら、特別なことをする必要がありますか?

SDKのドキュメントは優れていますが、カーネルのコンパイルとエミュレーターでのカスタムマシンのセットアップに関するドキュメントを見つけるのは困難でした。

2009年8月以降、カーネルは、指示に従ってAndroidオープンソースプロジェクトのソースコードをダウンロードするときに取得する標準レポマニフェストの一部ではなくなりました。成功するために必要な手順エミュレータで特定のカーネルをダウンロード、ビルド、および実行するには、次のようにします。

  • リポジトリマニフェストに追加するか、次を実行して手動でAndroidカーネルを取得します。
    git clone https://Android.googlesource.com/kernel/goldfish.git
  • エミュレータを使用するための正しいブランチ、つまり金魚を確認してください:
    git checkout -t Origin/Android-goldfish-2.6.29 -b goldfish
  • エミュレーター構成を生成します(qemuエミュレーターはarmコード、つまりarm configを実行します):
    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つは、ほとんどの人があまり作業しないプラットフォームコンポーネントの帯域幅とディスクスペースが多くかかることです。 aospビルドシステムの一部としてではなく、ビルドシステムを分離しておくのが理にかなっています。カーネルの共通ブランチは、エミュレータで使用されるブランチです。experimental、msm(Qualcommプラットフォーム)、およびOmap(TIプラットフォームハードウェアでAndroidカーネルを使用したい場合、これらはあなたにとってより興味深いかもしれません。

55
BMB

BMBの投稿からいくつかのことを修正するだけで(これは私にとって非常に便利でしたが、プロジェクトを保存しました):

  • git clone git://Android.git.kernel.org/kernel/common.git(kernel missed);
  • 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-eabiidem)
  • emulator -avd my_avd -kernel mydroid/kernel/common/Arch/arm/boot/zImage(ここでコマンドに---(avdを追加しましたが、私なしでは機能しませんでした).

19
Arnaud LM

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 &

これに答えたすべての人に感謝します-私はこの答えからの断片でそれをすることができました。アマウンドの「あなたにはAVDが必要です」は、私にトラブルを与えた最後の作品でした。

8
JohnnyLambada

これは、BMBおよびArnaud LMの回答の更新です。
2011/03/03から金魚の支店名が変更されたようです。金魚の枝をチェックアウトするとき、これを使用します:

git checkout -t Origin/archive/Android-gldfish-2.6.29 -b goldfish 

Android-gldfish-2.6.29で欠落している「o」に注意してください!

これが誰かの時間を節約することを願っています。

8
hopia

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システムにシェルが表示されます。

enter image description here

ノート:

  • ./repo init -bタグを指す必要がありますmasterブランチは常に壊れており、-releaseブランチも常に壊れています。

    タグのリストは、 https://Android.googlesource.com/platform/manifest で、またはそのリポジトリを複製することで見つけることができます。

    ブランチが常に壊れるのには、おそらく2つの理由があります。

    • Androidは密室で開発され、コードは削除されました。そのため、GoogleとOEM開発者は既に公開の「マスター」の上に大量のパッチを用意しており、すでに問題を修正しています。

      同じ理由で、マスターでビルドエラーを報告しようとしても役に立たない可能性があります。エラーは既に報告され、修正されています。また、ビルドの失敗を報告するための適切な公式の場所を見つけることさえできます。

    • ブランチ上のrepo syncは、サブモジュールのように同期せずに、指定されたブランチのAOSPを構成するすべての650 gitリポジトリの最新バージョンをプルします。したがって、互換性を保証するものは何もありません。ただし、タグはすべてのリポジトリの特定のタグを取得します。

  • --depth 1sync -c --no-tags --no-clone-bundleは、非常に遅いクローンを高速化する試みでした。それがどれほど成功したかはわかりません。参照: AOSPリポジトリ同期に時間がかかりすぎる

  • Host x86仮想化拡張機能により実行速度が大幅に向上するため、ARMの代わりにlunch aosp_x86_64-engを使用します。

    代わりにARMバージョンをビルドするには、代わりにlunch aosp_arm-engを使用します。

    さらに、ARMイメージはバグがありますが、これはおそらく遅いためですか? GUIが起動すると(運がよければ)、「システムUIが応答していません」と表示されます。参照: プロセスシステムがAndroidエミュレーターで応答しない

  • -show-kernelは端末をシリアルにリンクします。つまり、ブートメッセージが表示され、最後にシェルが表示されます。これは、デバッグに非常に便利です。

  • type emulatorは、引数なしのemulatorの単なるエイリアスであることを示しています。 ROMでカスタムAndroidを実行Emulator は、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 emulator:command line options ソースは5分ごとに位置を移動しているようです: Androidエミュレーターソースコードの変更

簡単だ。 http://source.Android.com/download の指示に従って、Android全体のソースコードを取得およびコンパイルします。それにはしばらく時間がかかりますが、それほど複雑ではありません。

それをビルドすることで、<Android>/outディレクトリに出力されます。これには、ROMイメージに加えて、エミュレーターを含む多数のツールも含まれます。エミュレーターは<Android>/out/Host/linux-x86/bin/emulatorにあります。Android_PRODUCT_OUTという名前の環境変数を<Android>/out/target/product/genericに設定し、エミュレーターを実行せずにoptionsはコンパイルされたROMを実行します。

6
Mostafa

2012年5月の時点で、カーネルのコンパイルに「goldfish_defconfig」を使用できないことがわかりました。 goldfish_armv7_defconfigを使用する必要があります。これは、JonnyLambadaのエミュレータから構成を抽出する方法(ビルド済みカーネル用)が機能する理由を説明するものであり、必要です。

Goldfish_defconfigは、カーネルをARM 926プロセッサーで実行するように構成しますが、エミュレーターはCoretex A8(ARM V7 CPU) 。そのため、新しいdefconfigを使用する場合は、それを使用する(または、エミュレーターから構成をプルする)必要があります。

ちょっとだけ。

4
Tim Bird

コンパイルしたAOSP romを起動する方法は、コンパイルされたsystem.imgを〜/ .Android/avd/Froyo.avd /にコピーすることでしたが、system.imgを抽出し、suのルートバージョンを追加するときそしてbusybox、system.imgを作り直し、エミュレーターは起動しません。私はまだその部分を理解しようとしています:S

1
triki