0 votes

Utilisation de la ligne de commande pour démarrer dans la ROM primaire et secondaire de MultiROM

J'ai un OnePlus One avec bootloader déverrouillé, TWRP modifié v2.8.6, MultiROM non officiel v32k, Gestionnaire MultiROM v1.186, Cyanogen OS 12 comme primaire et plusieurs ROMs Android 5.1 secondaires. Je n'ai pas de ROM secondaire non-Android.

J'ai créé un script de sauvegarde Android dans mon PC qui nécessite que je démarre dans une ROM particulière de la mienne pour que la sauvegarde ait lieu. Ce n'est pas un problème XY et je n'ai donc pas besoin de discuter de la flexibilité de la sauvegarde. Je dois démarrer dans une ROM secondaire particulière (disons S1).

Actuellement, j'utilise automatisation qui, à l'aide d'un déclencheur temporel, lance le MultiROM et utilise la combinaison des éléments suivants input tap pour naviguer jusqu'à l'entrée de S1 et le toucher pour démarrer dans cette entrée. Comme vous l'avez peut-être deviné, cette approche est banale et est vouée à l'échec si l'utilisateur touche délibérément ou par inadvertance un bouton souple ou dur ou interagit avec l'interface utilisateur de l'application active pendant que la série de commandes d'entrée est utilisée.

Je suis absolument conscient de Entrée automatique , Xposed Additions Pro applications et épinglage d'une application à l'écran Les deux premières permettent de désactiver indépendamment les touches programmables et les touches dures d'une application active. AutoInput peut même simuler des touchers enregistrés. Cependant, aucun d'entre eux ne peut désactiver la saisie à partir de l'écran tactile, la saisie tactile étant la principale cause d'échec de la solution actuelle.

N'ayant pas trouvé de moyen de bloquer l'entrée tactile à la volée, j'ai décidé de comprendre comment l'application MultiROM Manager fait démarrer un appareil dans une ROM particulière. C'était un voyage sans espoir pour commencer, étant donné que les mots-clés à savoir. commande, multirom, adb, boot, secondary, primary ROM, se trouvent partout où MultiROM est mentionné. Puisque même une recherche avancée sur le web ne m'a pas été utile, j'ai décidé de jeter un coup d'oeil à la sortie de la commande logcat et voir si cela me donne quelque chose d'utile. Une fois de plus, rien d'utile.

Je me suis retrouvé devant le choix de contacter Vojtech Bocek ( Tassadar (le développeur original de MultiROM) pour trouver la solution ou consulter le code source de l'application. En décidant de faire ce dernier choix, je suis tombé sur ces lignes dans le code source de l'application. MultiROM.java

public void bootRom(Rom rom) {
    String name = (rom.type == Rom.ROM\_PRIMARY) ? INTERNAL\_ROM : rom.name;
    Shell.SU.run(**"%smultirom --boot-rom='%s'", m\_path, name**);
}

En avoir fini avec libsuperuser déjà, j'ai supposé que Shell.SU.run("%s/multirom --boot-rom='%s'", m_path, name) correspond très probablement à la commande exécutée dans un shell avec les privilèges de superutilisateur.

Et, c'est la fin de l'histoire puisque j'ai vérifié tous les emplacements sous $PATH et aucun d'entre eux ne contient le binaire nommé multirom .

Donc, comment puis-je démarrer dans une ROM particulière maintenant ?

0voto

Firelord Points 23064

J'ai cherché la chaîne multirom --boot-rom et je suis tombé sur un intéressant pâte ( copie ) posté par un invité sans titre, avec ces lignes pertinentes :

<alvinmobile> Comment faire un démarrage automatique d'une autre rom dans une rom secondaire ?

<alvinmobile> Je veux dire où stockez-vous l'info ?

<Tassadar> il exécute "multirom --boot-rom=nameoftherom" dans le shell su, et MultiROM s'en occupe - il charge la liste des ROM comme d'habitude et soit directement kexec le noyau requis, soit définit force-autoboot dans rom X (qui s'enregistre dans multirom.ini) et redémarre.

Il semble que j'étais sur la bonne voie. J'ai soudain réalisé que le zip d'installation de multirom pouvait être la pièce finale du puzzle. Et il l'était, puisqu'il contient le multirom binaire et utilise extract_multirom.sh pour placer le script binaire et al sur /data/media/0/multirom (accessible uniquement avec l'accès Root).

Pour ce qui est de trouver le nom d'une ROM, c'est ce que vous voyez dans la liste des ROM dans l'application ou le nom des répertoires de premier niveau sous /data/media/0/multirom/roms .

Démarrer dans la ROM

(Préfixe <em>shell adb </em>dans les commandes si vous voulez utiliser adb pour les tester).

La commande est très simple :

su -c /data/media/0/multirom/multirom --boot-rom=ROM_NAME

Remplacez ROM_NAME par le nom de la ROM sur laquelle vous voulez que le périphérique démarre. Il s'agit sensible à la casse donc Internal fonctionne mais internal ne démarre pas dans la ROM primaire.

Je n'ai pas testé le passage d'un nom de ROM composé de caractères spéciaux mais les espaces blancs peuvent être échappés en utilisant '' y \ . Par exemple, le nom Xenon HD peut être transmis sous la forme 'Xenon\ HD' et la commande complète serait la suivante

su -c /data/media/0/multirom/multirom --boot-rom='Xenon\ HD'

Vous pouvez créer un lien symbolique pour plus de commodité.

Essais et erreurs

Après quelques essais, j'en suis arrivé à la conclusion que la ROM peut être changée en modifiant le fichier multirom.ini seul, suivi d'une instruction de redémarrage ordinaire. Parmi les autres lignes de ce fichier, voici les plus utiles :

current\_rom=COS12
auto\_boot\_seconds=5
auto\_boot\_rom=Internal
auto\_boot\_type=0

Ici,

  • current_rom - contient le nom de la ROM actuellement active ou de la dernière ROM active si le dispositif s'éteint sans instruction de passage dans une autre ROM.
  • auto_boot_seconds - timeout pour démarrer dans la ROM par défaut
  • auto_boot_rom - la ROM qui doit être démarrée après le timeout
  • auto_boot_type - détermine s'il doit y avoir un changement direct entre les ROMs ou si l'interface utilisateur pour la sélection des ROMs doit être affichée pendant le démarrage.

(Aucune source ne vient étayer ces affirmations. Je suis arrivé à la conclusion en me basant uniquement sur mon expérience).

Supposons que votre ROM active s'appelle COS12, votre ROM interne s'appelle Internal et que vous voulez passer à Xenon HD. Changez-la de cette façon :

(Exigeant <a href="https://play.google.com/store/apps/details?id=stericson.busybox" rel="nofollow noreferrer">Busybox </a>)

su -c cp /data/media/0/multirom/multirom.ini /data/media/0/multirom/multirom.ini.orig       # one time command and optional, but it is safe to make backup always
su -c sed -i 's/current\_rom.\*/current\_rom\\=ROM\_NAME/g' /data/media/0/multirom/multirom.ini  # for Xenon HD, ROM\_NAME would be Xenon\\ HD
su -c sed -i 's/auto\_boot\_type.\*/auto\_boot\_type\\=2/g' /data/media/0/multirom/multirom.ini   # changing to \`2\` causes MultiROM to directly boot into the ROM mentioned in \`current\_rom\`. The setting would later be reverted to 0 after successful boot
su -c reboot

Les commandes sont facultatives ici. Vous pouvez utiliser une application d'édition de fichiers, telle que QuickEdit pour modifier le fichier.

Note : Pendant le redémarrage :

  • Si auto_boot_type est trouvé 1, l'interface utilisateur de sélection de ROM s'affiche après le logo de démarrage et remplace auto_boot_rom ce qui signifie qu'après le délai d'attente, l'appareil démarrera dans n'importe quelle current_rom a, automatiquement.

  • Si auto_boot_type est trouvé 3, l'appareil démarrera directement dans n'importe quelle version de la current_rom a, mais, auto_boot_rom se trouverait désormais identique à l current_rom . auto_boot_type revient ensuite à 1 après un démarrage réussi.

    Je ne peux pas dire s'il s'agit d'un bogue ou d'un comportement souhaité, mais c'est ainsi.

Note supplémentaire que je ne serais pas surpris si les méthodes mentionnées dans cette réponse échouent pour une ROM non-Android.

0voto

Firelord Points 23064

J'ai réalisé par la suite que l'inconvénient majeur de ma solution, l'entrée tactile, peut être stoppé si j'utilise la fonction de Tasker scènes en mode de blocage de la superposition.

(Cliquez sur l'image pour l'agrandir)

IMG: IMG: IMG:

J'ai créé plusieurs scènes vierges et configuré la tâche pour les afficher de manière à ce que seule une petite partie de l'écran puisse envoyer des données tactiles à l'application (cette partie est autorisée parce que j'ai besoin de faire input tap ). La fenêtre Gérer les ROMs fonctionne bien avec les événements des touches du Dpad, j'ai donc utilisé Tâche → Entrée → Dpad pour atteindre mon entrée de ROMs préférée et la toucher.

Pour désactiver l'entrée par les touches de navigation, j'ai utilisé Xposed Additions Pro . Ici sont les instructions pertinentes. (Suivez les instructions jusqu'à l'étape 10).

J'ai également testé avec succès Entrée automatique comme une alternative pour Xposed Additions. Dans une tâche, son utilisation pertinente est :

Plugin → AutoInput → Modes :

  1. Configuration :

    1. Suppression des touches : Activer
    2. Touches : votre touche de navigation
  2. Temps mort (secondes) : Aucun

Veillez à activer son service d'accessibilité dans Paramètres → Accessibilité.

Cette solution n'est pas aussi pratique que mon autre solution est, mais il fait le travail.

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