Skip to content

Instantly share code, notes, and snippets.

@mrk-han
Last active March 22, 2024 15:11
Show Gist options
  • Save mrk-han/66ac1a724456cadf1c93f4218c6060ae to your computer and use it in GitHub Desktop.
Save mrk-han/66ac1a724456cadf1c93f4218c6060ae to your computer and use it in GitHub Desktop.
Installing and creating Emulators with AVDMANAGER (For Continuous Integration Server or Local Use)

Install and Create Emulators using AVDMANAGER and SDKMANAGER

TL;DR

For an emulator that mimics a Pixel 5 Device with Google APIs and ARM architecture (for an M1/M2 Macbook):

  1. List All System Images Available for Download: sdkmanager --list | grep system-images

  2. Download Image: sdkmanager --install "system-images;android-30;google_atd;arm64-v8a"

  3. Create Emulator: echo "no" | avdmanager --verbose create avd --force --name "pixel_5_api30_google_atd_emulator" --package "system-images;android-30;google_atd;arm64-v8a" --tag "google_atd" --abi "arm64-v8a" --device "pixel_5"

For M1/M2 Macbooks, use arm64-v8a as your "tag" or "target".

For Intel Macbooks use x86.

I recommend always using the new google_atd or aosp_atd images when possible. In my benchmarks, they are about 40% more efficient than the google_apis image.

Note: To check which devices you can create from the command line, run avdmanager list deviceand pass in the device name as the value of --device, e.g. --device "pixel_5" at the end of the command on step 3. (This includes tablets, etc)

Passing in a device will make the Emulator settings (usually found in the ~/.android/avd/emulator.avd/config.ini file) try to mimic that device. It is not actually the device. But, certain settings like pixel density, resolution, memory, partition size, etc will be changed. Generally the lower resolution devices will be less taxing on your CPU resources on CI, and are preferred especially without GPU/Hardware acceleration.

Continued...

For generic skin emulator with default apis (without google apis) for use with Intel Macbook on CI (Can use google_atd too):

  1. List All System Images Available for Download: sdkmanager --list | grep system-images

  2. Download Image: sdkmanager --install "system-images;android-30;aosp_atd;x86"

  3. Create Emulator: echo "no" | avdmanager --verbose create avd --force --name "generic_api30_aosp_atd_emulator" --package "system-images;android-30;aosp_atd;x86" --tag "aosp_atd" --abi "x86"

    If you do not use the --device flag, I recommend adding these lines to: ~/.android/avd/generic_10.avd/config.ini or else your emulator will have a very low resolution. 
    Note: Increasing resolution will decrease performance on CI.
    
    skin.name=1080x1920        # proper screen size for emulator
    hw.lcd.density=480
    hw.keyboard=yes            # enables keys from your laptop to be sent to the emulator
    
    If you cannot do this, you can still pass -skin 1080x1920 as an argument when starting the emulator. 
    
    Keep in mind, you can also pass the --device flag and use a device name from the avdmanager list device command which          should also set a default resolution because it will inherit the set of properties of that "device" in the config.ini.
    
  4. Run Emulator: emulator @generic_api30_aosp_atd_emulator & or emulator @pixel_5_google_atd_emulator &

Docs

See: Google's Emulator CLI Documentation for more info.

See: Google's AVDManager Documentation for more info.

See: Google's SDKManager Documentation for more info.

Aliases

Add aliases to your ~/.zshrc or ~/.bashrc to run the emulators with parameters more easily.

alias generic_api31_emulator='emulator @generic_api31_emulator -no-boot-anim -netdelay none -no-snapshot -wipe-data -skin 768x1280 &'

alias pixel_5 ='emulator @pixel_5 -no-boot-anim -netdelay none -no-snapshot -wipe-data &'

Starting multiple emulators

You can pass the -read-only parameter when starting up an emulator emulator @pixel_5 -read-only to run multiple devices at the same time.

Other

  1. aosp_atd and google_atd system images are only available on x86 and ARM architecture at API level 30.

See also: https://android-developers.googleblog.com/2021/10/whats-new-in-scalable-automated-testing.html

Output of sdkmanager --list | grep atd:

  system-images;android-30;aosp_atd;arm64-v8a                                              | 1            | AOSP ATD ARM 64 v8a System Image
  system-images;android-30;aosp_atd;x86                                                    | 1            | AOSP ATD Intel x86 Atom System Image
  system-images;android-30;google_atd;arm64-v8a                                            | 1            | Google APIs ATD ARM 64 v8a System Image
  system-images;android-30;google_atd;x86                                                  | 1            | Google APIs ATD Intel x86 Atom System Image
  1. avdmanager list device is great to figure out which emulators you can create
  2. The newest cmdline-tools located at $HOME/Library/Android/sdk/cmdline-tools/latest/bin were created for Java 9/10/11. If you are running into issues running sdkmanager, make sure to update your path in your ~/.zshrc to the tools to the new tools if you are on Java 11, e.g. export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin. If you are still on Java 8, you can use the old tools.
@pen-pal
Copy link

pen-pal commented Mar 1, 2021

is there a way you map your currently running emulator with avd ??

@staff0rd
Copy link

After running this i see the following, what causes it to be offline?

λ adb devices
List of devices attached
emulator-5554   offline

@sGuid
Copy link

sGuid commented Apr 9, 2021

For @JoseVelasquez above - looks like latest android platform tools (like android 26+ when they started only allowing x86/x86_64 and not arm/arm64 emulators) automatically require hardware acceleration (which does not always work with docker and other vms). Use the emulator option "-no-accel" to start emulator without hardware acceleration.
ie. emulator @android-29-x86_64-test -no-audio -no-window -no-accel

@mahdizolqadr - you want to avdmanager create avd - and look for the abi option "x86_64" option for x86_v8a - and you'll need to download the right system image for that
ie. sdkmanager --install "system-images;android-29;google_apis;x86_64"
ie. avdmanager create avd --name android29-x86_64-test --abi "x86_64" --package "system-images;android-29;google_apis;x86_64"
Basically use sdkmanager --list. to see all the available options. and can also use avdmanager --list will also show you all the available emulator options (that you've custom made or that are default profiles and can be made).

offline in a real device usually means not hitting the security popup approval when you plug in the device. In emulator, it might be that you are running newer emulator with old tools, so it's not properly able to talk to the device (which is done via the android debugger bridge aka adb). try adb --version to see what tool version is using to talk to device, and then restart adb connection with adb kill-server and then adb start-server. (ie. if your adb version is 1.0.36, which is like andorid 5, then you can't talk to an android 29 device that's has adb 1.0.41 or something like that). adb is located in platform-tools (to update check options in sdkmanager --list, but will probably want sdmanager "platform-tools")

I currently have the problem with the emulator is up and running, but my unit tests run via gradlew won't run on the device, "Found 1 connected device(s), 0 of which were compatible. ... Skipping device 'android-29-x86_64-test(AVD)' for 'test:': Unknown API Level". I am using --abi "x86_64" when i create the emulator so the API level should be known. I'm sure I'm using an older version tool on newer device issue, but I can't tell what's not updated as I thought I updated everything, if anyone has ideas I would love to hear them. (I always wish android would give less vague error logs).

@mrk-han - your gist was really good and clear - thanks!

@yozachar
Copy link

yozachar commented Apr 12, 2021

@mrk-han thank you for this gist.

This is what I have:

~ via 🐍 v3.6.9 
➜ sdkmanager --list | sed -e '/Available Packages/q'
Installed packages:=====================] 100% Computing updates...             
  Path                 | Version | Description                    | Location             
  -------              | ------- | -------                        | -------              
  build-tools;28.0.3   | 28.0.3  | Android SDK Build-Tools 28.0.3 | build-tools/28.0.3/  
  build-tools;29.0.2   | 29.0.2  | Android SDK Build-Tools 29.0.2 | build-tools/29.0.2/  
  build-tools;29.0.3   | 29.0.3  | Android SDK Build-Tools 29.0.3 | build-tools/29.0.3/  
  emulator             | 30.4.5  | Android Emulator               | emulator/            
  patcher;v4           | 1       | SDK Patch Applier v4           | patcher/v4/          
  platform-tools       | 31.0.0  | Android SDK Platform-Tools     | platform-tools/      
  platforms;android-28 | 6       | Android SDK Platform 28        | platforms/android-28/
  platforms;android-29 | 5       | Android SDK Platform 29        | platforms/android-29/
  platforms;android-30 | 3       | Android SDK Platform 30        | platforms/android-30/


Available Updates:
  ID             | Installed | Available
  -------        | -------   | -------  
  emulator       | 30.4.5    | 30.5.4   
  platform-tools | 31.0.0    | 31.0.1 

But when I run either of these:

~ via 🐍 v3.6.9 
➜ avdmanager create avd --name android29 --package "system-images;android-29;google_apis_playstore;x86_64"
Error: Package path is not valid. Valid system image paths are:ository...       
null

~ via 🐍 v3.6.9 
➜ avdmanager create avd --name android29 --package "system-images;android-29;google_apis;x86_64"
Error: Package path is not valid. Valid system image paths are:ository...       
null

It could be an architecture error, or something else but how do I figure that out, please?

@badsyntax
Copy link

Thanks for the gist. I've created another gist showing how i do this in CI: https://gist.github.com/badsyntax/4029600db276b0b51342626aebf9400a

@SameerYoussef
Copy link

hw.keyboard=true

=yes didn't work for me with API S

@sostenesapollo
Copy link

sostenesapollo commented Jun 8, 2021

Mine Stays in this part : *Loading local repository... * when I try to create an avd

@huseyinbarin
Copy link

Is there any possibility to create emulator with a default language other than English by using avdmanager?
I searched a bit about this but no luck.

@Layer-wang
Copy link

sdkmanager --list | grep system-images 'grep' 不是内部或外部命令,也不是可运行的程序
how to solve

@Sandy-Garrido
Copy link

how install "arm64-v8a" ? :((

system-images;android-29;google_apis;arm64-v8a

@SohanTirpude
Copy link

SohanTirpude commented Dec 18, 2021

Well everything worked but when I launched the emulator this is the error I got

C:\Android\emulator>emulator.exe @generic_10 & INFO | Android emulator version 31.1.4.0 (build_id 7920983) (CL:N/A) WARNING | unexpected system image feature string, emulator might not function correctly, please try updating the emulator. ERROR | Not enough space to create userdata partition. Available: 6726.316406 MB at C:\Users\CK\.android\avd\generic_10.avd, need 7372.800000 MB.

@hini-manan
Copy link

Screenshot 2022-01-24 at 3 14 38 PM

I'm getting 'unknown skin name' error. How to solve this issue?

@ArjunTejaswi
Copy link

@josevelasdev I too am stuck in the same error, got any solution?

@neilnicoli-mosca
Copy link

neilnicoli-mosca commented Jun 13, 2022

I am having an error with sdkmanager --install, with error

Capture571

@mrk-han
Copy link
Author

mrk-han commented Jun 13, 2022

@neilnicoli-mosca Make sure you're passing in an argument after --install. e.g. sdkmanager --install "system-images;android-29;default;x86"

@neilnicoli-mosca
Copy link

@neilnicoli-mosca Make sure you're passing in an argument after --install. e.g. sdkmanager --install "system-images;android-29;default;x86"

Yup, does this had something to do with the version of sdkmanager? I found another tutorial that doesn't use --install for installing system-images and just sdkmanager "system-images;android-29;default;x86" and when I followed it and remove --install, it is was successful.

@BenceBakos
Copy link

How to create tablet emulator?

@cmoulliard
Copy link

Is it possible to increase the disk size using avdmanager command (or something else) as we can do using the Studio ?

@mrk-han
Copy link
Author

mrk-han commented Oct 4, 2022

@cmoulliard Yes! You can use a custom profile with --device that has more disk size, or you can create an emulator with a flag which sets the disk size of the AVD. Check the options in avdmanager

@mrk-han
Copy link
Author

mrk-han commented Oct 4, 2022

@BenceBakos Check avdmanager list device for a tablet, then specify that when creating

@mrk-han
Copy link
Author

mrk-han commented Oct 5, 2022

10/5/2022 -- Cleaned up gist and tried to add more clarity.

@cmoulliard
Copy link

Yes! You can use a custom profile with --device that has more disk size

The advmanager command shows the different devices but nothing is displayed around the disk size !

./cmdline-tools/latest/bin/avdmanager list
id: 1 or "tv_4k"
    Name: Android TV (4K)
    OEM : Google
    Tag : android-tv
---------
id: 2 or "tv_720p"
    Name: Android TV (720p)
    OEM : Google
    Tag : android-tv
...
...

Do you know why the advmanager part of the SDK list more devices vs advmanager tool installed without the Android Studio ?

@cmoulliard
Copy link

you can create an emulator with a flag which sets the disk size of the AVD. Check the options in avdmanager

How can we do that ?

@mrk-han
Copy link
Author

mrk-han commented Oct 5, 2022

@cmoulliard To verify the disk size you can create them and then check the config.ini which is a pain.

If you type avdmanager create avd --help it will give you the options for avdmanager create avd and the output is:

Action "create avd":
  Creates a new Android Virtual Device.
Options:
  -c --sdcard  : Path to a shared SD card image, or size of a new sdcard for
                 the new AVD.
  -g --tag     : The sys-img tag to use for the AVD. The default is to
                 auto-select if the platform has only one tag for its system
                 images.
  -p --path    : Directory where the new AVD will be created.
  -k --package : Package path of the system image for this AVD (e.g.
                 'system-images;android-19;google_apis;x86').
  -n --name    : Name of the new AVD. [required]
  -f --force   : Forces creation (overwrites an existing AVD)
  -b --abi     : The ABI to use for the AVD. The default is to auto-select the
                 ABI if the platform has only one ABI for its system images.
  -d --device  : The optional device definition to use. Can be a device index

-c, or --sdcard can specify the path or the size of the virtual sdcard I believe!

@cmoulliard
Copy link

If you type avdmanager create avd --help it will give you the options for avdmanager create avd and the output is:

We are on the same page here. Nevertheless the list of the devices showed using the avdmanager within a termonal is different from what I see using Android studio

@cmoulliard
Copy link

To verify the disk size you can create them and then check the config.ini which is a pain.

I fully agree. We can nevertheless define the disk data partition using disk.dataPartition.size=2000M but only within the config.ini file created within the avd folder post execution of avdmanager create dvd and emulator ... runs

Screenshot 2022-10-05 at 18 00 20

I suppose that some additional steps are taking place using the Android studio such as gtruncate - https://android.stackexchange.com/questions/142824/how-do-i-resize-internal-storage-of-an-android-studio-avd-image-thats-stuck-at

@mrk-han
Copy link
Author

mrk-han commented Oct 6, 2022

@cmoulliard Try emulator @Nexus_5X_API_23 -partition-size 2048

image

https://developer.android.com/studio/run/emulator-commandline

@cmoulliard
Copy link

Cool. I was able to create the avd but I cannot launch on macos the emulator

~/Applications/sdk/cmdline-tools/latest/bin/sdkmanager "system-images;android-28;google_apis;x86"
~/Applications/sdk/cmdline-tools/latest/bin/avdmanager -v create avd -n android28 -k "system-images;android-28;google_apis;x86" -d pixel_5

~/Applications/sdk/emulator/emulator -avd android28 -partition-size 2000
INFO    | Android emulator version 31.3.11.0 (build_id 9058569) (CL:N/A)
emulator: INFO: checking ANDROID_HOME for valid sdk root...
emulator: INFO: checking ANDROID_SDK_ROOT for valid sdk root...
emulator: WARN: ANDROID_SDK_ROOT is missing.
emulator: WARN: Cannot find valid sdk root from environment variable ANDROID_HOME nor ANDROID_SDK_ROOT,Try to infer from emulator's path
emulator: INFO: guessed sdk root is /Users/cmoullia/Applications/sdk
emulator: WARN: platforms subdirectory is missing under /Users/cmoullia/Applications/sdk, please install it
emulator: WARN: invalid sdk root /Users/cmoullia/Applications/sdk
emulator: WARN: Cannot find valid sdk root path.
PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

Idea ?

@mrk-han
Copy link
Author

mrk-han commented Oct 6, 2022

@cmoulliard your env looks set up wrong. Can you send me the contents of your zshrc or bash profile? or type echo $ANDROID_HOME for me

@mrk-han
Copy link
Author

mrk-han commented Oct 6, 2022

your sdk looks like it is in your applications folder which is wrong

@cmoulliard
Copy link

cmoulliard commented Oct 6, 2022

type echo $ANDROID_HOME for me

it is empty

$ echo $ANDROID_HOME

@mrk-han
Copy link
Author

mrk-han commented Oct 6, 2022

@cmoulliard You will need to set that in your ~/.zshrc file, or bashrc file. Depending on what your default login shell is.

It’s usually located in $HOME/Library/android/sdk/ - I can send more info in the morning. I think I have an example of mine in the comments in this gist here at the top.

@cmoulliard
Copy link

That fails too if I set ANDROID_HOME

ANDROID_HOME=~/Applications/sdk 
$ANDROID_HOME/emulator/emulator -avd android28 -partition-size 2000
INFO    | Android emulator version 31.3.11.0 (build_id 9058569) (CL:N/A)
emulator: INFO: checking ANDROID_HOME for valid sdk root...
emulator: INFO: checking ANDROID_SDK_ROOT for valid sdk root...
emulator: WARN: ANDROID_SDK_ROOT is missing.
emulator: WARN: Cannot find valid sdk root from environment variable ANDROID_HOME nor ANDROID_SDK_ROOT,Try to infer from emulator's path
emulator: INFO: guessed sdk root is /Users/cmoullia/Applications/sdk
emulator: WARN: platforms subdirectory is missing under /Users/cmoullia/Applications/sdk, please install it
emulator: WARN: invalid sdk root /Users/cmoullia/Applications/sdk
emulator: WARN: Cannot find valid sdk root path.
PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

@cmoulliard
Copy link

It’s usually located in $HOME/Library/android/sdk/

I'm using the emulator installed under the sdk command line tools folder

ls -la $ANDROID_HOME
total 8
drwxr-xr-x  10 cmoullia  staff  320 Oct  5 19:02 .
drwx------@ 11 cmoullia  staff  352 Oct  5 18:53 ..
drwxr-xr-x   3 cmoullia  staff   96 Oct  5 18:53 cmdline-tools
drwxr-xr-x  20 cmoullia  staff  640 Oct  5 19:00 emulator
drwxr-xr-x   4 cmoullia  staff  128 Oct  5 19:02 licenses
drwxr-xr-x   3 cmoullia  staff   96 Oct  5 18:54 patcher
drwxr-xr-x  18 cmoullia  staff  576 Oct  5 19:00 platform-tools
drwxr-xr-x   3 cmoullia  staff   96 Oct  5 19:02 system-images


ls -la $ANDROID_HOME/cmdline-tools/latest/bin 
total 112
drwxr-xr-x  9 cmoullia  staff   288 Oct  5 18:53 .
drwxr-xr-x  6 cmoullia  staff   192 Oct  5 18:53 ..
-rwxr-xr-x  1 cmoullia  staff  5319 Jan  1  2010 apkanalyzer
-rwxr-xr-x  1 cmoullia  staff  5310 Jan  1  2010 avdmanager
-rwxr-xr-x  1 cmoullia  staff  5278 Jan  1  2010 lint
-rwxr-xr-x  1 cmoullia  staff  5251 Jan  1  2010 profgen
-rwxr-xr-x  1 cmoullia  staff  5251 Jan  1  2010 retrace
-rwxr-xr-x  1 cmoullia  staff  5307 Jan  1  2010 screenshot2
-rwxr-xr-x  1 cmoullia  staff  5317 Jan  1  2010 sdkmanager

@mrk-han
Copy link
Author

mrk-han commented Oct 6, 2022

export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin

@cmoulliard
Copy link

This export will only allow to get the binaries under $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager|sdkmanager but not at all the emulator which is located under $ANDROID_HOME/emulator/emulator !

@cmoulliard
Copy link

There is a special config to be done to use the emulator coming from the cmdline-tools as we can do

export ANDROID_HOME=/Users/$(whoami)/Applications/sdk
cd $ANDROID_HOME/emulator/
./emulator -list-avds
Pixel_6_API_28
Pixel_6_API_33_2
android28

but not

./emulator -avd android28 -partition-size 2000

@cmoulliard
Copy link

Was able to fix it after creating manually the missing folder platforms

mkdir -p $ANDROID_HOME/platforms

./emulator -avd android28 -partition-size 2000
INFO    | Android emulator version 31.3.11.0 (build_id 9058569) (CL:N/A)
emulator: INFO: Found systemPath /Users/cmoullia/Applications/sdk/system-images/android-28/google_apis/x86/
emulator: INFO: Found systemPath /Users/cmoullia/Applications/sdk/system-images/android-28/google_apis/x86/
INFO    | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag.
INFO    | configAndStartRenderer: setting vsync to 60 hz
WARNING | cannot add library /Users/cmoullia/Applications/sdk/emulator/qemu/darwin-x86_64/lib64/vulkan/libvulkan.dylib: failed
INFO    | added library /Users/cmoullia/Applications/sdk/emulator/lib64/vulkan/libvulkan.dylib
WARNING | *** No gRPC protection active, consider launching with the -grpc-use-jwt flag.***
INFO    | Started GRPC server at 127.0.0.1:8554, security: Local, auth: none
INFO    | Advertising in: /Users/cmoullia/Library/Caches/TemporaryItems/avd/running/pid_3987.ini
INFO    | setDisplayConfigs w 1080 h 2340 dpiX 440 dpiY 440

@moonga-tech
Copy link

why is it taking long installing, any help??

@justinmoon
Copy link

Helped me to just set ANDROID_AVD_HOME manually ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment