I am running Android emulator (emulator version 30.5.5.0) and the avd: Pixel_3a_API_30_x86 from AndroidStudio.
Using adb.exe (Android Debug Bridge) I try to copy a file from the Windows host to the emulated Android /system/... folder, but I haven't been able to after trying different things like this tutorial:
I run the android emulator from the command line to specify the parameter -writable-system:
cd C:\Users\%username%\AppData\Local\Android\Sdk\emulator
emulator -avd Pixel_3a_API_30_x86 -writable-system
Then from another command-line window while the emulator is running:
cd C:\Users\%username%\AppData\Local\Android\Sdk\platform-tools
adb root
adb shell "mount -o rw,remount /"
'/dev/block/dm-0' is read-only
adb push MyFile.txt /system/etc/security/cacerts
Then I get the error:
ERROR:
MyFile.txt: 1 file pushed, 0 skipped. 0.1 MB/s (950 bytes in 0.011s)
adb: error: failed to copy 'MyFile.txt' to '/system/etc/security/cacerts/MyFile.txt': remote couldn't create file: Read-only file system
How can I copy the file from Windows to Android /system ?
The tutorial in the link was missing some commands and the web page was not updated with the latest version from GitHub.
Here is the final sequence (for API LEVEL > 28):
adb root
adb shell avbctl disable-verification
adb reboot
adb root
adb remount
adb push MyFile.txt /system/etc/security/cacerts
Run adb root && adb remount first.
Related
I want to be able to write to /system in my Android Studio Emulator. I've made sure to use a rootable, non-Google Play Services AVD. I'm currently using the Pixel 2 - API 28 AVD (targets Android 9.0).
I've made sure to run adb root and that works, though adb remount gives remount of the / superblock failed: Permission denied as an error. (I also tried running adb disable-verity and rebooting before remounting, but I still get the same remount error.)
I've tried adb shell mount -o rw,remount /system, but I get mount: '/system' not in /proc/mounts.
I've also tried
adb shell
su
mount -o rw,remount /system
but get the same mount: '/system' not in /proc/mounts error
(I've tried it without /system too. It appears to work, but if I then try to write to /system, I get mv: /system: Read-only file system)
I've tried emulator -avd -writeable-system but I get 'emulator' is not recognized as an internal or external command, operable program or batch file.
Can someone please help me figure out how to run the emulator in such a way that I can write to /system?
On Windows open a command prompt/power shell in C:\Users\YourUser\AppData\Local\Android\Sdk\tools and execute
.\emulator.exe -writable-system -avd Pixel_2_API_28
In another command prompt/power shell in C:\Users\YourUser\AppData\Local\Android\Sdk\platform-tools execute
.\adb.exe remount
On Linux you can use the the following commands:
$ANDROID_HOME/tools/emulator -writable-system -avd Pixel_2_API_28
adb remount
I try to connect the device from USB to Wifi but the command prompt tells me all the time that adb is not found.
But it is definitly inside my folder: "~/Android/Sdk/platform-tools"
it contain:
adb e2fsdroid hprof-conv mke2fs package.xml sqlite3
api etc1tool lib64 mke2fs.conf sload_f2fs systrace
dmtracedump fastboot make_f2fs NOTICE.txt source.properties
I start with
adb tcpip 5555
Here I get the error message. What I do wrong here?
Your shell doesn't know where to look when you call adb that's why you need to specify it.
First check which shell you're using by calling echo $SHELL - the usual ones on Linux are bash and zsh. For Bash the config file is in ~/.bash_profile, for zsh it's in ~/.zshrc.
Depending on what shell you're using open that file and add this line into it:
export PATH=${PATH}:$HOME/Android/Sdk/platform-tools/
And restart the shell.
Then you can check that you the adb location is recognized with:
adb --version
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
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
Step by Step
Don’t Create the AVD with a Google Play image.
Use for example Google APIs Intel x86 Atom System Image.
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 #
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
Start your emulator.
In your terminal find the folder "platform-tools" for your devices
Prepare the hosts file you want to copy to your device (in my case i put it on desktop)
String together a bunch of commands to copy the file quickly. This is what worked for me ./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.
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 upto 1 minute.
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:
adb shell
cd system
cd etc
cat hosts
You will see the contents of hosts file in the Terminal:
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.
Another approach to this matter would be to use the adb command line tool.
Make sure you have in path emulator and tools
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
Check device name (ideally it would be to have a short name without spaces, eg. API30X86)
emulator -list-avds
Then launch the emulator with the following arguments:
emulator -avd YOUR_AVD_NAME -writable-system -no-snapshot-load -no-cache
Run the following commands to run as root and remount the partition system as root
adb devices #you should see your devices
adb root
adb shell avbctl disable-verification
adb reboot
adb root
adb remount
After remount, you should be able to push the edited host file from your machine to the emulator.
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.
When you are going to run again and push new changes with a new session, you’ll only have to do:
adb root
adb remount
adb push ~/Documents/hostsandroid /etc/hosts
Follow the below 3 steps :
Start emulator in writable mode : ./emulator -avd <emulator_name> -writable-system
remount : adb remount
push the hosts file attached : adb push hosts /system/etc/
Note :
Run one and only one emulator_name with above steps
executable emulator is located within android-sdk. For me it was under sdk/emulator.
Attached hosts file will resolve www.facebook.com to 127.0.0.1, hence blocks www.facebook.com on emulator.
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 =>
./emulator -writable-system -netdelay none -netspeed full -avd Nexus_S_API_25
After that Open a new terminal and goto this location
/Android/sdk/platform-tools
then run
./adb root
./adb remount
./adb push ~/Desktop/hosts /system/etc/hosts - (It will copy your Desktop/hosts file and paste it into your emulator hosts file which is /system/etc/hosts)
That's it your emulator hosts file is updated Now if you want to re-check then run the below code
./adb shell
cat /system/etc/hosts (it will show you the emulator hosts file)
Restart the emulator to see the changes
./adb reboot
Tedious, but effective, you can build a new hosts file, line by line within your emulator shell.
Remount Emulator
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.
You can use the ADB Shell to edit the file by changing the access (Read Only to RW)
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
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
I'm trying to edit the hosts file on the Marshmallow emulator, but I can't do it. I use ADB tool:
I start emulator using emulator.exe
adb mount
adb pull /system/etc/hosts c:\temp
Then I edit hosts file
ADB push c:\temp\hosts /system/etc (this step doesn't work, because I get error - "read-only file system").
Also, I tried to do adb shell and then SU commands and then mount -o rw,remount /system. But every time when I try to edit hosts file, I get the error that file system is read only.
Any ideas?
Try this for the remount:
adb shell
setenforce 0
mount -o rw,remount /system
setenforce 1
These steps work for me (Windows 8.1 and Android Studio emulator (qemu))
Open a Command Prompt
cd %localappdata%\Android\sdk\tools
Run the emulator from the command line with -writable-system flag, e.g.
emulator -avd (your AVD name) -writable-system
While the emulator is booting (wait until the Android splash appears):
cd %localappdata%\Android\sdk\platform-tools
adb root (do not proceed until this command has been successful)
adb remount
adb push c:\temp\hosts /system/etc/hosts
so, i'm trying to push some files to /system on android device (zte)
I've rooted, connected with ADB,
adb remount -> I get permission denied
adb shell su -> I'm able to access shell and create folders etc and edit filesystem
(but in shell I can't copy a file from my computer to device)
Any help please
In case anyone has the same problem in the future:
$ adb shell
$ su
# mount -o rw,remount /system
Both adb remount and adb root don't work on a production build without altering ro.secure, but you can still remount /system by opening a shell, asking for root permissions and typing the mount command.
emulator -writable-system
For people using an Emulator: Another possibility is that you need to start the emulator with -writable-system. That was the only thing that worked for me when using the standard emulator packaged with android studio with a 4.1 image. Check here: https://stackoverflow.com/a/41332316/4962858
Try
adb root
adb remount
to start the adb demon as root and ensure partitions are mounted in read-write mode (the essential part is adb root). After pushing, revoke root permissions again using:
adb unroot
Some newer builds require the following additional adb commands to be run first
adb root
adb disable-verity
adb reboot
Then
adb root
adb remount
you can use:
adb shell su -c "your command here"
only rooted devices with su works.
Start /w Writable System
Using Emulator Images without Google Play
This does not work with production Android images, i.e. ones with Google Play
Use non-Google Play images for root access & writeable system
Start your emulator from a command prompt as a writable system, using its AVD Name (Pixel3a in this example, see AVD Name below to find or change yours. Make sure another emulator instance is not running when using this command):
emulator #Pixel3a -writable-system
(Keep this command handy. You will need to use it any time you want to access your emulator as 'writable'. I use an alias in gitbash to start my emulator from a gitbash terminal, everytime.)
This launches the emulator.
When startup is complete, open another command prompt/terminal (this one is stuck running the emulator) and:
adb root
Result should be:
$ adb root
restarting adbd as root
Then:
adb remount
Result:
$ adb remount
remount succeeded
When you:
adb shell
and:
su
You should now have full root/writable access:
$ adb shell
generic_x86_arm:/ # su
generic_x86_arm:/ #
To add a domain to hosts file
$ cd /etc
$ cp hosts hosts.bak1
$ cat hosts
127.0.0.1 localhost
::1 ip6-localhost
$ echo '10.0.2.2 my.newdomain.com' >> hosts
$ cat hosts
127.0.0.1 localhost
::1 ip6-localhost
10.0.2.2 my.newdomain.com
10.0.2.2 is "localhost" for an Android emulator. It will delegate to your Windows/Mac hosts file & DNS services. Any domain you add to your development machine's hosts file, will work as 10.0.2.2 on your Android Emulator hosts file.
AVD Name
In Android Studio AVD Manager can be launched from menu:
Tools > AVD Manager
If your emulator name has spaces, you can change that by clicking the pencil icon on right hand side.
I named my emulator 'Pixel3a' without spaces for ease of typing.
I rebooted to recovery
then
adb root; adb adb remount system;
worked for me
my recovery is twrp v3.5
Try with an API lvl 28 emulator (Android 9).
I was trying with api lvl 29 and kept getting errors.
#echo off
color 0B
echo =============================================================================
echo.
echo ClockworkMod Recovery for SAMSUNG GALAXY SIII E210L
echo.
echo ClockworkMod Recovery (v6.0.1.2 Touch)
echo.
echo ¡ô¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¡ô
echo ¨U ¨U
echo ¨U SAMSUNG GALAXY SIII E210L ¨U
echo ¡ô¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¡ô
echo.
echo 1) (Settings\Developer options©¥ USB debugging)
echo.
echo 2) CWM SAMSUNG GALAXY SIII E210L
echo.
echo 3) THANK!!!!!!
echo.
echo =============================================================================
echo ARE YOU READY? GO! ¡·¡·¡·
#pause
echo.
echo adb...
adb.exe kill-server
adb.exe wait-for-device
echo wiat¸!
echo.
echo conect...
adb.exe push IMG /data/local/tmp/
adb.exe shell su -c "dd if=/data/local/tmp/GANGSTAR-VEGAS-1.3.0-APK-Andropalace.net.apk of=/mnt/sdcard/Android/GANGSTAR-VEGAS-1.3.0-APK-Andropalace.net.apk
adb.exe shell su -c "rm /data/local/tmp/bootloader.img"
adb.exe shell su -c "rm /data/local/tmp/recovery.img"
echo ===============================================================
echo ClockworkMod Recovery!
echo.
#pause