Резервное копирование без полномочий root с несколькими пользователями (не владельцами или дополнительными пользователями)

Я действительно потратил некоторое время на изучение этого и был удивлен, не найдя ответов ( эта замечательная ветка вообще не решает эту проблему... Я пытаюсь оправиться от моей неудачной ситуации: я настроил дополнительного пользователя на мой Nexus 7 4.2.2 и мое устройство (еще) не рутировано. Теперь я, как и многие другие, понимаю, что рутирование сотрет все, чтобы разблокировать (если бы я только прочитал это сначала), и я пытаюсь сделать резервную копию всего приложения данные для второго пользователя.

Когда я пытаюсь запустить любую резервную копию на основе adb для дополнительного пользователя, она просто зависает, а затем истекает время ожидания, создавая пустой файл .ab. Аккаунт владельца отлично копируется.

Есть идеи? Многопользовательский режим слишком новый? Я столкнулся с другими раздражающими вещами (клиент VPN не подключается, не может войти в настройки разработчика, не может даже изменить настройки ВРЕМЕНИ и т. д.)

Спасибо!

Вторичный пользователь все еще настроен после очистки? Или я неправильно понял, что вы уже выполнили вайп/разблокировку? Если вы еще этого не сделали, включена ли отладка по USB при попытке подключения к дополнительному пользователю? adb devicesСписок Nexus ?
Это все до вайпа! Все еще стоковое, всего два пользователя. Поскольку я не могу включить отладку по USB как дополнительный пользователь, я включил ее как владелец. Когда я подключаюсь в качестве дополнительного пользователя, USB Debugging Connected отображается в строке состояния планшета, и я вижу свое устройство в списке, adb devicesно когда я запускаю, adb backup...и он говорит: «разблокируйте устройство и подтвердите ...», ничего никогда не отображается на планшет. Опять же, как владелец отображается сообщение, и резервное копирование работает.
Вы авторизовали это устройство с помощью ADB? 4.2.2 и далее будет запрашивать подтверждение RSA при первом подключении, и это диалоговое окно открывается только в том случае, если вы находитесь в основном пользователе. Однако он работает для всех пользователей после авторизации.
Я не уверен, что вы подразумеваете под авторизацией вне типичного соединения adb... Когда профиль владельца активен, резервное копирование работает нормально, как указано выше: запрашивается предварительно определенный пароль зашифрованного устройства, и при вводе разрешается резервное копирование завершить. Как только я переключаюсь на учетную запись, не являющуюся владельцем, мой компьютер считает это отключенным и повторно подключенным устройством, а затем, как указано, меня никогда не запрашивают для подтверждения, и adb зависает до тех пор, пока не истечет время ожидания, оставив пустой файл .ab.

Ответы (3)

Если вы используете Android 4.2.2, есть способ разблокировать загрузчик без очистки устройства. Используйте towelroot для рутирования вашего устройства. (Он работает на neuxs 7, если у вас есть сборка ядра <3 июня). После этого вы можете использовать следующее приложение, чтобы разблокировать загрузчик (оно не стирает устройство). Затем вы можете использовать резервную копию титана для резервного копирования всего на вашем устройстве, даже если вы вошли в систему как дополнительный пользователь.

Было бы полезно более подробно указать, что вы делаете, например, конкретные команды adb, хотя я думаю, что сталкиваюсь с той же проблемой.

Я считаю, что в вашей ситуации происходит то, что вы (непреднамеренно) делаете резервную копию пользователя-владельца. Поскольку вы находитесь в профиле дополнительного пользователя, вы не увидите приглашение запустить резервное копирование для пользователя-владельца . Так что adb зависает в ожидании подтверждения, которого вы никогда не увидите.

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


Так как же инициировать резервное копирование/восстановление профиля, не являющегося владельцем? Полезно знать, что команды резервного копирования и восстановления adb в конечном итоге выполняются buв системе. Когда вы запускаете bu helpиз оболочки adb, вот результат, который я получаю:

sunfish:/ $ bu help
 backup [-user USER_ID] [-f FILE] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared]
        [-all] [-system|-nosystem] [-keyvalue|-nokeyvalue] [PACKAGE...]
     write an archive of the device's data to FILE [default=backup.adb]
     package list optional if -all/-shared are supplied
     -user: user ID for which to perform the operation (default - system user)
     -apk/-noapk: do/don't back up .apk files (default -noapk)
     -obb/-noobb: do/don't back up .obb files (default -noobb)
     -shared|-noshared: do/don't back up shared storage (default -noshared)
     -all: back up all installed applications
     -system|-nosystem: include system apps in -all (default -system)
     -keyvalue|-nokeyvalue: include apps that perform key/value backups.
         (default -nokeyvalue)
 restore [-user USER_ID] FILE       restore device contents from FILE
     -user: user ID for which to perform the operation (default - system user)

Хорошо, отлично, так что, видимо, есть -userвариант. Большой! Итак, теперь я пытаюсь запустить восстановление для дополнительного пользователя из adb и вот что я получаю:

$ ./platform-tools/adb restore -user 11 <path to android backup>
WARNING: adb restore is deprecated and may be removed in a future release
adb: restore requires an argument

Хорошо, может быть, это привередливо и хочет, чтобы файл резервной копии был первым аргументом. Но это приводит к тому же результату. Я не понял, почему adb не принимает -userаргумент.


Но есть еще вариант, можем запускать buпрямо из adb shell. К сожалению, мне еще не удалось заставить это работать, но я продвинулся дальше. Я сначала заливаю бэкап в профиль Owner и запускаю buиз профиля Owner с помощью adb shell. Я не знаю способа получить оболочку adb в профиле, не являющемся владельцем. Это не должно быть проблемой, потому что для этого и -userсуществует аргумент. Я пробовал два сценария безрезультатно.

  1. Запустите bu -user <uid> <backup file>, войдя в профиль этого uid, в данном случае uid 11. Я не вижу запроса на подтверждение восстановления или что-то визуально происходит. Вот соответствующие строки logcat:
03-14 17:58:29.286 11753 11753 D AndroidRuntime: Calling main entry com.android.commands.bu.Backup
03-14 17:58:29.288 11753 11753 D bu      : Beginning: restore
03-14 17:58:29.289  1493  1731 I BackupManagerService: [UserID:11] Beginning restore...
03-14 17:58:29.289  1493  1731 D BackupManagerService: [UserID:11] Starting restore confirmation UI, token=30388736403-14 17:58:29.289  1493  1731 I ActivityTaskManager: START u0 {act=fullrest flg=0x20000000 cmp=com.android.backupconfirm/.BackupRestoreConfirmation (has extras)} from uid 1000
03-14 17:58:29.289  1493  1731 W ActivityTaskManager: startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent {act=fullrest flg=0x20800000 cmp=com.android.backupconfirm/.BackupRestoreConfirmation (has extras) }
03-14 17:58:29.293  1493  1731 D BackupManagerService: [UserID:11] Waiting for restore completion...
03-14 17:59:29.388  1493 25093 I BackupManagerService: Full backup/restore timedout waiting for user confirmation
03-14 17:59:29.388  1493  1731 I BackupManagerService: [UserID:11] adb restore processing complete.
03-14 17:59:29.388 11753 11753 D bu      : Finished.

Как видно, BackupManagerService знает, что я запрашиваю восстановление uid 11. Также он говорит, что запускает пользовательский интерфейс подтверждения, хотя я ничего не вижу. В конце концов запросы истекают.

  1. Запустите bu -user <uid> <backup file>, войдя в профиль владельца. Вот соответствующие строки logcat:
03-14 18:00:39.448 11948 11948 D AndroidRuntime: Calling main entry com.android.commands.bu.Backup
03-14 18:00:39.450 11948 11948 D bu      : Beginning: restore
03-14 18:00:39.451  1493  2786 I BackupManagerService: [UserID:11] Beginning restore...
03-14 18:00:39.451  1493  2786 D BackupManagerService: [UserID:11] Starting restore confirmation UI, token=606614021
03-14 18:00:39.451  1493  2786 I ActivityTaskManager: START u0 {act=fullrest flg=0x20000000 cmp=com.android.backupconfirm/.BackupRestoreConfirmation (has extras)} from uid 1000
03-14 18:00:39.451  1493  2786 W ActivityTaskManager: startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=fullrest flg=0x20800000 cmp=com.android.backupconfirm/.BackupRestoreConfirmation (has extras) }
03-14 18:00:39.459  1493  1994 W ActivityTaskManager: Tried to set launchTime (0) < mLastActivityLaunchTime (22366588)
03-14 18:00:39.462  1493  2786 D BackupManagerService: [UserID:11] Waiting for restore completion...
03-14 18:00:39.572  1493  1757 I ActivityTaskManager: Displayed com.android.backupconfirm/.BackupRestoreConfirmation: +112ms
03-14 18:00:43.431  1493  5565 D BackupManagerService: [UserID:0] acknowledgeAdbBackupOrRestore : token=606614021 allow=true
03-14 18:00:43.432  1493  5565 W BackupManagerService: [UserID:0] Attempted to ack full backup/restore with invalid token
03-14 18:00:46.213  1493  2063 D InputDispatcher: Waiting to send key to Window{200410c u0 com.android.backupconfirm/com.android.backupconfirm.BackupRestoreConfirmation} because there are unprocessed events that may cause focus to change
03-14 18:01:39.563  1493 25093 I BackupManagerService: Full backup/restore timed out waiting for user confirmation
03-14 18:01:39.563  1493  2786 I BackupManagerService: [UserID:11] adb restore processing complete.
03-14 18:01:39.564 11948 11948 D bu      : Finished.

Как и в первой попытке, мы видим, что BackupManagerService пытается выполнить восстановление для uid 11. Он запускает пользовательский интерфейс подтверждения, который всплывает. Затем я подтверждаю восстановление. Но затем мы видим, что его uid 0 подтверждает восстановление, и я считаю, что полученный токен недействителен. Имеет смысл, почему один профиль может подтверждать резервное копирование/восстановление другого? (имеет смысл, чтобы профиль владельца мог это сделать)

Так что я думаю, что я наткнулся на блокпост здесь. Я не уверен, как заставить пользовательский интерфейс подтверждения работать под правильным пользователем. Я подозреваю, что это (до сих пор!) не было протестировано сообществом Android, хотя зачем вообще иметь такой -userвариант?


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

03-14 18:00:28.422  1493  5597 W WindowManager: Attempted to set replacing window on app token with no content Token{b3c5879 ActivityRecord{23cb9be u0 com.android.backupconfirm/.BackupRestoreConfirmation t1100006}}
03-14 18:00:28.610  1493  2786 I ActivityTaskManager: Activity reported stop, but no longer stopping: ActivityRecord{23cb9be u0 com.android.backupconfirm/.BackupRestoreConfirmation t1100006}
03-14 18:00:37.042  1493  2063 D InputDispatcher: Waiting to send key to Window{6f7d966 u0 com.android.backupconfirm/com.android.backupconfirm.BackupRestoreConfirmation} because there are unprocessed events that may cause focus to change

Вы проверили, работает ли служба backupmanager для вашего пользователя 11? Что dumpsys backup usersдоложил? В моем Android служба резервного копирования не работала для моей дополнительной учетной записи пользователя, даже если такая учетная запись пользователя была активна на устройстве. Следовательно, -userне работает ИМО.

Я не думаю, что есть способ найти эксплойт, позволяющий использовать root. adb backup -apk -shared -allрезервное копирование выполняется только для пользователя 0 как для /data/user/, так и для /storage/emulated/ (для устройств без расширяемого хранилища). С 4.4 тоже не повезло.