English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introduzione
Durante lo sviluppo, potremmo dover modificare il file hosts di Android. Il percorso del file hosts di Android è /system/etc/hosts, prima di modificare questo file, è necessario che il telefono Android abbia i permessi di root. Riguardo a come rootare il tuo telefono, non entreremo nei dettagli, puoi cercare su internet, molte sono anche semplici.
Questo articolo spiega come accedere al telefono rootato tramite il programma adb nella riga di comando, trascinare il file hosts sul computer per modificarlo e poi copiarlo di nuovo sul telefono per modificare il file hosts.
Ecco i passaggi specifici che inizieremo a fare:
C:\tools>adb pull /system/etc/hosts hosts.mod [100%] /system/etc/hosts
Il comando sopra trascina il file hosts del telefono sul computer, [100%] indica che il trasferimento è completato e puoi modificare il file hosts. Dopo aver modificato, usa i seguenti comandi per caricarlo sul telefono:
C:\tools>adb push hosts.mod /system/etc/hosts adb: errore: impossibile copiare 'hosts.mod' in '/system/etc/hosts': sistema di file di sola lettura
Dai messaggi di eco, il file system è in sola lettura, quindi non può essere caricato direttamente.
Prova i seguenti comandi per vedere se riesci a farlo!
C:\tools>adb root # La documentazione dice che questo comando permette al demone adbd di ottenere i permessi di root C:\tools>adb push hosts.mod /system/etc/hosts adb: errore: impossibile copiare 'hosts.mod' in '/system/etc/hosts': sistema di file di sola lettura
Non funziona ancora, sembra che dobbiamo rimontare di nuovo il directory /system.
C:\tools>adb remount riavvio non riuscito: Operazione non permessa
Non hai i permessi? È il momento di usare la magia di shell!
C:\tools>adb shell * daemon non in esecuzione. Stiamo avviandolo ora sulla porta 5037 * * daemon avviato con successo * shell@maguro:/ $ ls -al /system/etc/hosts -rw-r--r-- root root 25 2013-08-14 07:00 hosts
Dal righo ultimo riga si può vedere che il file hosts può essere scritto solo dal proprietario, per altri è solo in lettura. Per permettere agli altri di fare modifiche, è necessario utilizzare il seguente comando per elevare i privilegi e poi modificare le proprietà del file hosts.
shell@maguro:/ $ su
Se eseguiamo questo comando per la prima volta, il telefono si accenderà e l'app SuperSU ti chiederà se accetti la distribuzione dei permessi. Certo, dobbiamo accettare! Poi vedrai che il cursore del terminale cambia da $ a # e il carattere prima di @ cambia da shell a root. Poi possiamo modificare le proprietà dei permessi del file hosts.
root@maguro:/ # chmod +666 /system/etc/hosts Modalità errata root@maguro:/ # chmod 666 /system/etc/hosts Impossibile modificare chmod /system/etc/hosts: sistema di file di sola lettura
Di nuovo Read-only file system! Inserisci i seguenti comandi per vedere i dettagli del file system della directory /system.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
Vedi ro dopo ext4? È l'abbreviazione di read only, che significa solo lettura. Questo significa che la directory /system è in sola lettura. Ora dobbiamo modificarla per renderla leggibile e scrivibile.
root@maguro:/ # mount -o rw,remount /system
L'-o qui è utilizzato per specificare le opzioni durante il caricamento del file system. Queste opzioni includono:
Controlliamo di nuovo, possiamo vedere che la posizione originale di ro è diventata rw.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...
Ma fino a questo punto non possiamo copiare il file hosts sul telefono, perché le proprietà dei permessi del file hosts non sono state modificate. Se caricassimo forzatamente, riceveremmo un messaggio di errore come questo:
C:\tools>adb push hosts.mod /system/etc/hosts adb: errore: impossibile copiare 'hosts.mod' in '/system/etc/hosts': permesso negato
Esegui i seguenti comandi:
root@maguro:/ # chmod 666 /system/etc/hosts
Poi controlla le proprietà del file hosts.
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 25 2013-08-14 07:00 hosts
Si può vedere che tutti possono leggere e scrivere il file hosts.
Poiché tutto è pronto, proviamo a caricare il file hosts modificato.
C:\tools>adb push hosts.mod /system/etc/hosts adb: errore: impossibile copiare 'hosts.mod' in '/system/etc/hosts': sistema di file di sola lettura
Cos'è successo, perché il copia è ancora fallito? Non ho già cambiato il filesystem in lettura/scrittura?
Inoltre, durante la ricerca della causa del problema, ho scoperto una cosa strana. Il directory /system è accessibile in lettura/scrittura nel modo root, ma nel modo shell è ancora in sola lettura.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime... root@maguro:/ # exit shell@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
Inoltre, dopo aver montato il directory /system come lettura/scrittura nel Terminal Emulator del telefono, il sistema rimane ancora in sola lettura nel shell mode di adb shell.
Cercavo e cercavo e cercavo, stavo per perdere la speranza, ma alla fine ho trovato il possibile problema. Questo è il thread:mount in shell come utente o root con output diversoC'è una risposta che menziona questa cosa chiamata mount namespace. Solo allora ho capito:
Un mount namespace è l'insieme di mount del filesystem visibili a un processo.
Il punto di mount di ogni processo è invisibile agli altri processi. Il punto di mount dopo mount nel Terminal Emulator appartiene al processo corrente, mentre il punto di mount nel shell mode e nel root mode di adb shell appartengono ai rispettivi processi. Questo è il motivo per cui, dopo aver modificato il directory /system in lettura/scrittura nel modo root, il sistema rimane ancora in sola lettura nel shell mode.
Ora che sappiamo la causa del problema, come possiamo risolverlo?
Nella sezione impostazioni dell'applicazione SuperSu c'è un'opzione chiamata mount namespace separation, come mostrato nell'immagine seguente:
Deseleziona l'opzione di selezione, quindi il punto di mount di mount diventa globale, non più esclusivo del processo che mounta. Tuttavia, è importante ricordare che questa modifica avrà effetto solo dopo il riavvio del telefono.
Di seguito è riportato il risultato dell'upload dopo aver disattivato la separazione del namespace mount:
C:\tools>adb push hosts.mod /system/etc/hosts [100%] /system/etc/hosts
Si può vedere l'eco [100%], il che indica che il file è stato caricato correttamente.
Ecco come visualizzare le proprietà del file hosts:
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 137679 2017-02-16 00:20 hosts
La dimensione del file è passata da 25 a 137679, il che indica che il file è stato sostituito correttamente.
Di seguito è riportato il processo di ripristino dello stato originale del telefono:
root@maguro:/ # chmod 644 /system/etc/hosts root@maguro:/ # ls -al /system/etc/hosts -rw-r--r-- root root 137679 2017-02-16 00:20 hosts root@maguro:/ # mount -o ro,remount /system
Fino a questo punto, il lavoro di modifica del file hosts è stato completato con successo.
Sommario
Questo è tutto il contenuto dell'articolo, spero che il contenuto di questo articolo possa aiutarti a imparare o lavorare meglio. Se hai domande, puoi lasciare un messaggio per discuterne.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è di proprietà dei rispettivi autori, il contenuto è stato contribuito volontariamente dagli utenti di Internet e caricato autonomamente, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, sei invitato a inviare una e-mail a notice#oldtoolbag.com (sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata la veridicità, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.