English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Введение
Во время разработки мы можем нуждаться в изменении файла hosts в Android. Путь к файлу hosts в Android: /system/etc/hosts, перед изменением этого файла сначала необходимо получить root-права на Android-телефон. Как получить root-права на ваш телефон, здесь не будет подробно описано, можно найти много информации в сети, и это не так сложно.
Эта статья объяснит, как через командную строку с помощью программы adb получить доступ к rooted телефону, перетащить hosts на компьютер для редактирования, а затем скопировать его обратно на телефон для изменения файла hosts.
Теперь начнем с конкретных шагов:
C:\tools>adb pull /system/etc/hosts hosts.mod [100%] /system/etc/hosts
Эти команды позволяют перетащить файл hosts с телефона на компьютер, [100%] означает, что передача файла завершена и можно изменить файл hosts. После завершения изменений используйте следующие команды для загрузки файла на телефон:
C:\tools>adb push hosts.mod /system/etc/hosts adb: ошибка: не удалось скопировать 'hosts.mod' в '/system/etc/hosts': Чтение только файла системы
Из сообщения от сервера можно увидеть, что файловая система только для чтения, поэтому файл нельзя напрямую загружать.
Попробуйте следующие команды, чтобы увидеть, удастся ли это?
C:\tools>adb root # как говорят в документации, эта команда позволяет adbd демону получить права root C:\tools>adb push hosts.mod /system/etc/hosts adb: ошибка: не удалось скопировать 'hosts.mod' в '/system/etc/hosts': Чтение только файла системы
Если это не помогло,看来需要重新.mount /system каталог.
C:\tools>adb remount ремонт не удался: Операция не разрешена
Нет доступа? Это сигнал к использованию великой силы shell!
C:\tools>adb shell * daemon not running. starting it now on port 5037 * * daemon started successfully * shell@maguro:/ $ ls -al /system/etc/hosts -rw-r--r-- root root 25 2013-08-14 07:00 hosts
Из последней строки можно看出, что файл hosts доступен только для записи его владельцу, а для других пользователей он только для чтения. Чтобы другие пользователи могли вносить изменения, необходимо использовать следующие команды для повышения привилегий и изменить атрибуты файла hosts.
shell@maguro:/ $ su
Если вы выполняете эту команду в первый раз, телефон загорится, SuperSU приложение запросит, согласны ли вы с分配ом прав. Естественно, вы должны согласиться! Затем вы увидите, что курсор в терминале изменится с $ на #, и символ перед @ изменится с shell на root. Затем мы можем изменить атрибуты прав доступа файла hosts.
root@maguro:/ # chmod +666 /system/etc/hosts Неправильный режим root@maguro:/ # chmod 666 /system/etc/hosts Невозможно изменить chmod /system/etc/hosts: Чтение только файла системы
Ещё раз только чтение файла системы! Введите следующие команды, чтобы увидеть детали файловой системы каталога /system.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 ro,seclabel,relatime...
Увидели ro после ext4? Это аббревиатура от 'read only', что означает 'только чтение'. Это означает, что каталог /system является только чтением. Далее мы должны изменить его на режим чтения и записи.
root@maguro:/ # mount -o rw,remount /system
Верхний -o используется для указания опций при загрузке файловой системы. Эти опции включают:
Проверьте еще раз, и вы увидите, что原来的 ro уже стал rw.
root@maguro:/ # mount | grep system /dev/block/platform/omap/omap_hsmmc.0/by-name/system /system ext4 rw,seclabel,relatime...
Однако до этого момента мы не можем скопировать файл hosts на телефон, так как атрибуты прав доступа файла hosts еще не изменены. Если пытаться это сделать насильно, вы получите следующую ошибку сообщения:
C:\tools>adb push hosts.mod /system/etc/hosts adb: ошибка: не удалось скопировать 'hosts.mod' в '/system/etc/hosts': Запрещен доступ
Запустите следующие команды:
root@maguro:/ # chmod 666 /system/etc/hosts
Затем проверьте атрибуты файла hosts.
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 25 2013-08-14 07:00 hosts
可以看出所有人都可以读写hosts файл.
Поскольку все готово, давайте еще раз попробуем загрузить отредактированный файл hosts.
C:\tools>adb push hosts.mod /system/etc/hosts adb: ошибка: не удалось скопировать 'hosts.mod' в '/system/etc/hosts': Чтение только файла системы
Что случилось, почему всё ещё не удалось скопировать? Не было ли файла системы изменённым на чтение-запись?
Кроме того, в процессе поиска причин я обнаружил странное явление. В режиме root каталог /system является читаемым и записываемым, но в режиме shell /system является только для чтения.
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...
Кроме того, после монтирования каталога /system в режиме чтения-записи в Terminal Emulator на телефоне, при проверке состояния /system в режиме root в adb shell он всё ещё отображается как только для чтения.
Искал и искал, было уже на грани отчаяния, наконец нашёл возможную причину проблемы. Это тема:Монтируйте в shell как пользователь или root с различным выводомОдна из ответов упомянула这个东西 mount namespace. И только после этого я понял:
Mount namespace - это набор монтированных файловых систем, видимых для процесса.
Точка монтирования каждого процесса не видна другим процессам. Точка монтирования, созданная mount в Terminal Emulator, принадлежит данному процессу, а точки монтирования в режимах shell и root в adb shell принадлежат своим процессам. Это и есть причина, почему после изменения каталога /system на чтение-запись в режиме root, в режиме shell он всё ещё отображается как только для чтения.
Знаете причину проблемы, так как же её решить?
В настройках приложения SuperSu есть опция mount namespace separation, как показано на следующем рисунке:
Удалите галочку, затем точка монтирования mount станет глобальной и больше не будет принадлежать только процессам, которые монтируют её. Однако помните, что это изменение вступит в силу только после перезагрузки телефона.
Вот результат загрузки после отмены разделения mount namespace:
C:\tools>adb push hosts.mod /system/etc/hosts [100%] /system/etc/hosts
Видно, что есть эхо [100%], что означает, что файл успешно загружен.
Проверьте атрибуты файла hosts:
root@maguro:/ # ls -al /system/etc/hosts -rw-rw-rw- root root 137679 2017-02-16 00:20 hosts
Размер файла увеличился с 25 до 137679, что означает, что файл успешно заменен.
Теперь мы восстановим телефон до его прежнего состояния:
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
Таким образом, работа по редактированию файла hosts завершена.
Обобщение
Вот и все, что есть в этой статье, надеюсь, что содержимое статьи поможет вам в изучении или работе. Если у вас есть вопросы, вы можете оставить комментарий для обсуждения.
Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, самостоятельно загружен, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите подозрительное нарушение авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. При подтверждении факта нарушения сайт незамедлительно удаляет涉嫌侵权的内容。