我想从命令行设置Android开发环境,遇到以下问题:
wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz
解压完成后,运行
tools/android update sdk --no-ui
但是,它跑起来太慢了
Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml
结果是在文件夹build-tools中什么都没有,我想要的是apapt和apkbuilder,因为我想从命令行构建apk而没有ant。
不建议使用“android”命令。
命令行工具使用“tools/bin/sdkmanager”和“tools/bin/avdmanager”
如果你不需要Android Studio,你可以从developer.android.com的命令行工具部分下载基本的Android命令行工具。
从CLI来看,它应该是这样的:
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
在此之后,只需将存档解压缩到目标文件夹
unzip sdk-tools-linux.zip
现在我们可以安装你需要的一切…
./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'
可以使用./tools/bin/sdkmanager——list命令获取完整的软件包列表
有些包要求接受许可协议。你可以交互地接受它,或者只是把“y”传递给输入流,就像这样(如果有两个协议):
echo -ne "y\ny" | ./tools/bin/sdkmanager --install 'system-images;android-29;default;x86_64'
当然,为了方便起见,您可以导出诸如ANDROID_HOME或ANDROID_SDK_ROOT这样的变量(包括在~/中执行)。profile或~/.bash_profile)或修补PATH变量-所有这些都由您自行决定。
脚本的例子:
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'
要求:
卷曲(或wget)并解压缩
故障排除:
如果你看到警告:无法创建设置,你需要在ANDROID_HOME中的cmdline-tools目录中有工具目录(如果需要创建它,使用这个确切的名称)见Android命令行工具sdkmanager总是显示:警告:无法创建设置
大多数答案似乎忽略了这样一个事实,即您可能需要在没有超级用户权限的无头环境中运行更新,这意味着脚本必须自动回答所有y/n许可提示。
下面是一个例子。
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在一些linux发行版上默认是不可用的,我没有办法将它作为我的CI脚本的一部分安装,所以必须使用最通用的解决方案,没有什么比简单的bash脚本更通用的了,对吗?
事实上,我在博客上写过(NSBogan),如果你感兴趣,可以在这里查看更多细节。