Я действительно потратил некоторое время на изучение этого и был удивлен, не найдя ответов ( эта замечательная ветка вообще не решает эту проблему... Я пытаюсь оправиться от моей неудачной ситуации: я настроил дополнительного пользователя на мой Nexus 7 4.2.2 и мое устройство (еще) не рутировано. Теперь я, как и многие другие, понимаю, что рутирование сотрет все, чтобы разблокировать (если бы я только прочитал это сначала), и я пытаюсь сделать резервную копию всего приложения данные для второго пользователя.
Когда я пытаюсь запустить любую резервную копию на основе adb для дополнительного пользователя, она просто зависает, а затем истекает время ожидания, создавая пустой файл .ab. Аккаунт владельца отлично копируется.
Есть идеи? Многопользовательский режим слишком новый? Я столкнулся с другими раздражающими вещами (клиент VPN не подключается, не может войти в настройки разработчика, не может даже изменить настройки ВРЕМЕНИ и т. д.)
Спасибо!
Если вы используете 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
существует аргумент. Я пробовал два сценария безрезультатно.
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. Также он говорит, что запускает пользовательский интерфейс подтверждения, хотя я ничего не вижу. В конце концов запросы истекают.
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
dumpsys backup users
доложил? В моем Android служба резервного копирования не работала для моей дополнительной учетной записи пользователя, даже если такая учетная запись пользователя была активна на устройстве. Следовательно, -user
не работает ИМО.Я не думаю, что есть способ найти эксплойт, позволяющий использовать root. adb backup -apk -shared -all
резервное копирование выполняется только для пользователя 0 как для /data/user/, так и для /storage/emulated/ (для устройств без расширяемого хранилища). С 4.4 тоже не повезло.
Иззи
adb devices
Список Nexus ?измененныйNate
adb devices
но когда я запускаю,adb backup...
и он говорит: «разблокируйте устройство и подтвердите ...», ничего никогда не отображается на планшет. Опять же, как владелец отображается сообщение, и резервное копирование работает.Рагхав Суд
измененныйNate