333

I want to setup the Android dev environment from command line, and encounter the following issue:

wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

after extract the file, run

tools/android update sdk --no-ui

However, it is too slow on running

Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml

The result is that nothing in folder build-tools, and I want is aapt and apkbuilder, since I want to build apk from command line without ant.

20 Answers 20

486

By default, the SDK Manager from the command line does not include the build tools in the list. They're in the "obsolete" category. To see all available downloads, use

android list sdk --all

And then to get one of the packages in that list from the command line, use:

android update sdk -u -a -t <package no.>

Where -u stands for --no-ui, -a stands for --all and -t stands for --filter.

If you need to install multiple packages do:

android update sdk -u -a -t 1,2,3,4,..,n 

Where 1,2,..,n is the package number listed with the list command above

14
  • 4
    If you are missing build-tools like 18.1.1 then this is the right way to install it using the command line.
    – Cray
    Oct 22, 2013 at 13:22
  • 21
    it kinda sucks, they didn't mention --all option in the official tips. Thank you. Nov 29, 2013 at 10:24
  • 4
    @DanielJonker Yes, it is. Just echo "yes" to the command, i.e. echo yes | android update sdk --all --filter tools --no-ui --force > /dev/null
    – nsg
    May 14, 2014 at 9:55
  • 4
    echo "yes" can be shortened to echo "y", but that doesn't work in all cases anyway. In some cases you can get more than one y/n license prompt, depending on the filter and specific packages. echo "y" will respond to the first prompt only, but not the rest. I'm trying to make it work with yes command with no success so far.
    – i4niac
    Jul 4, 2014 at 1:47
  • 3
    @AlexanderMalakhov I agree, if your host OS has the utility, using it is the best option. I looked at expect first, but in my case I have to run the script on a certain Linux distributive running in AWS cloud. That distro does not have expect installed and I don't have enough rights to install it as part of build plan. After looking around, the best solution that I found is <pre><code> # update Android SDK on headless server FILTER=tool,platform,android-20 ( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \ | android update sdk --no-ui --all \ --filter ${FILTER} </code></pre>
    – i4niac
    Aug 27, 2014 at 0:01
141

As mentioned in other answers, you can use the --filter option to limit the installed packages:

android update sdk --filter ...

The other answers don't mention that you can use constant string identifiers instead of indexes (which will change) for the filter options. This is helpful for unattended or scripted installs. Man for --filter option:

... This also accepts the identifiers returned by 'list sdk --extended'.

android list sdk --all --extended :

Packages available for installation or update: 97
----------
id: 1 or "tools"
     Type: Tool
     Desc: Android SDK Tools, revision 22.6.2
----------
id: 2 or "platform-tools"
     Type: PlatformTool
     Desc: Android SDK Platform-tools, revision 19.0.1
----------
id: 3 or "build-tools-19.0.3"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 19.0.3

Then you can use the string ids as the filter options to precisely specify the versions you want:

android update sdk --filter tools,platform-tools,build-tools-19.0.3 etc

6
  • 27
    +1 for the --extended option, making it clear what to install for CI scripts.
    – nhaarman
    May 31, 2014 at 22:39
  • 16
    android update will also require the --all option, otherwise usage help is displayed. For example: android update sdk --no-ui --all --filter build-tools-21.1.0 (and +1 for the --extended option which allows you to see the aliases like build-tools-21.1.0) Jan 28, 2015 at 14:27
  • 2
    Where is the man for the --filter and --extended options? Feb 10, 2016 at 11:02
  • 2
    I agree it's much better to use the string rather than the number, which is not fixed.
    – wisbucky
    Feb 25, 2016 at 18:32
  • 1
    I was looking for that --extended option so I could write a script and use it in my Continuous Integration Server where it can refresh the sdk resources itself. Nice tip !
    – osayilgan
    Sep 7, 2016 at 22:31
98

Version 25.2.3 (and higher) of Android SDK Tools package contains new tool - sdkmanager - which simplifies this task of installing build-tools from the command line.
It is located in android_sdk/tools/bin folder.

Usage (from documentation):

List installed and available packages:

sdkmanager --list [options] \
      [--channel=channel_id] // Channels: 0 (stable), 1 (beta), 2 (dev), or 3 (canary)

Use the channel option to include a package from a channel up to and including channel_id. For example, specify the canary channel to list packages from all channels.

Install packages:

sdkmanager packages [options]

The packages argument is an SDK-style path, wrapped in quotes (for example, "build-tools;25.0.0" or "platforms;android-25"). You can pass multiple package paths, separated with a space, but they must each be wrapped in their own set of quotes.

Example usage (on my Mac):

alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/   
alex@mbpro:~/sdk/tools/bin$ ./sdkmanager "build-tools;25.0.2"  
done   
alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/ 25.0.2/

You can also specify various options, for example to force all connections to use HTTP (--no_https), or in order to use proxy server (--proxy_host=address and --proxy_port=port).

To check the available options, use the --help flag. On my machine (Mac), the output is as following:

alex@mbpro:~/sdk/tools/bin$ ./sdkmanager --help
Usage: 
  sdkmanager [--uninstall] [<common args>] \
    [--package_file <package-file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]

In its first form, installs, or uninstalls, or updates packages.
    <package> is a sdk-style path (e.g. "build-tools;23.0.0" or 
             "platforms;android-23").
    <package-file> is a text file where each line is a sdk-style path
                   of a package to install or uninstall.
    Multiple --package_file arguments may be specified in combination
     with explicit paths.
In its second form (with --update), currently installed packages are
    updated to the latest version.
In its third form, all installed and available packages are printed out.

Common Arguments:
    --sdk_root=<sdkRootPath>: Use the specified SDK root instead of the SDK containing this tool
    --channel=<channelId>: Include packages in channels up to <channelId>.
                           Common channels are:
                           0 (Stable), 1 (Beta), 2 (Dev), and 3 (Canary).

    --include_obsolete: With --list, show obsolete packages in the
                        package listing. With --update, update obsolete
                        packages as well as non-obsolete.
    --no_https: Force all connections to use http rather than https.
    --proxy=<http | socks>: Connect via a proxy of the given type.
    --proxy_host=<IP or DNS address>: IP or DNS address of the proxy to use.
    --proxy_port=<port #>: Proxy port to connect to.

* If the env var REPO_OS_OVERRIDE is set to "windows",
  "macosx", or "linux", packages will be downloaded for that OS.
9
  • 1
    Anyone else getting Warning: Unknown argument --package_file ?
    – ulidtko
    Mar 11, 2017 at 9:25
  • 3
    @ulidtko There's a bug in usage documentation. The correct way is to append the equals sign, e.g. --package_file=packages.txt.
    – Alex Lipov
    Mar 11, 2017 at 10:51
  • 4
    @AaA It does simplify task of installing from command line. OP explicitly stated that he's looking for a command line solution, and therefore your comment is irrelevant in this context.
    – Alex Lipov
    Feb 27, 2019 at 6:31
  • 1
    @NickTurner If you don't have the SDK installed, the simplest way to get the sdkmanager binary is by downloading Android Command Line Tools (sdkmanager is one of the included tools). The URL is platform and version specific, i.e. getting the Linux's most recent (as of today) version will be wget -q https://dl.google.com/android/repository/commandlinetools-linux-8092744_latest.zip -O cmdtools.zip. This will download a zip archive, which you later can unzip with unzip -q cmdtools.zip -d /tmp/ and then invoke the sdkmanger with /tmp/cmdline-tools/bin/sdkmanager.
    – Alex Lipov
    Feb 3, 2022 at 13:36
  • 3
    Also note that sdkmanager is a Java binary, therefore you'll have to pre-install Java as well.
    – Alex Lipov
    Feb 3, 2022 at 13:37
56

ADB Build-Tools Will Not be downloaded automatically, by command android update sdk --no-ui

So for installing Buil-Tool type (in console):

android list sdk --all

Remember the number that is listed before the item and execute the following:

android update sdk -u --all --filter <number>

commands should be typed in /YourFolder/android-sdk-linux/tools

Also for remote folder (server opened by ssh for example) type:

**./android** list sdk --all
**./android** update sdk -u --all --filter <number>

For simple list of ADB packages type in terminal:

android list sdk

for install all packages:

android update sdk --no-ui

Or with filters (comma is separator):

android update sdk --no-ui --filter 3,5,8,14
2
  • for old deprecated sdks you must use --all. for example android update sdk --no-ui --all --filter 27 to install platform-8
    – fluke
    Oct 12, 2014 at 15:02
  • since the SDK installer kept crashing when I was using the GUI, I had to switch to command-line, so this really helped. Thanks. Jan 11, 2017 at 11:23
34

A great source of information I came across while trying to install everything Android SDK related from the command line, was this Dockerfile. Inside the Dockerfile you can see that the author executes a single command to install platform tools and build tools without any other interaction. In the case the OP has put forth, the command would be adapted to:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui
2
  • What if I don't want all packages? Just want 21.1.0. Nov 14, 2016 at 20:54
  • @IgorGanapolsky Perhaps you should try without the --all flag
    – geoand
    Nov 15, 2016 at 7:08
30

If you have sdkmanager installed (I'm using MAC)

run sdkmanager --list to list available packages.

If you want to install build tools, copy the preferred version from the list of packages available.

To install the preferred version run

sdkmanager "build-tools;27.0.3"
3
  • 1
    Thanks. It works! The command "android" is deprecated now with the latest version of Android-sdk, we have to use ./sdkmanager from the /tools/bin directory
    – JLavoie
    Dec 16, 2018 at 21:24
  • and you can add proxy after it, the full command could be like: ~/Library/Android/sdk/tools/bin/sdkmanager "build-tools;27.0.3" --proxy=http --proxy_host=127.0.0.1 --proxy_port=1087
    – Bird Bird
    Nov 15, 2020 at 11:28
  • This answer helped me resolve No usable Android build tools found. Highest 30.x installed version is 29.0.2; minimum version required is 30.0.3. by using sdkmanager "build-tools;30.0.3" Mar 29, 2022 at 15:56
23

The "android" command is deprecated.

For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager

If you do not need Android Studio, you can download the basic Android command line tools from developer.android.com in section Command line tools only.

from CLI it should be somfing like:

curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

or

wget --output-document sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

After that just unpack the archive to the target folder

unzip sdk-tools-linux.zip

And now we can install everything you need...

./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

You can get a complete list of packages using the command ./tools/bin/sdkmanager --list

Some packages require acceptance of the license agreement. you can accept it interactively or just pass "y" to the input stream, like this(two agreements in case):

echo -ne "y\ny" | ./tools/bin/sdkmanager --install 'system-images;android-29;default;x86_64'

And of course, for your convenience, you can export variables such as ANDROID_HOME or ANDROID_SDK_ROOT (including doing it in ~/.profile or ~/.bash_profile) or patch the PATH variable - all this is at your discretion.

Script example:

mkdir /opt/android-sdk
cd /opt/android-sdk
curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux.zip
echo -ne "y" | ./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

Requirements: curl(or wget) and unzip

Troubleshooting:

if you see Warning: Could not create settings, you need to have the tools directory inside the cmdline-tools directory inside the ANDROID_HOME (create it if needed with this exact name) see Android Command line tools sdkmanager always shows: Warning: Could not create settings

21

I just had a heck of a time getting android sdk dependencies installed via command line and since the documentation that comes with the tools and online are woefully lacking, I thought I'd post what I discovered here.

I'm working with android sdk r24.4.1 for linux. There are two commands that you can run to list the available packages:

android list sdk

and the more exhaustive:

android list sdk --all

The package numbers for specific packages differ for each command above! For example, the former lists package API 23.1 revision 3 as package #3 and the latter lists it as #29.

Now, there are two different ways to install using the android command.

tools/android update sdk --no-ui --filter <package number>

and

tools/android update sdk -u -a -t <package number>

Given that the install commands each can take the package # as a parameter, which package number do you use? After much online searching and trial and error, I discovered that

android update sdk --no-ui --filter uses the package numbers from android list sdk

and

android update sdk -u -a -t uses the package numbers from android list sdk --all

In other words - to install API 23.1 revision 3 you can do either:

android update sdk --no-ui --filter 3

or

android update sdk -u -a -t 29

Crazy, but it works.

11
  • 1
    -a is the short version of --all, thats why it is using that package number. (-u is short for --no-ui and -t is short for --filter.)
    – darthmaim
    Jul 13, 2016 at 11:34
  • I believe what Ips says. Google are known not to keep their usage() text up to date with reality.
    – not2qubit
    Nov 4, 2016 at 20:01
  • on ubuntu i ran : $ echo y | $ANDROID_HOME/tools/android update sdk -u -a -t 27 Now how to confirm I was updated to Android 8 ? Dec 8, 2017 at 6:36
  • $ANDROID_HOME/tools/android list target | grep "Based on Android" Based on Android 4.0.3 (API level 15) Based on Android 4.1.2 (API level 16) Based on Android 4.2.2 (API level 17) Based on Android 4.3.1 (API level 18) Based on Android 4.4.2 (API level 19) Based on Android 4.4.2 (API level 19) Based on Android 5.0.1 (API level 21) Based on Android 5.1.1 (API level 22) Based on Android 6.0 (API level 23) Based on Android 7.0 (API level 24) Dec 8, 2017 at 6:36
  • Cause when I ran : $ANDROID_HOME/tools/android list sdk Packages available for installation or update: 1 1- SDK Platform Android 8.1.0, API 27, revision 1 Dec 8, 2017 at 6:44
20

Most of the answers seem to ignore the fact that you may need to run the update in a headless environment with no super user rights, which means the script has to answer all the y/n license prompts automatically.

Here's the example that does the trick.

FILTER=tool,platform,android-20,build-tools-20.0.0,android-19,android-19.0.1

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | android update sdk --no-ui --all \
    --filter ${FILTER}

No matter how many prompts you get, all of those will be answered. This while/sleep loop looks like simulation of the yes command, and in fact it is, well almost. The problem with yes is that it floods stdout with 'y' and there is virtually no delay between sending those characters and the version I had to deal with had no timeout option of any kind. It will "pollute" stdout and the script will fail complaining about incorrect input. The solution is to put a delay between sending 'y' to stdout, and that's exactly what while/sleep combo does.

expect is not available by default on some linux distros and I had no way to install it as part of my CI scripts, so had to use the most generic solution and nothing can be more generic than simple bash script, right?

As a matter of fact, I blogged about it (NSBogan), check it out for more details here if you are interested.

1
  • --all will install all possible sdk's. Not ideal if you want to limit to a specific filter. Nov 14, 2016 at 20:57
8

However, it is too slow on running

Yes, I've had the same problem. Some of the file downloads are extremely slow (or at least they have been in the last couple of days). If you want to download everything there's not a lot you can do about that.

The result is that nothing in folder build-tools, and I want is aapt and apkbuilder, since I want to build apk from command line without ant.

Did you let it run to completion?

One thing you can do is filter the packages that are being downloaded using the -t switch.

For example:

tools/android update sdk --no-ui -t platform-tool

When I tried this the other day I got version 18.0.0 of the build tools installed. For some reason the latest version 18.0.1 is not included by this filter and the only way to get it was to install everything with the --all switch.

1
  • 2
    Run this to get the available filters: "android update sdk -h" ... A filter that limits the update to the specified types of packages in the form of a comma-separated list of [platform, system-image, tool, platform-tool, doc, sample, source]. This also accepts the identifiers returned by 'list sdk --extended'.
    – aleb
    Oct 9, 2013 at 2:09
7

I prefer to put a script that install my dependencies

Something like:

#!/usr/bin/env bash
#
# Install JUST the required dependencies for the project.
# May be used for ci or other team members.
#

for I in android-25 \
         build-tools-25.0.2  \
         tool \
         extra-android-m2repository \
         extra-android-support \
         extra-google-google_play_services \
         extra-google-m2repository;

 do echo y | android update sdk --no-ui --all --filter $I ; done

https://github.com/caipivara/android-scripts/blob/master/install-android-dependencies.sh

1
  • Thanks, help to save me a lot of time.
    – utzcoz
    Jun 13, 2017 at 5:39
4

I just had this problem, so I finally wrote a 1 line bash dirty solution by reading and parsing the list of aviable tools :

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')
2
  • I switched my project to play services, it asked for the licenses of much more than just build tools, so this solution is very limited.
    – nurettin
    Dec 23, 2016 at 8:33
  • Feels much more deterministic than indexes which may change over time as versions evolve... Apr 10, 2017 at 23:44
4

Inspired from answers by @i4niac & @Aurélien Lambert, this is what i came up with

csv_update_numbers=$(./android list sdk --all | grep 'Android SDK Build-tools' | grep -v 'Obsolete' | sed 's/\(.*\)\- A.*/\1/'|sed '/^$/d'|sed -e 's/^[ \t]*//'| tr '\n' ',')
csv_update_numbers_without_trailing_comma=${csv_update_numbers%?}

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | ./android update sdk --all -u -t $csv_update_numbers_without_trailing_comma

Explanation

  • get a comma separated list of numbers which are the indexes of build tools packages in the result of android list sdk --all command (Ignoring obsolete packages).
  • keep throwing 'y's at the terminal every few miliseconds to accept the licenses.
4

Download android SDK from developer.android.com (its currently a 149mb file for windows OS). It is worthy of note that android has removed the sdkmanager GUI but has a command line version of the sdkmanager in the bin folder which is located inside the tools folder.

  1. When inside the bin folder, hold down the shift key, right click, then select open command line here. Shift+right click >> open command line here.
  2. When the command line opens, type sdkmanager click enter.
  3. Then run type sdkmanager (space), double hyphen (--), type list sdkmanager --list (this lists all the packages in the SDK manager)
  4. Type sdkmanager (space) then package name, press enter. Eg. sdkmanager platform-tools (press enter) It will load licence agreement. With options (y/n). Enter y to accept and it will download the package you specified.

For more reference follow official document here

I hope this helps. :)

2

Build tools could not be downloaded automatically by default as Nate said in https://stackoverflow.com/a/19416222/1104031 post.

But I wrote small tool that make everything for you

I used "expect" tool as danb in https://stackoverflow.com/a/17863931/1104031 post. You only need android-sdk and python27, expect.

This script will install all build tools, all sdks and everything you need for automated build:

import subprocess,re,sys

w = subprocess.check_output(["android", "list", "sdk", "--all"])
lines = w.split("\n")
tools = filter(lambda x: "Build-tools" in x, lines)
filters = []
for tool in tools:
  m = re.search("^\s+([0-9]+)-", tool)
  tool_no = m.group(1)
  filters.append(tool_no)

if len(filters) == 0:
  raise Exception("Not found build tools")


filters.extend(['extra', 'platform', 'platform-tool', 'tool'])

filter = ",".join(filters)

expect= '''set timeout -1;
spawn android update sdk --no-ui --all --filter %s;
expect {
  "Do you accept the license" { exp_send "y\\r" ; exp_continue }
  eof
}''' % (filter)

print expect

ret = subprocess.call(["expect", "-c", expect])
sys.exit(ret)
2
  • How about echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
    – schemacs
    May 7, 2014 at 15:40
  • 1
    Correct me if I'm wrong but it seems that this script re-downloads everything everytime it's ran. I tried with the -u param but it didn't seemed to work :/
    – gbero
    Jun 24, 2014 at 7:57
1

As stated in other responses, the build tools requires the --all flag to be installed. You also better use a -t filter flag to avoid installing ALL the packages but there is no way to filter all the build tools.

There are already features requests for these two points in AOSP bug tracker. Feel free to vote for them, this might make them happen some day:

1

I tried this for update all, and it worked!

echo y | $ANDROID_HOME/tools/android update sdk --no-ui
0

Try

1. List all packages

android list sdk --all

2. Install packages using following command

android update sdk -u -a -t package1, package2, package3 //comma seperated packages obtained using list command 
-1

android update sdk

This command will update and install all latest release for SDK Tools, Build Tools,SDK platform tools.

It's Work for me.

-2

To setup android environment without installating the whole android studio :

  1. Download JDK (version greater than 8)
  2. Download gradle from https://gradle.org/install/
  3. Download command line tools from https://developer.android.com/studio scroll down and download command line tools only
  4. Setup the necessary environment variables
  5. Download the necessary SDK tools

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.