- Регистрация
- 03.05.2016
- Сообщения
- 773
- Благодарностей
- 517
- Баллы
- 93
Всем привет, с вами Дмитрий!
В этой статье я расскажу про свое решение, как хранить и запускать образы Memu, при этом не забивать "Диспетчер устройств Memu" большим количеством устройств.
К статье будут прикреплены шаблоны:
Немного о работе Memu.
Что такое устройство Memu? Это образ виртуальной машины, предназначенный для имитации ОС Android на ПК. Все устройства хранятся в одной общей папке, из которой осуществляется запуск устройств. Для каждого устройства создается отдельная папка, где хранятся все нужные данные (в том числе и образ устройства), чтобы запустить эмуляцию устройства Android. Если нам для работы нужно большое количество устройств и все они будут лежать в папке для запуска Memu, то у нас возникнут проблемы с их работой. Поэтому, чтобы все запускалось без ошибок, нам нужно хранить образы устройств отдельно и очищать устройства Memu.
Чтобы запустить нужный нам образ, нам достаточно его сохранить\перенести в отдельное хранилище, а потом создать новое устройство, удалить пустой образ, подставить нужный нам образ и новое устройство будет запущено под нужным нам образом со всеми его данными.
Логика работы.
Чтобы мы могли работать с большим количеством устройств, нам нужно:
Чтобы запустить нужный нам образ для работы, нам нужно:
Вспомогательный Класс MemuVmdk.
Для того, что бы осуществить данную логику, я написал свой класс MemuVmdk, чтобы удобно управлять образами Memu.
Данный класс позволяет переносить образы Memu из папки устройства в папку хранения образов и наоборот, а так же сохранять и подгружать профили устройства ZennoDroid. Класс MemuVmdk находится в общем коде.
Запускаем шаблон DCreator
ВАЖНО! Заходим во входные настройки и указываем Директория запуска устройств Memu и Директория хранения устройств.
Директория хранения устройств - указываете папку, где будут храниться образы устройств.
Директорию запуска устройств Memu - берем из "Диспетчера устройств Memu"
Там хранятся данные всех наших эмуляторов Memu.
Выбираем устройство, которое хотим создать. Если нужно установить приложения - указываем путь к папке, где хранятся apk.
Запускаем шаблон, можем запустить диспетчер устройств Memu, чтобы посмотреть, как это работает.
Все готово, устройство создано, образ перенесен в хранилище, устройство удалено из Memu.
Проверка работы образов.
Запускаем шаблон Tester, во входных настройках указываем Директория запуска устройств Memu и Директорию хранения устройств, как в DCreator, и имя папки устройства, которое хотим запустить.
Шаблон Tester создаст новое устройство Memu, очистит пустой образ, подгрузит нужный образ, запустит эмулятор. После работы вернет образ в хранилище и удалит устройство из Memu.
(Tester) Данный шаблон - это пример работы с образами.
Для ваших проектов нужно будет делать менеджер образов через Базу Данных или XML файл с хранением данных о занятости образа.
Важно: Android 12 пока не работает как нужно, это проблема на стороне Memu, а не ZDP. Проблема заключается в том, что если перенести образ Android 12, он больше не запустится.
#####################
Мой Телеграм Канал
Мой Youtube Канал
Поддержка автора: Донат
USDT TRC20: TBbnjJGwHEeKP5KEr7FNhsBmhR6V1XKds1
#####################
У кого проблемы с YouTube, продублировал видео в ВК
В этой статье я расскажу про свое решение, как хранить и запускать образы Memu, при этом не забивать "Диспетчер устройств Memu" большим количеством устройств.
К статье будут прикреплены шаблоны:
- DCreator - шаблон по созданию Memu устройств;
- Tester - шаблон для проверки запуска и сохранения устройств Memu;
Немного о работе Memu.
Что такое устройство Memu? Это образ виртуальной машины, предназначенный для имитации ОС Android на ПК. Все устройства хранятся в одной общей папке, из которой осуществляется запуск устройств. Для каждого устройства создается отдельная папка, где хранятся все нужные данные (в том числе и образ устройства), чтобы запустить эмуляцию устройства Android. Если нам для работы нужно большое количество устройств и все они будут лежать в папке для запуска Memu, то у нас возникнут проблемы с их работой. Поэтому, чтобы все запускалось без ошибок, нам нужно хранить образы устройств отдельно и очищать устройства Memu.
Чтобы запустить нужный нам образ, нам достаточно его сохранить\перенести в отдельное хранилище, а потом создать новое устройство, удалить пустой образ, подставить нужный нам образ и новое устройство будет запущено под нужным нам образом со всеми его данными.
Логика работы.
Чтобы мы могли работать с большим количеством устройств, нам нужно:
- Создать устройство Memu, запустить его, настроить для работы.
- Перенести образ устройства в хранилище.
- Удалить устройство из "Менеджера устройств Memu".
Чтобы запустить нужный нам образ для работы, нам нужно:
- Создать новое устройство Memu.
- Удалить пустой образ этого устройства.
- Перенести нужный нам образ в данное устройство.
- Запустить устройство, начать работать.
- По завершению работы перенести образ устройства в хранилище.
- Удалить устройство из "Менеджера устройств Memu".
Вспомогательный Класс MemuVmdk.
Для того, что бы осуществить данную логику, я написал свой класс MemuVmdk, чтобы удобно управлять образами Memu.
Данный класс позволяет переносить образы Memu из папки устройства в папку хранения образов и наоборот, а так же сохранять и подгружать профили устройства ZennoDroid. Класс MemuVmdk находится в общем коде.
Инициализация класса.
Чтобы создать объект MemuVmdk, нужно передать 2 важных параметра:
- mainLaunchMemu - путь к папке, откуда запускаются образы Memu. Где взять данный путь, смотрите ниже на скриншоте.
- mainStorage - путь к папке хранилища образов.
Данные пути мы передаем через Входные настройки.
Код инициализации:
После создания объекта MemuVmdk нам будут доступны методы:
- launchFolder: имя папки устройства Memu, которая хранится в общей папке, откуда запускаются все образы Memu. Её мы получаем когда устройство создано и выбрано в ZDP, через методы ZD instance.DroidInstance.Info.Name;
- storageFolder: Если мы сохраняем образ, то генерируем сами, как нам удобно (я беру логин из профиля project.Profile.Login и добавляю информацию для удобного понимания, например ZD_Версия Андройд). Если мы загружаем образ, то получаю имя нужной нам папки из хранилища образов.
Данные методы являются логическими, то есть возвращают:
True - если все было выполнено без ошибок;
False - если не удалось перенести файлы.
Примеры:
- IProfile profile: передаем project.Profile
- storageFolder: имя папки, куда мы сохраняем данные
- version: версия Android, с которым мы работаем, в дальнейшем по этому имени будет создаваться устройство. Имя берется из входных настроек версии Android.
Принимает:
- IProfile profile: передаем project.Profile
- storageFolder: имя папки, куда мы сохраняем данные
Чтобы создать объект MemuVmdk, нужно передать 2 важных параметра:
- mainLaunchMemu - путь к папке, откуда запускаются образы Memu. Где взять данный путь, смотрите ниже на скриншоте.
- mainStorage - путь к папке хранилища образов.
Данные пути мы передаем через Входные настройки.
Код инициализации:
C#:
var mainLaunchMemu = project.Variables["MainLaunchMemu"].Value;
var mainStorage = project.ExecuteMacro(project.Variables["MainStorage"].Value);
var memu = new MemuVmdk(mainLaunchMemu, mainStorage);
- bool VmdkSave(string launchFolder, string storageFolder)
- bool VmdkLoad(string launchFolder, string storageFolder)
- launchFolder: имя папки устройства Memu, которая хранится в общей папке, откуда запускаются все образы Memu. Её мы получаем когда устройство создано и выбрано в ZDP, через методы ZD instance.DroidInstance.Info.Name;
- storageFolder: Если мы сохраняем образ, то генерируем сами, как нам удобно (я беру логин из профиля project.Profile.Login и добавляю информацию для удобного понимания, например ZD_Версия Андройд). Если мы загружаем образ, то получаю имя нужной нам папки из хранилища образов.
Данные методы являются логическими, то есть возвращают:
True - если все было выполнено без ошибок;
False - если не удалось перенести файлы.
Примеры:
C#:
var v = project.Variables["android_V"].Value;
var launchFolder = droid.Info.Name;
var storageFolder = $"ZD_{v} {profile.Login}";
var isMove = memu.VmdkSave(launchFolder, storageFolder);
if (!isMove)
{
throw new Exception("Ошибка переноса рабочего образа");
}
project.SendInfoToLog("Перенесли образ", true);
C#:
// Создаем устройство Memu
var mainLaunchMemu = project.Variables["MainLaunchMemu"].Value;
var mainStorage = project.ExecuteMacro(project.Variables["MainStorage"].Value);
var storageFolder = project.Variables["StorageFolder"].Value;
var droid = instance.DroidInstance as IDroidInstanceEmulatorAPI;
var memu = new MemuVmdk(mainLaunchMemu, mainStorage);
var v = memu.ProfileLoad(project.Profile, storageFolder);
var name = "Work_" + project.Profile.Login;
droid.Action.Create(v);
droid.Action.Rename(droid.Info.Index, name);
var launchFolder = droid.Info.Name;
// Удаляем пустой образ.
var isDelet = memu.DeletVmdk(launchFolder);
if (!isDelet)
{
throw new Exception("Ошибка удаления пустого образа");
}
project.SendInfoToLog("Удалили пустой образ", true);
// Подгружаем образ и запускаем
var isMove = memu.VmdkLoad(launchFolder, storageFolder);
if (!isMove)
{
throw new Exception("Ошибка переноса рабочего образа");
}
project.SendInfoToLog("Подгрузили рабочий образ", true);
- bool DeletVmdk(string launchFolder)
C#:
var launchFolder = droid.Info.Name;
// Удаляем пустой образ.
var isDelet = memu.DeletVmdk(launchFolder);
if (!isDelet)
{
throw new Exception("Ошибка удаления пустого образа");
}
project.SendInfoToLog("Удалили пустой образ", true);
- void ProfileSave(IProfile profile, string storageFolder, string version)
- IProfile profile: передаем project.Profile
- storageFolder: имя папки, куда мы сохраняем данные
- version: версия Android, с которым мы работаем, в дальнейшем по этому имени будет создаваться устройство. Имя берется из входных настроек версии Android.
C#:
var v = project.Variables["android_V"].Value;
var profile = project.Profile;
var storageFolder = $"ZD_{v} {profile.Login}";
memu.ProfileSave(profile, storageFolder, v);
project.SendInfoToLog("Профиль сохранен", true);
- string ProfileLoad(IProfile profile, string storageFolder)
Принимает:
- IProfile profile: передаем project.Profile
- storageFolder: имя папки, куда мы сохраняем данные
C#:
var storageFolder = project.Variables["StorageFolder"].Value;
// Подгружаем профиль
var v = memu.ProfileLoad(project.Profile, storageFolder);
// Создаем устройство
var name = "Work_" + project.Profile.Login;
droid.Action.Create(v);
droid.Action.Rename(droid.Info.Index, name);
Запускаем шаблон DCreator
ВАЖНО! Заходим во входные настройки и указываем Директория запуска устройств Memu и Директория хранения устройств.
Директория хранения устройств - указываете папку, где будут храниться образы устройств.
Директорию запуска устройств Memu - берем из "Диспетчера устройств Memu"
Там хранятся данные всех наших эмуляторов Memu.
Выбираем устройство, которое хотим создать. Если нужно установить приложения - указываем путь к папке, где хранятся apk.
Запускаем шаблон, можем запустить диспетчер устройств Memu, чтобы посмотреть, как это работает.
Все готово, устройство создано, образ перенесен в хранилище, устройство удалено из Memu.
Проверка работы образов.
Запускаем шаблон Tester, во входных настройках указываем Директория запуска устройств Memu и Директорию хранения устройств, как в DCreator, и имя папки устройства, которое хотим запустить.
Шаблон Tester создаст новое устройство Memu, очистит пустой образ, подгрузит нужный образ, запустит эмулятор. После работы вернет образ в хранилище и удалит устройство из Memu.
(Tester) Данный шаблон - это пример работы с образами.
Для ваших проектов нужно будет делать менеджер образов через Базу Данных или XML файл с хранением данных о занятости образа.
Важно: Android 12 пока не работает как нужно, это проблема на стороне Memu, а не ZDP. Проблема заключается в том, что если перенести образ Android 12, он больше не запустится.
#####################
Мой Телеграм Канал
Мой Youtube Канал
Поддержка автора: Донат
USDT TRC20: TBbnjJGwHEeKP5KEr7FNhsBmhR6V1XKds1
#####################
У кого проблемы с YouTube, продублировал видео в ВК
VK | VK
vk.com
Вложения
-
629,2 КБ Просмотры: 37
Последнее редактирование: