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

Вытаскиваем сохранения приложений из каталога 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%

 

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

 

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

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

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

Дополню - бекапы через adb backup могут быть заблокированы, если в манифесте приложения прописано android:allowBackup false. В этом случае для того, чтобы сохранить бекап, придется отредактировать манифест приложения и заменить false на true, это можно сделать например с помощью APK Editor.
Важно - сделать это нужно заранее, при установке приложения - т.е. если планируете в дальнейшем сохранять его данные. Если же вы обнаружили проблему постфактум - то не судьба, отредактировать манифест у уже установленных приложений не получится без рута.

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

  • Модераторы
В 14.07.2024 в 10:56, Cheburator2k сказал:

бекапы через adb backup могут быть заблокированы

А могут быть заблокированы частичные бэкапы - apk, obb и т.д.?

Столкнулся сейчас с одной фигней, чешу репу.

Вот моя строчка бэкапа, для примера:

adb backup -f %archivename% -apk -obb %packagename% 

 

Так вот, при фактически полном бэкапе могут не бэкапиться либо apk, либо obb, либо оба вместе. И даже данные.

Проверил несколько игр - на некоторых не бэкапится apk или data, а вот с obb пока не нашел ни одну, где бы он забэкапился.

 

А вот "из-под полы" все выдергивается замечательно - и apk, и obb и данные.

 

И еще интересно - некоторые игры не бэкапят apk, если игра не запускалась ни разу.

 

Следующий этап - проверка ab бэкапов на смартфоне, посмотрим как там с obb дело обстоит.

В общем, нашел себе очередную заботу на одно место...

 

p.s. На шлеме архиватор кривой, совершенно точно.

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

В первом случае в архиве было все - apk, obb, data. Во втором, на шлеме, только apk и data.

 

Пока ковыряюсь в logcat, там что-то интересное. Но нет ни слова про obb файлы! Точнее, есть вот это:

07-16 14:34:06.771  7474  9041 I ObbBackupService: 0 files to back up
 

 

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

  • 1 месяц спустя...

Видимо на новых прошивках пофиксили бекапы, а на старых есть проблема - окно подтверждения не появляется, а вместо этого черный экран и 3 переливающиеся точки, но я нашел решение этой проблемы:
Запускаем любое простое андроидное приложение (2D);
Запускаем бекап через adb backup ...
Получив черный экран и 3 точки жмем кнопку окулус (O) или что там у вас на новых контроллерах, возвращяемся в виртуальную среду, видим окно с 2D приложением;
В другой консоли (консоль с бекапом не трогаем - пусть висит) запускаем adb shell, вводим команду:

Цитата

am stack list

Получаем список вида:
Stack id=... displayId=...
  taskId=...

В этом списке ищем displayId стека с 2D приложением и stackId стека с приложением com.android.backupconfirm

Вводим команду, подставив найденные id:

Цитата

am display move-stack <stackId> <displayId>

И окно подтверждения отобразится поверх 2D приложения, теперь можно подтвердить бекап. Эти действия достаточно сделать один раз, далее окно подтверждения бекапа будет сразу отображаться нормально, так что можно бекапить подряд все приложения например батником. При восстановлении из бекапа действуем аналогично.
Таким образом я успешно забекапил и восстановил настройки приложений после сброса.

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

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

  • Модераторы
25 минут назад, Cheburator2k сказал:

Таким образом я успешно забекапил и восстановил настройки приложений после сброса.

А попробуй забэкапить obb таким образом. Ну то есть сделать полный бэкап:

adb backup -apk -obb -f app_packahename backup_app.ab

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

Пробовал по всякому, разные игры и приложения, пробовал бэкапить ту же самую команду (и одну и ту же игру, Tricky Doors, если интересно), на смартфоне - все ок, полный бэкап как надо: данные, апк, obb. А на шлеме obb как будто и нет.

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

Проверил, судя по размеру забекапилось с obb, разворачивать бекап не пробовал. Единственное, я выбрал для теста приложение с относительно небольшим obb - 1.4Гб, обычно они гораздо жирнее.

Возможно бекап obb сломали на последних прошивках, где ограничили доступ к данным приложений.

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

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

  • Модераторы
3 часа назад, Cheburator2k сказал:

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

Вот как раз время это экономит. Не нужно заморачиваться с отдельным тасканием obb туда-сюда, а сразу можно восстановить все полностью, пачкой или выборочно...

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

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

  • Модераторы

Кстати, еще интересную вещь обнаружил: если приложение не запускалось ни разу, файл бэкапа будет пустой. Точнее, 47 байт, только заголовок, вероятно.

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

 

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

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

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

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

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

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

Войти

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

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

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

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