7 votes

Sauvegarde non-root avec plusieurs utilisateurs (non-propriétaires ou utilisateurs secondaires)

J'ai vraiment passé du temps à faire des recherches sur ce sujet et j'ai été surpris de ne trouver aucune réponse ( ce grand fil de discussion n'aborde pas du tout ce problème... . J'essaie de me remettre de cette situation malheureuse : J'ai configuré un utilisateur secondaire sur ma Nexus 7 4.2.2 et mon appareil n'est pas (encore) rooté. Maintenant, comme beaucoup d'autres, je me rends compte que le rooting va tout effacer pour débloquer (si seulement j'avais lu cela avant), et j'essaie de sauvegarder toutes les données des applications pour l'utilisateur secondaire.

Lorsque j'essaie d'exécuter une sauvegarde basée sur adb sur l'utilisateur secondaire, elle se bloque et s'arrête, créant un fichier .ab vide. Le compte utilisateur du propriétaire effectue une sauvegarde sans problème.

Des idées ? Le multi-utilisateur est-il simplement trop récent ? J'ai rencontré d'autres problèmes (aucun client VPN ne se connecte, je ne peux pas accéder aux paramètres du développeur, je ne peux même pas changer les paramètres TIME, etc...).

Merci !

2voto

Chrisii Points 641

Si vous êtes sous Android 4.2.2, il existe un moyen de déverrouiller le bootloader sans effacer l'appareil. Utilisez racine de serviette pour Rooter votre appareil. (Cela fonctionne sur un neuxs 7 tant que vous avez un noyau construit < Jun 3). Ensuite, vous pouvez utiliser ce qui suit application pour déverrouiller le bootloader (cela n'efface pas l'appareil). Ensuite, vous pouvez utiliser titanium backup pour sauvegarder tout ce qui se trouve sur votre appareil, même lorsque vous êtes connecté en tant qu'utilisateur secondaire.

1voto

crass Points 133

Il serait utile d'être plus explicite dans ce que vous faites, comme des commandes adb spécifiques, bien que je pense que je rencontre le même problème.

Je pense que ce qui se passe dans votre situation est que vous prenez (involontairement) une sauvegarde de l'utilisateur propriétaire. Puisque vous êtes dans le profil d'utilisateur secondaire, vous ne verrez pas l'invitation à démarrer la sauvegarde. pour l'utilisateur propriétaire . Donc adb se bloque en attendant une confirmation que vous ne voyez jamais.

Il est important de noter que les sessions adb s'exécutent toujours dans le contexte de l'utilisateur propriétaire. Ainsi, si vous ne transmettez pas d'identifiant d'utilisateur au processus de sauvegarde, il effectuera une sauvegarde du profil du propriétaire.


Alors comment faire pour initier une sauvegarde/restauration vers un profil non propriétaire ? Il est utile de savoir que les commandes de sauvegarde et de restauration adb finissent par exécuter bu sur le système. Lorsque vous exécutez bu help depuis le shell adb voici la sortie que j'obtiens :

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)

Ok super, donc apparemment il y a un -user option. Super ! Alors maintenant, j'essaie d'exécuter une restauration pour un utilisateur secondaire à partir de adb et voici ce que j'obtiens :

$ ./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

Ok, peut-être qu'il est tatillon et qu'il veut le fichier de sauvegarde comme premier argument. Mais cela donne le même résultat. Je n'ai pas encore compris pourquoi adb ne prend pas le fichier -user argument.


Mais il y a une autre option, nous pouvons exécuter bu directement depuis le shell adb. Malheureusement, je n'ai pas encore réussi à faire fonctionner cette méthode non plus, mais j'ai progressé. Je télécharge d'abord la sauvegarde vers le profil du propriétaire et je lance bu depuis le profil du propriétaire en utilisant le shell adb. Je ne connais aucun moyen d'obtenir un shell adb sur un profil non propriétaire. Cela ne devrait pas être un problème, car c'est ce que fait l'ordinateur. -user l'argument est pour. J'ai essayé deux scénarios, sans succès.

  1. Exécuter bu -user <uid> <backup file> tout en étant connecté au profil de cet uid, dans ce cas l'uid 11. Je ne vois pas d'invite de confirmation de restauration ou quoi que ce soit qui se produise visuellement. Voici les lignes de logcat pertinentes :

    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.

Comme on peut le voir, le BackupManagerService sait que je demande une restauration de l'uid 11. Il indique également qu'il lance l'interface utilisateur de confirmation, même si je ne vois rien s'afficher. Finalement, la demande s'arrête.

  1. Exécuter bu -user <uid> <backup file> en étant connecté au profil du propriétaire. Voici les lignes de logcat pertinentes :

    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.

Comme lors de la première tentative, nous voyons que le BackupManagerService essaie de faire une restauration pour l'uid 11. Il lance l'interface de confirmation, qui s'affiche. Je confirme alors la restauration. Mais nous voyons ensuite que c'est l'uid 0 qui confirme la restauration et je pense que c'est la raison pour laquelle le jeton résultant est invalide. C'est logique, pourquoi un profil devrait-il être capable de confirmer la sauvegarde/restauration d'un autre profil ? (il serait un peu plus logique que le profil du propriétaire puisse le faire).

Donc je pense que je suis dans une impasse ici. Je ne sais pas comment faire pour que l'interface de confirmation s'exécute avec le bon utilisateur. Je soupçonne que cela n'a pas (encore !) été testé par la communauté Android, bien que pourquoi avoir une -user du tout ?


Voici d'autres messages de journal qui peuvent être des indices pour aller de l'avant :

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

0voto

Stephen Points 101

Je pense qu'il n'y a pas d'autre solution que de trouver une racine permettant l'exploitation. adb backup -apk -shared -all Sauvegarde uniquement pour l'utilisateur 0 pour les deux /data/user/ et /storage/emulated/ (pour les appareils sans stockage extensible). Pas de chance avec la version 4.4 non plus.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X