Reputation: 926
Anyone know how to edit /etc/hosts file inside an android studio emulator running in nougat? I will be editing it so I can use my virtual host in my local web server. I tried editing it through terminal using adb however, it is returning Read-only file system. Tried also using chmod but still it fails.
Update: I also tried pulling and pushing files using adb $ ./adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts
adb: error: failed to copy '/Users/Christian/Desktop/hosts' to '/system/etc/hosts': couldn't create file: Read-only file system
Upvotes: 77
Views: 96018
Reputation: 9630
Below are the steps I followed on my Windows machine on Windows Terminal: Run the following command to know your AVDs:
emulator -list-avds
Run the following command to open the emulator for writable mode:
emulator -avd Pixel_XL_API_29 -writable-system -no-snapshot-load
Replace Pixel_XL_API_29 with your AVD name.
Ignore the warnings there.
In a new Terminal tab run the following commands:
adb root
adb shell avbctl disable-verification
adb reboot
Wait for your emulator to reboot. It can take up to 2 minutes.
When the emulator is rebooted, run the following commands:
adb root
adb remount
You will get a remount succeeded message after that:
Now is the time to push our host file from Windows machine to Android's emulator
adb push D:\hosts /system/etc/
D:\hosts is the location of the hosts file present at the D drive of my Windows machine. /system/etc/ is the location in Android's emulator where we want to copy that file.
After successfull operation you will see a message like this:
To verify that the hosts file has been pushed you can run the following commands:
You will see the contents of hosts file in the Terminal:
Upvotes: 25
Reputation: 123
I'm using macOs and finally I have created a script to make easy this task. I share it with the community in case it helps someone. Feel free to fork and customize for your needs.
https://github.com/goltra/android-hosts/
Any suggestions would be welcome
Upvotes: 0
Reputation: 355
Here's what worked for me on my Visual Studio for Mac setup. Make a hosts file, set your custom ip/domain record, and include blank line at the end which i can't get to show up here.
127.0.0.1 localhost
::1 ip6-localhost
<ipgoeshere> local.example.com
Create an android emulator with Google Api's (not Google Play) with API28 or lower. Otherwise when running ./adb you'll get "adbd cannot run as root in production builds"
Open a terminal and change directories
cd /Users/<usernamehere>/Library/Developer/Xamarin/android-sdk-macosx/tools
Launch emulator with below to allow writable system. You can find your avd name by VS4Mac - Tools - Device Manager - Cog Wheel - Reveal in Finder.
./emulator -avd <youravdnamegoeshere> -writable-system
Open another terminal and run the following commands
cd /Users/<usernamehere>/Library/Developer/Xamarin/android-sdk-macosx/platform-tools
./adb root
./adb remount
Check existing hosts file
./adb shell
cat /etc/hosts
exit
Move your custom hosts file
./adb push "/Users/<usernamehere>/Projects/hosts" /etc/hosts
Confirm ping now works
./adb shell
ping local.example.com
Will always need to start the emulator via command line to keep hosts working.
Upvotes: 1
Reputation: 1
To preserve the changes to the hosts file you need to always start the emulator with the "-writable-system -no-snapshot-load". Otherwise, the default system image will be used, which has the default hosts file.
Upvotes: 0
Reputation: 27980
Tedious, but effective, you can build a new hosts file, line by line within your emulator shell.
You can edit/remount your emulator (to get a writeable filesystem) in your PC/Mac/linux command line / powershell / terminal.
(Stop your emulator if it's already running, then...):
emulator -avd <avdname> -writable-system
(this starts up a new emulator with a writable file system)
Still within your PC/Mac/Linux terminal run these two commands:
adb root
adb remount
Then connect to your running emulator via a shell:
adb shell
This part below is run from inside your emulator, inside the shell connection you just made.
Give yourself root access:
su
Change directory to where the hosts
file is kept:
cd /etc
To make your emulator defer to your development machine's hosts file or DNS for a given domain, add a domain entry using ip of 10.0.2.2
.
Example of appending a new domain entry line to emulator hosts file:
echo '10.0.2.2 mydev.domain.com' >> hosts
This 10.0.2.2
is a special address for Android emulators. It will proxy DNS requests for that domain to your development machine. So whatever IP address your PC/Mac/Linux machine hosts file lists for mydev.domain.com, the Android emulator will use it.
You can now exit the root shell & your emulator shell:
exit
exit
(1st gets you out of su
. 2nd exits from the emulator shell, dropping you back into your development machine's terminal).
You're done. You can open up a web browser inside your emulator, type the domain you just added to hosts into the address bar and check the emulator is routing that domain properly.
Remount failed
If you're on Android emulator 29+ and getting
remount failed
when calling adb remount
, check out the workaround by Kidd Tang here.
Upvotes: 5
Reputation: 2310
Another approach to this matter would be to use the adb command line tool.
export ANDROID_HOME="/Users/YOUR_USERNAME/Library/Android/sdk"
export PATH=$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$PATH
EDIT: For Windows should something like this (instead of tools required platform-tools [or the path where adb resides])
C:\Users\YOUR_USERNAME\AppData\Local\Android\sdk\platform-tools
C:\Users\YOUR_USERNAME\AppData\Local\Android\sdk\emulator
emulator -list-avds
emulator -avd YOUR_AVD_NAME -writable-system -no-snapshot-load -no-cache
adb devices #you should see your devices
adb root
adb shell avbctl disable-verification
adb reboot
adb root
adb remount
adb push ~/Documents/hostsandroid /etc/hosts
Now you should be able to see your hosts file with Device File Explorer from Android Studio.
EDIT: In the case, you don’t see the Device File Explorer, you can check the Event Log if Android framework is detected. If so, click Configure and you're done.
adb root
adb remount
adb push ~/Documents/hostsandroid /etc/hosts
Upvotes: 14
Reputation: 720
First find your system hosts file and copy it to desktop
Then create a virtual device Nexus 5 with system image Nougat x86_64 Android 7.1.1 (non Google API version) once it is created
Then goto /Android/sdk/emulator in terminal then run the below code please add your own device name below as mine was Nexus_S_API_25 =>
Upvotes: 5
Reputation: 536
place all these export in z shell using terminal
vim ~/.zshrc press enter
then zshell will open
then press i
past all the export (verify the path i have used all default location for instalation)
then press esc
then press this :wq!
press enter
close terminal and open it again
export PATH="$PATH:$HOME/Dev/flutter/bin"
export GEM_HOME=$HOME/.gem
export PATH=$GEM_HOME/bin:$PATH
export ANDROID_HOME=$HOME/Library/Android/sdk
export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
only use google apis image do not usese play image
u will get list of avds
emulator -list-avds
emulator -avd Nexus_5_API_29 -writable-system (do not close terminal) (open a new terminal)
adb root
adb remount
copy mac host file to Downloads from /private/etc/hosts
adb push Downloads/hosts /system/etc/hosts
adb reboot
Upvotes: -3
Reputation: 1888
Step by Step
Start the emulator with the following command…
emulator.exe –avd <avd name> -writable-system
For example:
C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\emulator>emulator.exe -avd Pixel_API_25 -writable-system
emulator: WARNING: System image is writable
HAX is working and emulator runs in fast virt mode.
audio: Failed to create voice `goldfish_audio_in'
qemu-system-i386.exe: warning: opening audio input failed
audio: Failed to create voice `adc'
Root and Remount the AVD like the followings…
C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb root
C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb remount
remount succeeded
C:\Users\ilyas.mamun\AppData\Local\Android\Sdk\platform-tools>adb shell
eneric_x86:/ # cd system
generic_x86:/system # cd etc
generic_x86:/system/etc # cat hosts
127.0.0.1 localhost
::1 ip6-localhost
generic_x86:/system/etc # echo "192.168.1.120 ilyasmamun.blogspot.com" >> hosts
generic_x86:/system/etc # cat hosts
127.0.0.1 localhost
::1 ip6-localhost
192.168.1.120 ilyasmamun.blogspot.com
generic_x86:/system/etc #
Upvotes: 34
Reputation: 6395
Try @P.O.W answer,
Make sure you have a blank line after the last entry of the hosts file If you use tabs in the hosts file, replace them with spaces Restart Android and try again:
adb reboot
Upvotes: 1
Reputation: 2215
1) android-sdk-macosx/tools/emulator -avd <avdname> -writable-system
2) ./adb root
3) ./adb remount
4) ./adb push <local>/hosts /etc/hosts
Android file host can be
/etc/hosts <--- This worked for me
/etc/system/hosts
/system/etc/hosts
Check
1) ./adb shell
2) cat /etc/hosts
3) ping customsite.com
Upvotes: 116
Reputation: 309
Follow the below 3 steps :
./emulator -avd <emulator_name> -writable-system
adb remount
adb push hosts /system/etc/
Note :
emulator
is located within android-sdk. For me it was under sdk/emulator
.www.facebook.com
to 127.0.0.1, hence blocks www.facebook.com
on emulator.Upvotes: 5
Reputation: 625
Here is how i was able to do it working on OSX. After reading a bunch of different instruction nothing seemd to work for me untill someone mentioned that you have a very narrow window for copying the file from your disk to the emulated device or it becomes read-only again
./adb root && ./adb -s emulator-5554 remount && ./adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts
'emulator-5554' is the name of my device which you can find by typing ./adb devices
after that the terminal responded with
restarting adbd as root
remount succeeded
[100%] /system/etc/hosts
you can veryfy the copy was successfull by ./adb shell
and then cat /system/etc/hosts
I was then able to connect to my virtual hosts from the emulated device
Just to be complete here is how my hosts file looked like
10.0.2.2 my-virtual-host
I hope this helps someone as i spet quite some time trying to figure this out.
Upvotes: 22
Reputation: 926
I was able to edit the /etc/hosts file by launching the emulator with -writable-system and remounting the emulator using adb remount. After that the hosts file inside the emulator is editable. I tried pushing/replacing the file and succeeded.
Upvotes: 8
Reputation: 720
You can use the ADB Shell to edit the file by changing the access (Read Only to RW)
Upvotes: 1