Модераторы Varset 224 Опубликовано 6 июля Модераторы Поделиться #1 Опубликовано 6 июля Некоторые сохранения невозможно вытащить со шлема обычным способом, например файл savegame00.save от игры Resident Evil 4 или файл Settings.sav от игры In Death: Unchained. Здесь мы расскажем о небольших хитростях, которые помогут это сделать. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Модераторы Varset 224 Опубликовано 6 июля Автор Модераторы Поделиться #2 Опубликовано 6 июля Итак, для нечала, как всегда, преамбула. В среде Андроид имеется встроенная система бэкапа приложений, и с помощью adb ее можежно запустить так: adb backup -f <имя архива> -noapk -noobb <название пакета приложения> Как видно из строки, в данном случае бэкапятся только данные. Ни apk файл, ни obb не входят в бэкап, но мы их можем вытащить и обычным образом. Ну, почти обычным. Вот этим мы и воспользуемся, а затем просто расковыряем файл архива и вытащим из него вожделенные сейвы. Все что ниже - просто пример, но его можно использовать. Возьмем игру Resident Evil 4 и на ней покажем этот способ. Для вытаскивания сейва нам понадобится узнать имя приложения, это можно сделать массой вариантов, один из которых Quas - пункты J - D - 2 - 3. Программа выведет список неофициальных приложений, среди которых будет искомое: Таким образом, название пакета приложения - 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% По желанию можно использовать либо время, либо дату, а можно и то и другое вместе и в любом порядке. ЭВРИКА!!!! Что означает - нашел! А нашел вот что - после восстановления бэкапа стандартным способом (то есть - встроенным в Андроид механизмом), файлы сохранений становятся перезаписываемыми: Иными словами достаточно стягивать бэкапы способом выше, через скрипт, и пусть себе лежат до тех пор, пока не понадобится их восстановить. И как только сей момент наступит, делаем ход конем - играем до мента создания сейва (на любом начальном этапе, главное чтоб сейв создался), затем бэкапим встроенным способом, тут же восстанавливаем этот бэкап тем же встроенным механизмом, а далее накатываем наши забэкапленные сейвы в шлем каким угрдно способом - через 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% Собственно говоря, с методикой автонажатия кнопок распаковка бэкапа уже не так чтоб имеет смысл, разве что вам захочется иметь отдельные файлы сейвов. 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
Hughey 167 Опубликовано 7 июля Поделиться #3 Опубликовано 7 июля Я прославляю гениальность, Как высшую мышленья данность! Пусть она в людях возрастает, Мир светом жизни насыщает! Ссылка на комментарий Поделиться на другие сайты Поделиться
Cheburator2k 15 Опубликовано 14 июля Поделиться #4 Опубликовано 14 июля (изменено) Дополню - бекапы через adb backup могут быть заблокированы, если в манифесте приложения прописано android:allowBackup false. В этом случае для того, чтобы сохранить бекап, придется отредактировать манифест приложения и заменить false на true, это можно сделать например с помощью APK Editor. Важно - сделать это нужно заранее, при установке приложения - т.е. если планируете в дальнейшем сохранять его данные. Если же вы обнаружили проблему постфактум - то не судьба, отредактировать манифест у уже установленных приложений не получится без рута. Изменено 14 июля пользователем Cheburator2k Ссылка на комментарий Поделиться на другие сайты Поделиться
Модераторы Varset 224 Опубликовано 16 июля Автор Модераторы Поделиться #5 Опубликовано 16 июля В 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Cheburator2k 15 Опубликовано 29 августа Поделиться #6 Опубликовано 29 августа Видимо на новых прошивках пофиксили бекапы, а на старых есть проблема - окно подтверждения не появляется, а вместо этого черный экран и 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 приложения, теперь можно подтвердить бекап. Эти действия достаточно сделать один раз, далее окно подтверждения бекапа будет сразу отображаться нормально, так что можно бекапить подряд все приложения например батником. При восстановлении из бекапа действуем аналогично. Таким образом я успешно забекапил и восстановил настройки приложений после сброса. Если подобные проблемы обнаружатся с еще какими-нибудь системными приложениями, вероятно можно действовать аналогичным образом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Модераторы Varset 224 Опубликовано 29 августа Автор Модераторы Поделиться #7 Опубликовано 29 августа 25 минут назад, Cheburator2k сказал: Таким образом я успешно забекапил и восстановил настройки приложений после сброса. А попробуй забэкапить obb таким образом. Ну то есть сделать полный бэкап: adb backup -apk -obb -f app_packahename backup_app.ab У меня не хочет ни в какую. Данные - бэкапит, хоть отдельно, хоть в составе. Апк - то же самое. А вот obb - нет. Пробовал по всякому, разные игры и приложения, пробовал бэкапить ту же самую команду (и одну и ту же игру, Tricky Doors, если интересно), на смартфоне - все ок, полный бэкап как надо: данные, апк, obb. А на шлеме obb как будто и нет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Cheburator2k 15 Опубликовано 30 августа Поделиться #8 Опубликовано 30 августа (изменено) Проверил, судя по размеру забекапилось с obb, разворачивать бекап не пробовал. Единственное, я выбрал для теста приложение с относительно небольшим obb - 1.4Гб, обычно они гораздо жирнее. Возможно бекап obb сломали на последних прошивках, где ограничили доступ к данным приложений. Правда не понимаю зачем нужны такие бекапы - только время тратить и место занимать. Obb, если понадобиться, можно и так стянуть. Изменено 30 августа пользователем Cheburator2k Ссылка на комментарий Поделиться на другие сайты Поделиться
Модераторы Varset 224 Опубликовано 30 августа Автор Модераторы Поделиться #9 Опубликовано 30 августа 3 часа назад, Cheburator2k сказал: Правда не понимаю зачем нужны такие бекапы - только время тратить и место занимать. Obb, если понадобиться, можно и так стянуть. Вот как раз время это экономит. Не нужно заморачиваться с отдельным тасканием obb туда-сюда, а сразу можно восстановить все полностью, пачкой или выборочно... Но смысла в полном бэкапе не очень много, это верно. Приложения обновляются и кидать старые - ну такое. Может поэтому в новых прошивках оно вырезано. Но зачем корежить штатный механизм Андроида - мне все равно непонятно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Модераторы Varset 224 Опубликовано 1 сентября Автор Модераторы Поделиться #10 Опубликовано 1 сентября Кстати, еще интересную вещь обнаружил: если приложение не запускалось ни разу, файл бэкапа будет пустой. Точнее, 47 байт, только заголовок, вероятно. Почему в этом случае не бэкапится апк и возможные данные, которые были созданы при установке - опять же загадка. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти