Перейти к содержанию

Вытаскиваем сохранения приложений из каталога Android/data


Рекомендуемые сообщения

  • Модераторы

Некоторые сохранения невозможно вытащить со шлема обычным способом, например файл savegame00.save от игры Resident Evil 4 или  файл  Settings.sav от игры In Death: Unchained.

Здесь мы расскажем о небольших хитростях, которые помогут это сделать.

Ссылка на комментарий
Поделиться на другие сайты

  • Модераторы

Итак, для нечала, как всегда, преамбула.

 

В среде Андроид имеется встроенная система бэкапа приложений, и с помощью adb ее можежно запустить так:

adb backup -f <имя архива> -noapk -noobb <название пакета приложения>

Как видно из строки, в данном случае бэкапятся только данные. Ни apk файл, ни obb не входят в бэкап, но мы их можем вытащить и обычным образом. Ну, почти обычным.

Вот этим мы и воспользуемся, а затем просто расковыряем файл архива и вытащим из него вожделенные сейвы.

Все что ниже - просто пример, но его можно использовать. Возьмем игру Resident Evil 4 и на ней покажем этот способ. Для вытаскивания сейва нам понадобится узнать имя приложения, это можно сделать массой вариантов, один из которых Quas - пункты J - D - 2 - 3.

Программа выведет список неофициальных приложений, среди которых будет искомое:

 

re4list.JPG.d16a69283a979ebed5b21a67299cd1fb.JPG

 

Таким образом, название пакета приложения - com.Armature.VR4

 

А далее уже непосредственно амбула, то есть батник, каждая строка которого прокомментирована и рассказывает для чего и почему.

Весь нижеследующий текст можно поместить в cmd файл и запустить на ПК, в итоге рядом с батником появится каталог apps, в котором будет каталог с названием приложения, содержащий распакованные данные, в котором и лежат сейвы.

 

@echo off
rem Сюда вписываем название пакета приложения. В данном случае так называется пакет игры Resident Evil 4.
set packagename=com.Armature.VR4

rem В этой строке название архива, оно может быть каким угодно с раширением .ab
set archivename=re4.ab

rem Имя скрипта, в котором лежат команды, выполняемые шлемом. Также какое угодно название.
set shscriptname=dataextract.sh

rem Запуск встроенной архивации данных. В шлеме всплывет окно, в котором следует нажать кнопку Создать резервную копию.
adb backup -f %archivename% -noapk -noobb %packagename%

rem Строка, распаковывающая архив бэкапа
@echo ^( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 /data/local/tmp/%archivename% ^) ^|  tar xfvz - -C /data/local/tmp/>%shscriptname%

rem Отправляем архив бэкапа в шлем
adb push %archivename% /data/local/tmp/ 1>nul

rem Отправляем скрипт в шлем
adb push %shscriptname% /data/local/tmp/ 1>nul

rem Корректируем срипт для среды Андроид
adb shell dos2unix /data/local/tmp/%shscriptname%

rem Выполняем скрипт на шлеме с сохранением результатов в лог файл
adb shell sh /data/local/tmp/%shscriptname% >log.txt 2>nul

rem Вытаскиваем распакованный архив из шлема
adb pull /data/local/tmp/apps %cd%

rem Подчищаем все файлы, которые мы загоняли в шлем
adb shell rm -R /data/local/tmp/ 1>nul 2>nul
pause

 

Один нюанс - батник следует запускать с надетым на голову шлемом, то бишь вслепую жмакнуть Enter, поскольку всплывшее окно про Создать резервную копию имеет свойство исчезать. Если так случилось, просто запустите батник снова.

 

Проверил и на игре In Death - все прекрасно работает, вот лог того, какие данные вытаскиваются:

In Death - Data

apps/com.Solfar.InDeath/_manifest
apps/com.Solfar.InDeath/f/login-identifier.txt
apps/com.Solfar.InDeath/f/UE4Game
apps/com.Solfar.InDeath/f/UE4Game/InDeath
apps/com.Solfar.InDeath/f/UE4Game/InDeath/Engine
apps/com.Solfar.InDeath/f/UE4Game/InDeath/Engine/Saved
apps/com.Solfar.InDeath/f/UE4Game/InDeath/Engine/Saved/Config
apps/com.Solfar.InDeath/f/UE4Game/InDeath/Engine/Saved/Config/Android
apps/com.Solfar.InDeath/f/UE4Game/InDeath/Engine/Saved/Config/Android/Manifest.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Input.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/DeviceProfiles.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/BugTracker.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Engine.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Niagara.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/RuntimeOptions.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/MotoSynth.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/OculusVR.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Hardware.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/VariantManagerContent.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/LiveLink.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Backend.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/ApexDestruction.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/EditorScriptingUtilities.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Game.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/InDeath.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Scalability.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/Synthesis.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/GameplayTags.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/Android/GameUserSettings.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/CrashReportClient
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/CrashReportClient/UE4CC-Android-AA6B6293D4F14FB6B3C3296C78ACD18B
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/Config/CrashReportClient/UE4CC-Android-AA6B6293D4F14FB6B3C3296C78ACD18B/CrashReportClient.ini
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames/Checkpoint.sav
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames/PlayerProgress.sav
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames/General.sav
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames/Settings.sav
apps/com.Solfar.InDeath/f/UE4Game/InDeath/InDeath/Saved/SaveGames/BackupInfoLocal.sav
apps/com.Solfar.InDeath/f/UE4Game/InDeath/NotAllowedUnattendedBugReports
apps/com.Solfar.InDeath/f/Engine
apps/com.Solfar.InDeath/f/Engine/Saved
apps/com.Solfar.InDeath/f/Engine/Saved/Crashes
apps/com.Solfar.InDeath/sp/OVR_platform_shared_prefs_0.xml
apps/com.Solfar.InDeath/ef/UE4Game
apps/com.Solfar.InDeath/ef/UE4Game/InDeath
apps/com.Solfar.InDeath/ef/UE4Game/InDeath/InDeath
apps/com.Solfar.InDeath/ef/UE4Game/InDeath/InDeath/Saved
apps/com.Solfar.InDeath/ef/UE4Game/InDeath/InDeath/Saved/Logs
apps/com.Solfar.InDeath/ef/cloud
apps/com.Solfar.InDeath/ef/cloud/data
apps/com.Solfar.InDeath/ef/cloud/data/SaveGames
apps/com.Solfar.InDeath/ef/cloud/data/SaveGames/General.sav
apps/com.Solfar.InDeath/ef/cloud/data/SaveGames/Checkpoint.sav

 

Вот еще бы автоматически нажимать кнопку "Создать резервную копию данных"...

Пробовал adb shell input tap 380 760 (цифры - координаты кнопки в окне создания бэкапа), но увы, не нажимается она. Координаты считываются нормально, а вот сэмулировать нажатие лучом контроллера не получается.

 

К сожалению, вынужден немного огорчить - слить сейвы это только половина дела, другая половина - закинуть их обратно, на место имеющихся, что тоже нетривиальная задача, над которой надо подумать. Если будут результаты, то уже в следующей серии.

 

А пока можно пользоваться встроенным восстановлением Андроид, у нас же файл бэкапа сохраяется.

Это делается вот таким простым батником:

rem Название архива бэкапа
set archivename=indeath.ab

rem Команда восстановления
adb restore %archivename%
pause

 

После запуска появится такое же окно Андроид как и в первом случае, только нужно будет нажать кнопку "Восстановить данные".

 

А чтобы не путаться в бэкапах, поделюсь одним хинтом - можно в первый батник добавить время и дату к имени файла.

Вот таким образом:

 

set dt=%date:~0,2%.%date:~3,2%.%date:~6,4%
set tm=%time:~0,2%-%time:~3,2%-%time:~6,2%
set tm=%tm: =0%
echo %dt%_%tm%

 

По желанию можно использовать либо время, либо дату, а можно и то и другое вместе и в любом порядке.

 

ЭВРИКА!!!!

 

Что означает - нашел! А нашел вот что - после восстановления бэкапа стандартным способом (то есть - встроенным в Андроид механизмом), файлы сохранений становятся перезаписываемыми:

image.png.46ab92dc67469ea8ece2d5172c201518.png

 

Иными словами достаточно стягивать бэкапы способом выше, через скрипт, и пусть себе лежат до тех пор, пока не понадобится их восстановить. 

 

И как только сей момент наступит, делаем ход конем - играем до мента создания сейва (на любом начальном этапе, главное чтоб сейв создался), затем бэкапим встроенным способом, тут же восстанавливаем этот бэкап тем же встроенным механизмом, а далее накатываем наши забэкапленные сейвы в шлем каким угрдно способом - через TC  с плагином ADB или прямой командой aADB - неважно, главное что теперь их можно вернуть обратно. А стянуть - вон выше скрипт, работает безотказно.

 

Но в этом случае все-же следует помнить одну вещь: следующее сохранение в игре установит файлам сейвов все тот же запрет на чтение, так что не уходите далеко от скрипта, он еще пригодится.
 

Решение найдено и опубликовано в соседней теме. Теперь бэкапы создаются и восстанавливаются полностью автоматически.

 

Итак, обновленная и окончательная процедура, автоматически создающая бэкап данных:

@echo off
set packagename=com.Armature.VR4
set archivename=re4.ab
rem set packagename=com.rockvr.moonplayer
rem set archivename=mvp.ab
rem set packagename=com.vertigogames.azs2
set noapk=no
set noobb=no
set shscriptname=dataextract.sh

adb shell am broadcast -a com.oculus.vrpowermanager.prox_close 1>nul 2>nul

adb shell input keyevent 224

@start /min "" adb backup -f %archivename% -%noapk%apk -%noobb%obb %packagename% 1>nul 2>nul

@echo Bckup started..

timeout 2 1>nul

adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 66
@echo Creating backup... 

call :_CheckBackupProcess

@echo Extracting data from backup file...

@echo ^( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 /data/local/tmp/%archivename% ^) ^| tar xfvz - -C /data/local/tmp/>%shscriptname%

adb push %archivename% /data/local/tmp/ 1>nul 2>nul
adb push %shscriptname% /data/local/tmp/ 1>nul 2>nul
adb shell dos2unix /data/local/tmp/%shscriptname% 1>nul 2>nul
adb shell sh /data/local/tmp/%shscriptname% >log.txt 2>nul
adb pull /data/local/tmp/apps %cd% 1>nul 2>nul
adb shell rm -R /data/local/tmp/ 1>nul 2>nul
adb shell am broadcast -a com.oculus.vrpowermanager.automation_disable 1>nul 2>nul
del /q /f %shscriptname% 1>nul 2>nul
rem Эту строку можно закомментировать и тогда файл бэкапа re4.ab удаляться не будет.
del /q /f %archivename% 1>nul 2>nul

@echo Done.
pause
exit

:_CheckBackupProcess
@for /f "tokens=1,2,3 delims=:= " %%a in ('adb.exe shell dumpsys activity activities ^| findstr /i /c:"taskAffinity"') do (
if [%%c] == [com.android.backupconfirm] (timeout 2 >1 && goto _CheckBackupProcess) else (exit /b)
)

 

В процедуру добавлен цикл, проверяющий окончание создания бэкапа.

Пока без комментариев, добавлю позже.

 

А это батник, восстанавливающий бэкап обратно на шлем:

@echo off

rem Вписываем имя файла бэкапа, который нужно восстановить
set archivename=re4.ab

@adb shell am broadcast -a com.oculus.vrpowermanager.prox_close 1>nul 2>nul

adb shell input keyevent 224

@start /min "" adb restore %archivename%
timeout 2 1>nul

adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 61
ping localhost -n 1 1>nul
adb shell input keyevent 66

call :_CheckBackupProcess

adb shell am broadcast -a com.oculus.vrpowermanager.automation_disable 1>nul 2>nul
echo Done.
pause
exit

:_CheckBackupProcess
@for /f "tokens=1,2,3 delims=:= " %%a in ('adb.exe shell dumpsys activity activities ^| findstr /i /c:"taskAffinity"') do (
if [%%c] == [com.android.backupconfirm] (timeout 2 >1 && goto _CheckBackupProcess) else (exit /b)
)

 

После восстановления файлы в каталоге Android/data/com.Armature.VR4 будут доступны для копирования на ПК с помощью стандартной команды adb:

adb pull "/sdcard/Android/data/com.Armature.VR4" %cd%

 

Собственно говоря, с методикой автонажатия кнопок распаковка бэкапа уже не так чтоб имеет смысл, разве что вам захочется иметь отдельные файлы сейвов. 

 

Ссылка на комментарий
Поделиться на другие сайты

Я прославляю гениальность,
Как высшую мышленья данность!
Пусть она в людях возрастает,
Мир светом жизни насыщает!

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...

Важная информация

Правила пользования сайтом Условия использования