안드로이드 SDK 설치를 자동화하는 방법이 있습니까?


답변:


392

최신 정보

최신 버전에서는 sdkmanagerAndroid SDK 용 패키지를보고, 설치하고, 업데이트하고, 제거 할 수있는 명령 줄 도구 인을 도입했습니다 .

sdkmanager도구는 Android SDK 도구 패키지 ( 25.2.3 이상 )에서 제공되며에 있습니다 android_sdk/tools/bin/.

  sdkmanager [--uninstall] [<common args>] [--package_file <file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]
  sdkmanager --licenses [<common args>]

In its first form, installs, or uninstalls, or updates packages.
    By default, the listed packages are installed or (if already installed)
    updated to the latest version.

    --uninstall: uninstalled listed 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), all installed packages are
    updated to the latest version.

In its third form, all installed and available packages are printed
    out.

In its fourth form (with --licenses), show and offer the option to
     accept licenses for all available packages that have not already been
     accepted.

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.

따라서 패키지 실행을 업데이트하려면

$ sdkmanager --update

라이센스에 동의

$ yes | sdkmanager --licenses

오래된 답변

(참고 : android 명령은 더 이상 사용되지 않습니다!)

자동화에 더 가까이 다가 갈 수있는 것은 다음과 같습니다.

$ android update sdk --no-ui

android는 자동 업데이트를 위해 다음 옵션을 제공합니다.

Action "update sdk":
  Updates the SDK by suggesting new platforms to install if available.
Options:
  -f --force    Forces replacement of a package or its parts, even if something has been modified
  -u --no-ui    Updates from command-line (does not display the GUI)
  -o --obsolete Installs obsolete packages
  -t --filter   A filter that limits the update to the specified types of packages in the form of
                a comma-separated list of [platform, tool, platform-tool, doc, sample, extra]
  -s --no-https Uses HTTP instead of HTTPS (the default) for downloads
  -n --dry-mode Simulates the update but does not download or install anything

설치할 수있는 패키지를 나열하려면 다음을 사용할 수 있습니다.

$ android list sdk

예를 들어 순서가 지정된 패키지 목록을 얻을 수 있습니다.

Packages available for installation or update: 9
   1- ARM EABI v7a System Image, Android API 15, revision 2
   2- Intel x86 Atom System Image, Android API 15, revision 1
   3- Android Support, revision 8
   4- Google AdMob Ads SDK, revision 6
   5- Google Analytics SDK, revision 2
   6- Google Play APK Expansion Library, revision 1
   7- Google Play Billing Library, revision 2
   8- Google Play Licensing Library, revision 2
   9- Google Web Driver, revision 2

또한 --filter옵션 을 사용하는 경우 원하는 구성 요소로만 업데이트를 제한 할 수 있습니다

$ android update sdk --filter <component> --no-ui

여기서 component는 하나 이상

  • 에 의해 반환 된 숫자 android list sdk(예 : 1 , 패키지 인덱스 라고도 함 )
  • 애드온
  • 문서
  • 특별한
  • 플랫폼
  • 플랫폼 도구
  • 견본
  • 출처
  • 시스템 이미지
  • 수단

또는 하나 이상의 특정 식별자 일 수 있습니다. 예를 들어, 작은 특정 패키지 세트 만 다운로드하려는 경우 다음을 수행 할 수 있습니다.

$ android update sdk -u --filter platform-tools,android-16,extra-android-support

플랫폼 도구, API 레벨 16 및 패키지 항아리를 얻을 수 있습니다. 이것은 빌드 머신 만 빌드하고 절대 사용하지 않을 추가 자료를 모두 다운로드해야하는 경우에 매우 유용합니다.

사용 가능한 옵션을 보려면 --help를 사용하십시오 (예 :

$ android --help list sdk

       Usage:
       android [global options] list sdk [action options]
       Global options:
  -h --help       : Help on a specific command.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -s --silent     : Silent mode, shows errors only.

                   Action "list sdk":
  Lists remote SDK repository.
Options:
  -o --obsolete  : Deprecated. Please use --all instead.
  -a --all       : Lists all available packages (including obsolete and
                   installed ones)
     --proxy-host: HTTP/HTTPS proxy host (overrides settings if defined)
     --proxy-port: HTTP/HTTPS proxy port (overrides settings if defined)
  -s --no-https  : Uses HTTP instead of HTTPS (the default) for downloads.
  -e --extended  : Displays extended details on each package
  -u --no-ui     : Displays list result on console (no GUI) [Default: true]

1
계속해서 건너 뛰려면 Enter 키를 눌러야하는 타사의 "사이트 인증"프롬프트가 모두 표시됩니다. 제거 할 수있는 방법이 있습니까?
Somatik

2
Windows SDK 용 "android.exe"가 표시되지 않습니다. Windows에서 SDK 설치 및 구성을 어떻게 자동화합니까?
Trevor Sullivan

1
패키지가 이미 설치되어있는 경우에, 당신과 같은 터무니없는 오류가 발생합니다 Error: Ignoring unknown package filter 'tools'또는 Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica

32
라이센스를 자동으로 수락하기 위해 다음 버전에서는 --accept-license플래그 를 추가합니다 . 한편 당신은 할 수 있습니다echo "y" | android update sdk --no--ui
Snicolas

2
@Snicolas 지금은 "expect"를 사용하여 라이센스 계약을 자동으로 수락하는 makefile을 작성했습니다. github에 있습니다 ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland

50

이것은 나를 위해 작동하지 않았다 ...

echo "y" | android ....

그래서 나는 여기서 끝났습니다.

expect -c '
set timeout -1   ;
spawn sudo /opt/android-sdk/tools/android update sdk -u; 
expect { 
    "Do you accept the license" { exp_send "y\r" ; exp_continue }
    eof
}
'

2
이것은 여기에 제공된 솔루션과 매우 유사합니다. stackoverflow.com/a/6674626/3063884 ... 속성이 필요합니까?
CJBS

2
@CJBS 아니오. 나는 그 남자와 같은 결론에 도달했습니다. 일단 "예상"을 배우면이 결과는 당신이 생각 해낼 수있는 유일한 것입니다.
danb

4
simple expect 스크립트에 감사드립니다. 그렇지만 작동하지 않습니다.
클래스

이것은 sudo를 제거한 다음 안드로이드 도구 경로를 수정 한 후에 만 ​​작동했습니다.
Pellet

44

travis-ci에 SDK를 설치하고 업데이트하는 데 사용합니다.

curl --location http://dl.google.com/android/android-sdk_r22.3-linux.tgz | tar -x -z -C $HOME
export ANDROID_HOME=$HOME/android-sdk-linux
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --filter platform-tool,android-19,sysimg-19,build-tools-19.0.1

잘 작동합니다! 감사합니다.
gilm

2
나를 위해 필터에 지정된 모든 패키지를 찾으려면 -a 옵션도 필요했습니다.
alfoks

16

'y'로 모든 라이센스에 응답하려면 스크립트에서 다음을 시도하십시오.

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....

10
이 작업을 확인할 수 없습니다. " 'yyyyyyyy'은 (는) 올바른 답변이 아닙니다"와 같은 오류가 발생하므로 잠자기 상태에서 솔루션으로 돌아 왔습니다.
npstr

5

여전히 모든 안드로이드 패키지를 다운로드하는 방법을 찾고있는 사람이라면 스크립트를 작성했습니다. 사용되지 않는 모든 패키지를 다운로드 합니다.

#!/binbash
# Install all non-obsolete android sdk packages.
# author: Tai Le Tien (letientai299 at gmail.com)

function install_sdk {
  android update sdk -u -s -a -t "$1"
}

function fetch_non_obsoled_package_indices {
  # Fetch the sdk list using non-https connections
  android list sdk -u -s -a |\
    # Filter obsoleted packages
    sed '/\(Obsolete\)/d' |\
    # Filter to take only the index number of package
    sed 's/^[ ]*\([0-9]*\).*/\1/' |\
    # Remove the empty lines
    sed -n 's/^[^ $]/\0/p'
}

for package_index in  $(fetch_non_obsoled_package_indices)
do
  echo "====================================================================="
  echo "Start to install package:  ${package_index}"
  echo "====================================================================="
  # Auto accept license
  echo -e "y" | install_sdk "${package_index}"
  echo
  echo
done

Github 저장소 에서 볼 수도 있습니다.

좋은 점 :

  • 에 의존하지 않습니다 expect.
  • 목이 없는.

단점 :

  • 여전히 기본 SDK를 수동으로 설치하고 android경로에 넣어야 합니다.
  • 스크립트는 유닉스에서만 작동합니다.

4

최신 안드로이드 버전 (예 :) 에서는 명령 대신 sdkmanager를25.2.5 사용해야합니다android

패키지 설치 예 :

android-sdk/tools/bin/sdkmanager "extras;android;m2repository"

사용 가능한 모든 패키지 목록을 가져 오는 명령 :

 android-sdk/tools/bin/sdkmanager --verbose --list

이 웹 페이지 에는 SDK 도구의 다운로드 링크가 나열되어 있습니다.

다음은 Docker 이미지에 android를 설치할 수 있는 오픈 소스 저장소 docker-android에 대한 링크 입니다.

이 SO 질문 : 모든 SDK 라이센스 자동 수락에 유용한 답변을 찾을 수도 있습니다 .


3

Gradle 버전 2.2.0 용 Android 플러그인 부터 누락 된 SDK 구성 요소 가 자동으로 다운로드됩니다 .


2
라이센스는 자동으로 승인되지 않으므로 CI 사용을 최소화합니다.
eAi

두 번째 링크에는 "허용 된 라이센스 디렉토리를 복사하여 라이센스를 내보내는 방법"에 대한 명시적인 지시 사항이 있습니다. CI 빌드 노드에 대해 쉽게 수행 할 수있는 작업입니다.
sschuberth


0

또 다른 스크립트는 필수가 아닌 {obsolute, source, emulator-image, doc} 패키지 만 다운로드합니다.

#!/bin/bash
set -e

# cd into where tools/android can be found
if [[ -d "$ANDROID_HOME" ]]; then
  cd "$ANDROID_HOME"
elif [[ -x "$(dirname "$0")/tools/android" ]]; then
  cd "$(dirname "$0")"
else
  echo "FAILED: Cannot find ANDROID_HOME/tools/android"
  exit 1
fi

android () {
  "$(dirname $0)/tools/android" "$@"
}

needed_packages () {
  android list sdk -u -s -e         \
    | grep '^id:'                   \
    | cut -d'"' -f2                 \
    | grep -v 'source'              \
    | grep -v 'sys-img'             \
    | grep -v 'doc'                 \
    | paste -d, -s -
}

main () {
  (while : ; do
  echo 'y'
  sleep 1
  done) | android update sdk -u -s -a -t "$(needed_packages)"
}

main

이 부분의 다른 답변에서 일부 부품을 가져옵니다.


0

sdkmanager.bat --licensesWindows 에서 프롬프트 를 자동화하려면 (빌드 인프라 자동화를 통해 설치하는 경우) ... 실행하지 마십시오. 배관 방법을 알아내는 데 시간을 낭비하지 마십시오 y. 나는 시도했다; 실패 실패.

오히려-스스로 한 번 실행하고 파일을 생성한다는 점에 유의하십시오 c:\android\android-sdk\licenses(실행중인 위치 c:\android\android-sdk\tools\bin\sdkmanager.bat-설치 루트가 다를 수 있음).

해당 파일을 가져 와서 자동 설정 스크립트에서 가져올 수있는 위치에 배치하십시오. 개인적으로 ansible은 내 독약이므로

# Note to future-us:
# These are magical files generated by running `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses`
# This, delightfully, is interactive, and wants to _actually_ read the keyboard buffer.
# That's reputedly possible via SendKeys. I elected to not try that.
# So, instead:
# 1) remote to an instance like a cave-dweller
# 2) run `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses` in a prompt.
# 3) _actually type_ `y` however many godforsaken times you need to.
# 4) meticulously harvest `c:/android/android-sdk/licenses/*` to this task.
#    (you don't need the newline that they thoughtfully put before the hash in each file).
- name: set up android licenses by hand
  win_lineinfile:
    path: c:/android/android-sdk/licenses/{{ item.name }}
    line: "{{ item.line }}"
    create: true
  with_items:
    - {name: "android-googletv-license", line: "SOME HASH"}
    - {name: "android-sdk-license", line: "SOME OTHER HASH"}
    ...

0

나는 이것으로도 좌절했고 com.quittle.setup-android-sdk필요한 것을 감지하고 설치할 Gradle 플러그인을 만들었습니다 . Windows, OSX 및 Linux에서 작동하며 Gradle로 빌드하는 경우 추가 종속성이 필요하지 않습니다.

관심이 있으시면 여기에서 내 문서를 확인하십시오 : https://github.com/quittle/gradle-setup-android-sdk


-1

초보자 안드로이드 개발자이지만 경험 많은 Java 개발자에게는 위의 악몽을 모두 극복하더라도 WHICH 종속성을 아는 것이 정말 어리 석습니다. 내 동료 기반 :-) 인 IntelliJ 안드로이드 스튜디오 (사용하라고 조언 특별히을위의 악몽 때문에. 나는 그의 충고를 따랐다. 그러나 설치의 기본값을 수락하지 않고 소프트웨어 드라이브에 설치하려고했습니다. 악몽으로 밝혀졌습니다. SDK 대화가 멈추는 것처럼 보였고 전혀 직관적이지 않았습니다. 그렇기 때문에 여기까지 왔습니다. 위의 내용을 읽은 후 Studio에 다른 시도를했으며 이번에는 모든 기본값을 허용합니다. Hey PRESTO는 Ctl-Shift-S와 SKD를 묻지 않고 두 개의 대화에서 모든 SDK 종속성 (내가 추측하고있는 핵심 것)을 처리했습니다. 따라서 초보자에게 권장합니다. 다운로드시 푸딩의 증거는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

내가 다운로드하여 설치 한 sudio 버전 : 여기에 이미지 설명을 입력하십시오 Windows 버전 : 여기에 이미지 설명을 입력하십시오 여기에서 좋은 일을 한 후에 : 여기에 이미지 설명을 입력하십시오

진심으로 그것이 당신을 위해 작동 희망!


그래서 나중에 찾은 것은 실제로 설치된 폴더와 관련이 없다는 것입니다. 인터넷 연결 및 추론에 의해 프록시가 올바르게 구성되어 있는지 확인하십시오. 그렇지 않으면 설치할 수있는 것이 없습니다. 그게 문제였습니다.
Beezer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.