English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Spiegazione dettagliata dei passaggi per modificare il file hosts in Android

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:

  • remount ricarica il dispositivo. Di solito viene utilizzato per modificare lo stato delle impostazioni del dispositivo.
  • ro caricato con modalità di sola lettura.
  • rw caricato con modalità di lettura e scrittura.

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.

Ti potrebbe interessare