---
# System prepended metadata

title: SDK Manager
tags: [Android 工具]

---

---
title: 'SDK Manager'
disqus: kyleAlien
---

SDK Manager
===

## OverView of Content

[**SDK Manager 官方介紹**](https://developer.android.com/studio/command-line/sdkmanager)

若對指令有問題則使用 sdkmanager --help 就可以查看其他指令 & 格式，底下會先說幾個常使用的指令

[TOC]

## sdkmanager 概述
sdkmanager工具在 Android SDK 工具擴展（25.2.3及更高版本）中提供，並位於`<android_sdk>/tools/bin` 目錄下，若有需要可以把該連接放置到環境變數
> ![](https://i.imgur.com/gxZMtCK.png)

### 查看資訊 list

* 指令格式
  ```shell=
  sdkmanager --list [options] \
             [--channel=channel_id] // Channels: 0 (stable), 1 (beta), 2 (dev), or 3 (canary)
  ```
  :::success
  * **版本 channel 分類**
  
      1. **Canary**(金絲雀)：Bleeding Edge(一種最新、但並非完美的技術)，大約週更，這是最早被發布的預覽版本，建議在安裝 Canary 版本時同時安裝一個 Stable or Beta 版本
      
      2. **Dev**(開發版)： 跟 Canary 的差異主要是有經過 **完整的測試**
      
      3. **Beta**(Beta版)： 基於穩定版的 Canary 版本，
      
      4. **Stable**(穩定版)： Android Developer 網站上獲得的穩定版本
  :::

  ```shell=
  # 列出所有 sdk 列表
  sdkmanager --list
  ```
  > ![](https://i.imgur.com/A00hTvw.png)


:::info
* 若需要列出全部的穩定版(Stable) 請使用 `--channel=0` 或是 `完全移除 --channel` 指令
:::

:::warning
* JDK 版本造成的異常
    
    這個錯誤是由於Java 9及更高版本中的模塊化系統所引起的，該系統導致某些類和庫在默認情況下無法訪問
    
    ```shell=
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
        at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>
    ```
    
    1. 下載 JDK90 以下的版本，並切換預設版本為 JDK 使用

        ```shell=
        # 下載 JDK 8
        sudo apt install openjdk-8-jdk

        # 並切換預設為 JDK 8
        sudo update-alternatives --config java
        ```
    
:::

### 透過 sdkmanager 下載 Packages

* 指令格式 (Package)
	```shell=
	sdkmanager --install packages [options]
	```
	**==packages 代表了路徑==**，這些路徑可以使用 `--list` 查看
	> Ex: build-tools;19.1.0


	> ![reference link](https://i.imgur.com/fuR3Di6.png)

    1. 安裝 `build-tools`
        ```shell=
        sdkmanager --install "build-tools;29.0.3"
        ```
        > ![](https://i.imgur.com/R46dfJw.png)

        去 SDK `build-tools` 就可以看到新下載的 29.0.3
        > ![](https://i.imgur.com/1itUqxM.png)

    2. 安裝 `NDK`
        ```shell=
        sdkmanager --install 'ndk;20.1.5948944' 
        ```
        > ![](https://i.imgur.com/VeSqozF.png)

    3. 安裝 `emulator` 
        ```shell=
        sdkmanager --install emulator
        ```
        > ![](https://i.imgur.com/ttUMGw7.png)

### 卸載 Package

* 指令格式
	```shell=
	sdkmanager --uninstall packages [options]
    
	sdkmanager --uninstall --package_file=package_file [options]
	```

    解除安裝 `build-tools;29.0.1`
	
    ```shell=
	sdkmanager --uninstall "build-tools;29.0.1"
	```
	> ![](https://i.imgur.com/FOMZdPH.png)

### 升級已安裝 Package

* 指令格式
  
  ```shell=
  sdkmanager --update [options]
  ```
  > ![](https://i.imgur.com/rxG1mJu.png)


### 其他設置 Options

* 上面有列出一對中括弧的 options，可以透過 `sdkmanager --help` 查找詳細用法

  | Options 指令 | 說明 |
  | -------- | -------- |
  | -\-sdk_root=<path\> | 安裝到指定的 SDK 路徑而不是包含此工具的 SDK (用 SDK 來位另外一個 SDK 安裝東西) |
  | -\-channel=<channel id\> | 如同上面在列 --list 相同，可以選擇 0(Stable), 1(Beta), 2(Dev), 3(Canary) 版本，**未設定則下載 stable** |
  | -\-include_obsolete | 包含過期的版本，**配合 --list、--update 使用** |
  | -\-no_https | 使用 http 下載 |
  | -\-verbose | 列出詳細內容 |
  | -\-proxy={http \\| socks} | 通過給定代理建立連結，用 http 指定一個高層級協議（如 HTTP 或 FTP）的代理，或用 socks 指定一個 SOCKS（V4 或 V5）代理 |
  | -\-proxy_host={IP_address \\| DNS_address} | 使用代理的 IP & DNS 地址 |
  | -\-proxy_port=<port_number\> | 要連結到的代理 Port 號 |

* 使用 verbose 列出下載細項

  ```shell=
  # 下載 build tools 26.0.0
  
  sdkmanager --install "build-tools;26.0.0" --verbose
  ```
  > ![](https://i.imgur.com/kugKFUn.png)

## Ubuntu - sdkmanager


### command 下載 Cmdline sdkmanager 
* 到 [**Android 官方網站**](https://developer.android.com/studio?gclid=Cj0KCQjwpImTBhCmARIsAKr58cywedJ3OJ5nwLWSkEDZCmWOxI5NECEO7IqZjM8HzoUphUSHQe-4znQaAgFQEALw_wcB&gclsrc=aw.ds) 下載最新版本的 Cmdline sdkmanager
  ```shell=
  # 下載官方提供的 SDKManager 包
  wget https://dl.google.com/android/repository/commandlinetools-linux-8092744_latest.zip
  
  # 解壓縮 zip 包
  unzip commandlinetools-linux-8092744_latest.zip
  ```
  
* 將 `sdkmanager/bin` 的路徑放置到所有人 (當然可以放到個人) 的環境變數中
    
    ```shell=
    sudo vim /etc/profile
    
    # -----------------------------------------------
    # /etc/profile
    export TOOLS_DIR=/home/alien/tools

    export PATH=$ANDROID_CMD:$NDK:$EMULATOR:$PATH
    
    # -----------------------------------------------
    source /etc/profile
    ```
    
:::warning
* `cmdline-tools : could not determine` SDK root 錯誤！無法抓取到 SDK 的根目錄，解決辦法是
    
    1. 在下載的好的 `cmdline-tools` 資料夾下創建 `lastest` 目錄
    
    2. 將所有的檔案移動至 `lastest 目錄下`

        > ![](https://i.imgur.com/zFZkMDO.png)

    3. 再次執行 sdkmanager 就可以使用了 :+1: 
:::

### 下載 NDK、Emulator

* 透過 sdkmanager --list 可以查看到當前發布的所有 sdk 檔案，其中就有包括 NDK、SDK、Emulator 等等
    
    1. 下載 NDK
        
        ```shell=
        sdkmanager --list | grep ndk

        sdkmanager --install 'ndk;24.0.8215888'
        ```

    2. 下載 Emulator
    
        ```shell=
        sdkmanager --install emulator
        ```

* 將下載好的工具目錄設定到 `/etc/profile` 中的 PATH，之後就可以讓所有使用者都使用到
    
    ```shell=
    export TOOLS_DIR=/home/alien/tools

    export ANDROID_CMD=$TOOLS_DIR/android/cmdline-tools/lastest/bin
    export NDK=$TOOLS_DIR/android/ndk/24.0.82.15888
    export EMULATOR=$TOOLS_DIR/android/emulator

    export PATH=$ANDROID_CMD:$NDK:$EMULATOR:$PATH
    ```

### 查看已下載 Packages

* 查看已下載 Packages `--list_installed`

    ```shell=
    sdkmanager --list_installed
    ```
    > ![](https://i.imgur.com/YUGoPqm.png)

## Appendix & FAQ

:::info
:::

###### tags: `Android 工具`
