web-dev-qa-db-ja.com

Androidエミュレータに/ systemへの変更を保存するように強制する

Android=エミュレータを操作するときによくある質問ですが、/systemへの永続的な変更をエミュレータに受け入れさせる方法はありますか?

エミュレーターはQEMUに基づいているため、理論的には、systemイメージをuserdata(たとえば)と同じように動作させることは可能ですが、私は慣れていませんQEMUによる処理方法。ポインタはありますか?

22
F.X.

現時点では(ビルドツールv26では、Googleが頻繁に変更しない場合)、コマンドラインからエミュレータを起動するときに_-writable-system_ディレクティブを使用すると、_/system_再起動によるパーティション。つまり、_/system_パーティションに書き込むことができ、再起動しても変更は維持されます。

_emulator -avd <AVD_NAME> -writable-system_

これにより、通常_qcow2_にある_.Android/avd/<AVD_NAME>.avd/system.img.qcow2_画像ファイルへの変更も保持されます

この_system.img.qcow2_ファイルをコピーし、_-wipe-data_ディレクティブを使用してAVDからデータをワイプし、このファイルをディレクトリに戻し、再起動しても、最初に行ったシステム変更は保持されます。 (注意:少なくとも今のところ、coz Googleは状況を変え続けています)

12
Irvin H.

pdate: QEMUの最新バージョンから-nandオプションが削除されたため、以下は機能しない可能性があります。

pdate:現在のやり方については、承認された回答を参照してください。


Yuryの答えは一般的なものですが、スクリプトを作成できるようにするには(最終的にはこれが必要です)、エミュレーターイメージを/tmpディレクトリで見つけられるようにする必要があります。

QEMUの動作をオーバーライドできることを発見しました。これは少しハックですが、うまくいきましたので、私はこれをやるようになりました:

  1. system.imgをプラットフォームディレクトリからAVDディレクトリにコピーします。
  2. 必要なスペースの量を16進数に変換します。たとえば、500Mが必要な場合、これは0x1f400000です。
  3. エミュレータを読み取り/書き込みモードで実行します。

    emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.Android/avd/Galaxy_Nexus/system.img
    

    (エミュレータを冗長モードにすると、デフォルトでは、単にinitfile=ではなくfile=を使用することに気付くでしょう)

  4. 変更を加えると、すぐにローカルに保存されますsystem.img

  5. これで、emulator -avd Galaxy_Nexusを使用してエミュレータを起動するだけで、変更が使用されます

pdate:スクリプティングの場合、QEMUは変更をすぐにイメージに同期しないため、何かを変更した直後に再起動すると、データが失われる可能性があります。私はこれを回避する方法を探しています...

次の更新:adb -e emu killを使用してエミュレータを停止します。 rebootは単に悪いことをします。

15
F.X.

それは実際には非常に良い質問です。私は同じ問題を抱えていました。これが私の発見です。実際、私はUbuntuを使用していますが、Ubuntuの手順を説明します。 Windowsを使用している場合は、パスを変更するだけです。

  1. たとえば、example.avdなどの新しいAVDを作成します。
  2. System.imgをAndroid-sdk-linux/platforms/Android-10/imagesから~/.Android/avd/example.avdにコピーします
  3. System.imgを書き込み可能および読み取り可能にする(プロパティで、または単にターミナルを使用して)
  4. コマンドemulator -avd exampleを使用してAVDを実行します
  5. Adb Shell mount -o rw,remount -t yaffs2 /dev/block/mtd0 /systemを使用してシステムをrwとして再マウントします(パーティションを検出するには、コマンドcat /proc/mtdを使用します)
  6. 変更を加えます...
  7. エミュレーターの実行中に/tmp/Android-<your_computer_name>でtmpエミュレーターを見つけて、次のような奇妙な名前を付けます:emulator-PQ7LgEそして~/.Android/avd/example.avdにコピーします
  8. system.imgを削除し、コピーしたtmpエミュレータの名前をsystem.imgに変更します
  9. エミュレータを閉じる
  10. cache.imgからuserdata.imguserdata-qemu.img~/.Android/avd/example.avdを削除します
  11. エミュレータをもう一度実行します

幸運を!

8
Yury

F.Xというsystem.imgファイルとAVDディレクトリを見つけるのに苦労しました。について投稿した。 Macでは、次の場所にあります。

  • system.img:~/Library/Android/sdk/system-images/Android-19/default/
  • AVDディレクトリ:~/.Android/avd/Nexus.avd/

コメントとして追加するのに十分な評判がないので、このように投稿する必要がありました。ごめんなさい。

2
stefansundin

ソリューション#2はすばらしい。

MS AVをホストとして使用している場合のヒントを以下に示します。AVDディレクトリは以下の場所にありますが、「短い」パス名をfile = pathパラメータとして使用する必要があります。引用されたパスのバリアントは、何らかの理由で機能しません。

Win XP:C:\ Documents and Settings \(ユーザー名)\ .Android\avd\...短いC:\ DOCUME〜1 \(ユーザー名)\ ANDROI〜1\avd\...

Win 7 C:\ Users \(ユーザー名)\ .Android\avd\...

次の例のように、「startrw.bat」と言う独自のbatファイルを作成できます。

@echo off
C:\<ADTFOLDER>\sdk\tools\emulator -avd <AVDNAME> -qemu -nand system,size=0x1f400000,file=C:\DOCUME~1\<USERNAME>\ANDROI~1\avd\<AVDNAME>.AVD\system.img
cd C:\<ADTFOLDER>\sdk\platform-tools
echo .
echo Wait ... 
echo .
echo When emulator is FULLY loaded press any key to connect adb Shell to it
echo To make /system writeable type in adb Shell:
echo .
echo -----------------------------
echo mount -o rw,remount /system 
echo -----------------------------
echo .
echo You can use the Eclipse ADT DDMS File Browser to browse or Push-pull files now.
echo .
echo Closing this window closes the emulator ! 
echo .
echo Wait emulator to load Android. When done
pause
C:\<ADTFOLDER>\sdk\platform-tools\adb Shell

これにより、ワンクリックでロードできます。変更が完了したら、現在のコマンドウィンドウを閉じてエミュレータを終了します。

エミュレーター、ADTエディター、フッキングDDMSファイルブラウザー(右側のウィンドウでファイルツリーを表示するには、エミュレーターラインの左側をクリックする必要があります)など、ほとんどのものがロードするのに長い時間がかかります。

2
user2343527

F.X.の答えは、Android WindowsのAPI 19および21の場合、現状のままでは機能しません。

emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>

システムはイメージのマウントに失敗します。カーネル出力を見ると、疑わしいページサイズ(2048)と2つのゼロ以外のパラメーター値(追加サイズと「消去」)が使用されていることがわかりました。これらのパラメーターはどこにも文書化されていませんが、 qemuのソースコード で確認できます。最終的に私のために働いたのは

emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>,pagesize=512,extrasize=0

これらのパラメーターを指定すると、「erase」も0に設定されます。

また、これらのパラメーターを使用すると、システムがグラフィカル環境を起動できないが、adbは機能することがわかりました。

0
kirillkh

端末でこのコマンドを使用します

cd /Users/NAME_USER/Library/Android/sdk/emulator # Move to emulator folder
Sudo ./emulator -writable-system -avd NAME_AVD -partition-size 280 # Run avd by writable system 
Sudo adb root # Change to root
Sudo adb remount # remount again
Sudo adb Shell 
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 

nAME_USERとNAME_AVDを変更する

0
Rasoul Miri

これを行う最善の方法は、次のコマンドを使用することです。

<path-to-emulator-executable> -avd <AVD> -partition-size 512
0
user6754053