Có cách nào để tự động cài đặt sdk android?


207

Bây giờ tôi phải tải xuống và cài đặt Android SDK và AVD Manager, sau đó cài đặt các API, công cụ thông qua giao diện người dùng. Có cách nào để tự động hóa quá trình này?



Câu trả lời:


392

CẬP NHẬT

Các phiên bản mới nhất giới thiệu sdkmanager, một công cụ dòng lệnh cho phép bạn xem, cài đặt, cập nhật và gỡ cài đặt các gói cho SDK Android.

Công sdkmanagercụ này được cung cấp trong gói Công cụ SDK Android ( 25.2.3 trở lên ) và được đặt trong 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.

vì vậy, để cập nhật các gói chạy

$ sdkmanager --update

chấp nhận giấy phép

$ yes | sdkmanager --licenses

TRẢ LỜI

(Xin lưu ý: Lệnh android không được dùng nữa!)

Gần hơn bạn có thể nhận được để tự động hóa có thể là:

$ android update sdk --no-ui

Android cung cấp các tùy chọn này để cập nhật tự động:

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

Nếu bạn muốn liệt kê những gói có sẵn để cài đặt, bạn có thể sử dụng

$ android list sdk

và bạn sẽ có được một danh sách các gói, ví dụ

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

Ngoài ra, bạn chỉ có thể giới hạn cập nhật cho một thành phần mong muốn nếu bạn sử dụng --filtertùy chọn

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

trong đó thành phần là một hoặc nhiều

  • các số được trả về bởi android list sdk(tức là 1 , còn được gọi là chỉ số gói )
  • thêm vào
  • tài liệu
  • thêm
  • nền tảng
  • công cụ nền tảng
  • mẫu vật
  • nguồn
  • hình ảnh hệ thống
  • dụng cụ

hoặc có thể là một hoặc nhiều định danh cụ thể. Chẳng hạn, nếu bạn chỉ muốn tải xuống một nhóm nhỏ các gói cụ thể, bạn có thể làm điều này:

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

và bạn sẽ chỉ nhận được các công cụ nền tảng, api cấp 16 và gói hỗ trợ. Điều này thực sự tiện dụng nếu bạn chỉ xây dựng một máy xây dựng và sẽ phải trả tiền để tải xuống tất cả những thứ bổ sung mà bạn sẽ không bao giờ sử dụng.

Để xem các tùy chọn có sẵn, bạn có thể sử dụng - trợ giúp, ví dụ:

$ 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
Tôi nhận được tất cả các lời nhắc "Xác thực trang web" của bên thứ ba mà tôi phải nhấn enter để tiếp tục / bỏ qua, có cách nào để loại bỏ chúng không?
Somatik

2
Tôi không thấy "android.exe" cho SDK Windows - bạn sẽ tự động cài đặt và cấu hình SDK trên Windows như thế nào?
Trevor Sullivan

1
Lưu ý rằng trong trường hợp gói đã được cài đặt, bạn sẽ gặp phải lỗi vô nghĩa như Error: Ignoring unknown package filter 'tools'hoặc Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica

32
Để tự động chấp nhận giấy phép, phiên bản tiếp theo sẽ thêm --accept-licensecờ. Trong khi đó bạn có thểecho "y" | android update sdk --no--ui
Snicolas

2
@Snicolas Tôi đã viết một tệp tạo tệp sử dụng "mong đợi" để tự động chấp nhận các thỏa thuận cấp phép ngay bây giờ. Đó là trên github ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland

50

Điều này đã không làm việc cho tôi ...

echo "y" | android ....

Vì vậy, tôi đã kết thúc ở đây:

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
Điều này trông rất giống với giải pháp được cung cấp ở đây: stackoverflow.com/a/6674626/3063884 ... là bắt buộc phải có?
CJBS

2
@CJBS Không. Tôi đi đến kết luận tương tự mà anh chàng đã làm. Khi bạn học "mong đợi", kết quả này là khá nhiều người duy nhất bạn có thể nghĩ ra ... nhưng cảm ơn vì đã cung cấp sự ghi nhận.
danb

4
Cảm ơn kịch bản mong đợi đơn giản, điều này hoạt động trong khi có thì không.
lớp

Điều này chỉ hoạt động sau khi loại bỏ sudo và sau đó sửa đường dẫn công cụ Android.
Pellet

44

tôi sử dụng cái này để cài đặt và cập nhật sdk trên travis-ci

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

Hoạt động tốt! Cảm ơn bạn.
gilm

2
Đối với tôi, tùy chọn -a cũng cần thiết để tìm thấy tất cả các gói được chỉ định trong bộ lọc.
alfoks

16

Để trả lời tất cả các giấy phép bằng 'y', bạn có thể thử điều này trong tập lệnh:

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

10
Tôi không thể xác nhận làm việc này. Tôi nhận được một lỗi nghe có vẻ như "yyyyyyyy" không phải là một câu trả lời hợp lệ ", đó là lý do tại sao tôi lại rơi vào giải pháp với một giấc ngủ giữa.
npstr

5

Đối với bất kỳ ai vẫn đang tìm kiếm một phương pháp để tải xuống tất cả các gói Android, tôi đã viết một tập lệnh để làm điều đó. Nó sẽ tải xuống tất cả các gói không lỗi thời .

#!/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

Bạn cũng có thể thấy nó trên repo Github của tôi

Tốt:

  • Không phụ thuộc vào expect.
  • Không đầu.

Nhược điểm:

  • Bạn vẫn phải cài đặt SDK cơ bản theo cách thủ công và đưa androidvào đường dẫn của mình.
  • Script chỉ hoạt động trên unix.

4

Trong các phiên bản Android mới hơn (ví dụ 25.2.5) chúng ta nên sử dụng sdkmanager (thay vì androidlệnh)

Ví dụ về cài đặt gói:

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

Lệnh để có được danh sách tất cả các gói có sẵn:

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

Trang web này liệt kê các liên kết tải xuống cho các công cụ SDK:

Đây là một liên kết đến một kho lưu trữ mã nguồn mở docker-android có thể cài đặt Android trong một hình ảnh Docker.

Bạn cũng có thể tìm thấy câu trả lời trong Câu hỏi SO này: Tự động chấp nhận tất cả các giấy phép SDK hữu ích.


3

Bắt đầu với Plugin Android cho Gradle phiên bản 2.2.0, các thành phần SDK bị thiếu sẽ tự động được tải xuống .


2
Họ làm, nhưng giấy phép không được chấp nhận tự động, điều này làm cho nó được sử dụng tối thiểu cho CI.
eAi

Liên kết thứ hai của tôi có hướng dẫn rõ ràng về cách "xuất giấy phép của bạn bằng cách sao chép qua thư mục giấy phép được chấp nhận". Đây là điều bạn có thể dễ dàng thực hiện cho các nút xây dựng CI của mình.
sschuberth


0

Một tập lệnh khác chỉ cần tải xuống, các gói không cần thiết, không lỗi thời, nguồn, trình mô phỏng-hình ảnh, 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

Một số phần được lấy từ các câu trả lời khác trong chủ đề này.


0

Để tự động hóa sdkmanager.bat --licenseslời nhắc trên Windows (giả sử bạn đang cài đặt thông qua tự động hóa để xây dựng cơ sở hạ tầng) ... Đừng chạy nó. Đừng lãng phí thời gian để cố gắng tìm ra cách để yđưa vào đó. Tôi đã thử; thoái vị thất bại.

Thay vào đó - hãy tự chạy một lần và lưu ý rằng nó tạo các tệp vào c:\android\android-sdk\licenses(nơi bạn đang chạy c:\android\android-sdk\tools\bin\sdkmanager.bat- gốc cài đặt của bạn có thể thay đổi).

Lấy các tệp đó và đặt chúng ở một nơi nào đó mà bạn có thể lấy chúng trong các tập lệnh thiết lập tự động của bạn. Cá nhân, ansible là chất độc của tôi, vì vậy:

# 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

Tôi cũng cảm thấy thất vọng với điều này và đã xây dựng một plugin Gradle có tên com.quittle.setup-android-sdksẽ phát hiện và cài đặt những gì bạn cần. Nó hoạt động trên Windows, OSX và Linux và không yêu cầu bất kỳ phụ thuộc bổ sung nào nếu bạn xây dựng với Gradle.

Nếu bạn quan tâm, bạn có thể kiểm tra tài liệu của tôi trên đây: https://github.com/quittle/gradle-setup-android-sdk


-1

Đối với một nhà phát triển Android mới, nhưng là một nhà phát triển Java có kinh nghiệm, sẽ thực sự hoang mang khi biết các phụ thuộc WHICH, NGAY CẢ nếu bạn vượt qua tất cả những cơn ác mộng ở trên. Đồng nghiệp của tôi khuyên tôi nên sử dụng Android Studio (dựa trên Intellij :-) cụ thểVì những cơn ác mộng trên. Tôi làm theo lời khuyên của anh ấy. Nhưng tôi đã không chấp nhận mặc định cho việc cài đặt và đã cố cài đặt nó trong ổ đĩa phần mềm của tôi. Thì ra là một cơn ác mộng. Cuộc đối thoại SDK dường như bị treo và hoàn toàn không trực quan. Đó là lý do tại sao tôi kết thúc ở đây. Sau khi đọc những điều trên, tôi đã cho Studio thử lại lần nữa và lần này đã chấp nhận TẤT CẢ các mặc định cho phần giới thiệu. Xin chào PRESTO ... nó đã xử lý tất cả các phụ thuộc SDK (những yếu tố cốt lõi mà tôi đoán) trong một vài cuộc đối thoại mà không được nhắc, ví dụ như Ctl-Shift-S và SKD. Do đó tôi muốn giới thiệu nó cho một người mới. Đây là bằng chứng của pudding khi nó tải xuống: nhập mô tả hình ảnh ở đây

Phiên bản sudio tôi đã tải xuống và cài đặt: nhập mô tả hình ảnh ở đây Phiên bản windows: nhập mô tả hình ảnh ở đây Và ở đây sau khi nó hoạt động tốt: nhập mô tả hình ảnh ở đây

Trân trọng hy vọng nó hoạt động cho bạn !!


Vì vậy, những gì tôi sau đó tìm thấy là nó thực sự không có gì để làm với thư mục được cài đặt. Đảm bảo rằng kết nối internet của bạn và bằng cách suy luận proxy được cấu hình đúng. Nếu không, bạn sẽ thấy không có gì để cài đặt. Đó là vấn đề.
Beezer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.