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?
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:
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 sdkmanager
cụ 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
(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 --filter
tùy chọn
$ android update sdk --filter <component> --no-ui
trong đó thành phần là một hoặc nhiều
android list sdk
(tức là 1 , còn được gọi là chỉ số gói )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]
Error: Ignoring unknown package filter 'tools'
hoặc Error: Ignoring unknown package filter 'android-17'
.
--accept-license
cờ. Trong khi đó bạn có thểecho "y" | android update sdk --no--ui
Đ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
}
'
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
Để 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 .....
Đố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:
expect
.Nhược điểm:
android
vào đường dẫn của mình.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ì android
lệ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.
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 .
Tôi kết hợp một tập lệnh ruby tải xuống và cài đặt SDK mà không cần nhắc. https://github.com/ayvazj/andenv
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.
Để tự động hóa sdkmanager.bat --licenses
lờ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"}
...
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-sdk
sẽ 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
Đố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:
Phiên bản sudio tôi đã tải xuống và cài đặt: Phiên bản windows: Và ở đây sau khi nó hoạt động tốt:
Trân trọng hy vọng nó hoạt động cho bạn !!