Принуждение эмулятора Android для хранения изменений в/system
Я знаю, что это повторяющийся вопрос при работе с эмулятором Android, но есть ли способ заставить эмулятор принимать постоянные изменения в /system
?
Эмулятор основан на QEMU, поэтому теоретически возможно, чтобы заставить образ system
вести себя одинаково, например, userdata
(например), но я не знаком с тем, как обрабатываются QEMU вещи. Любые указатели?
Ответы
Ответ 1
В настоящий момент (с помощью Build Tools v26, если Google не меняет вещи так часто, как они есть), если вы используете директиву -writable-system
при загрузке эмулятора из командной строки, это позволит настойчивость к /system
через перезагрузки. То есть вы сможете писать в раздел /system
, и если вы перезагрузитесь, изменения будут сохранены.
emulator -avd <AVD_NAME> -writable-system
Это также сохранит ваши изменения в файле образа qcow2
, обычно в .android/avd/<AVD_NAME>.avd/system.img.qcow2
Вы даже можете скопировать этот файл system.img.qcow2
, стереть данные с AVD, используя директиву -wipe-data
, поместить этот файл обратно в каталог, перезагрузить и изменения системы, которые вы сделали изначально, по-прежнему будут сохраняться. (Предостережение: по крайней мере на данный момент, поскольку Google продолжает меняться)
Ответ 2
Обновление: Параметр -nand
, по-видимому, был удален из последних версий QEMU, поэтому следующее может не работать больше.
Обновление: См. принятый ответ для текущего способа выполнения действий.
Ответ Yury является общим, но если вы хотите иметь возможность script вещей (что я хочу в конце), вам нужно найти изображение эмулятора в каталоге /tmp
.
Я обнаружил, что вы можете переопределить поведение QEMU. Это немного хакерский, но он работает, поэтому я закончил это:
- Скопируйте
system.img
из каталога платформы в каталог AVD.
- Преобразуйте объем пространства, необходимый для гексагона. Например, если вам нужно 500M, это
0x1f400000
.
-
Запустите эмулятор в режиме чтения-записи:
emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.android/avd/Galaxy_Nexus/system.img
(Если вы поместите эмулятор в подробный режим, вы заметите, что по умолчанию он будет использовать initfile=
вместо file=
)
-
Внесите свои изменения, они немедленно сохраняются в локальном system.img
- Теперь вы можете просто запустить эмулятор с помощью
emulator -avd Galaxy_Nexus
, и он будет использовать ваши изменения
Обновление:. Если скрипты, QEMU не синхронизирует изменения непосредственно с изображением, поэтому, если вы перезагружаетесь сразу после изменения чего-либо, скорее всего, вы потеряете данные. Я ищу способ обойти это...
Следующее обновление: Используйте adb -e emu kill
, чтобы остановить эмулятор. reboot
будет делать плохие вещи.
Ответ 3
На самом деле это очень хороший вопрос. У меня были такие же проблемы. Вот мои выводы. Фактически, я использую Ubuntu, и я опишу шаги для Ubuntu. Если вы используете Windows, вы должны просто изменить пути.
- Создайте новый AVD, например
example.avd
- Скопировать system.img из
android-sdk-linux/platforms/android-10/images
до ~/.android/avd/example.avd
- Сделайте system.img доступным для записи и чтения (либо в свойствах
или просто используя терминал)
- Запустите AVD с помощью команды
emulator -avd example
- Перезагрузите систему как rw с помощью оболочки adb
mount -o rw,remount -t
yaffs2 /dev/block/mtd0 /system
(чтобы узнать, как использовать раздел
команда cat /proc/mtd
)
- Внесите свои изменения...
- Теперь во время запуска эмулятора найдите эмулятор tmp в
/tmp/android-<your_computer_name>
со странным именем:
emulator-PQ7LgE
и скопируйте его в ~/.android/avd/example.avd
- Удалить
system.img
и переименовать скопированный эмулятор tmp в system.img
- Закрыть эмулятор
- Удалить
cache.img
, userdata.img
и userdata-qemu.img
из
~/.android/avd/example.avd
- Запустите эмулятор еще раз
Удачи!
Ответ 4
Решение №2 удивительно.
Вот некоторые подсказки, если вы используете MS Win как хост
Каталоги AVD расположены ниже, но следует использовать "короткие" имена путей
в качестве параметра file = path. Вариант цитируемого пути не работает по какой-либо причине.
Win XP: C:\Documents and Settings\(имя пользователя) \.android\avd \...
Короткие C:\DOCUME ~ 1\(имя пользователя)\ANDROI ~ 1\avd \...
Win 7 C:\Users\(имя пользователя) \.android\avd \...
Вы можете создать собственный файл bat, например "startrw.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
Этот способ можно загрузить одним щелчком мыши.
Закончив модификацию, просто закройте текущее командное окно, чтобы убить эмулятор.
Загрузка большинства вещей, таких как Emulator, редактор ADT, занимает много времени, вам нужно щелкнуть левой кнопкой мыши по левой части экрана эмулятора, чтобы увидеть дерево файлов в правом окне и т.д.
Ответ 5
Мне не удалось найти файл system.img и каталог AVD, который F.X. опубликовано. На Mac вы можете найти их здесь:
- system.img:
~/Library/Android/sdk/system-images/android-19/default/
- Каталог AVD:
~/.android/avd/Nexus.avd/
У меня недостаточно репутации, чтобы добавить его в качестве комментария, поэтому мне пришлось публиковать его так. К сожалению.
Ответ 6
F.X. ответ не работает для меня с Android API 19 и 21 на Windows в его нынешнем виде. При заданных параметрах
emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>
система не смонтирует изображение. Посмотрев на вывод ядра, я обнаружил, что использует подозрительный размер страницы (2048) и два ненулевых значения параметра: дополнительный размер и "стирание". Эти параметры нигде не документированы, но вы можете увидеть их в исходном коде qemu. То, что закончилось для меня, было
emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>,pagesize=512,extrasize=0
С указанными параметрами "erase" также устанавливается на 0.
Я также с удивлением обнаружил, что с этими параметрами система не может загрузиться в графическую среду, но работает adb.
Ответ 7
Лучший способ сделать это - использовать следующую команду:
emulator -avd <AVD> -partition-size 512
Ответ 8
Новые решения нового года.
Просто скопируйте system.img в свою avd-папку и переименуйте system.img в system-qemu.img
Для меня копирование C:\Android\sdk\system-images\android-22\android-tv\armeabi-v7a\system.img
до C:\Users\Neil Agarwal\.android\avd\Android_TV_1080p_API_22.avd\
и переименовать его в system-qemu.img сделал трюк.
Пожалуйста, перезапустите свой avd после этого.