---
# System prepended metadata

title: AVD Manager
tags: [Android 工具]

---

---
title: 'AVD Manager'
disqus: kyleAlien
---

AVD Manager
===

## OverView of Content
由於創建虛擬機需要 SDK 的配置，所以請先參考 [**SDK Manager**](https://hackmd.io/vADr7C_8SiKbgTvRAxG4KA?view)

在啟動則是使用 [**emulator**](https://hackmd.io/PDkynNEaRJiS9A8nHEy6MQ?view) 的指令 

[TOC]

## 概述
1. AVD 全名為 **Android Virtual Device**，也就是虛擬機（模擬器），它的指令存放在 <SDK\>/tools/bin 資料夾下面，之後將這個路經加入到 .bashrc 中（環境變量）
2. 啟動會用到 emulator 指令，它的指令存放在 <SDK\>/emulator/emulator 資料夾下
	
	> ![](https://i.imgur.com/iLfS8Tu.png)

    查看如何使用，可以看到主要分為幾個大類，**^1^ `list`、^2^ `create`、^3^ `move`、^4^ `delect`**
    ```shell=
    avdmanager -h
    ```
    > ![](https://i.imgur.com/vsv1liV.png)


## 常用指令

### AVD 虛擬機列表 - list

* AVD 基本使用

  | 指令 | 功能 |
  | -------- | -------- |
  | list | 存在的目標 or 虛擬機 (全部列出) |
  | list avd | 存在的 android 虛擬機 |
  | list target | 存在的目標 |
  | list device | 可創建的虛擬機 |

    1. list avd

        ```shell=
        # 存在的 android 虛擬機
        avdmanager list avd
        ```
        > ![](https://i.imgur.com/0wsfdfb.png)

    2. list target：**會依照當前的 SDK platforms 顯示可創建的目標**（）
        
        ```shell=
        # 存在的目標
        avdmanager list target
        ```
        > ![](https://i.imgur.com/wfBRO9D.png)


### 創建 AVD - create

```shell=
# 查看 help 可以看到它的指令格式
avdmanager [global options] create avd [action options]
```

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

* 下面來說幾個較常使用到的 options，Goal 指令就自己參考囉

  | Options | 功能 |
  | -------- | -------- |
  | -n --name | **必須**，Device 的成稱，當你啟動 avd 時會使用到 |
  | -a --snapshot | 將快照文件放在AVD中以啟用持久性 |
  | -c --sdcard | sdcard 大小，單位 **B（字節），KB（千字節），MB（兆字節），GB（千兆字節）或者TB（太字節** |
  | -p --path | 創建 AVD 的位置 |
  | -f --force | 強制創建，可以覆蓋同名的 Avd 裝置 |
  | -b --abi | ABI 就是跟每個不同的 CPU 溝通的語言，有 x86, x86_64, armeabi-v7a, arm64-v8a... |
  | -d --device | 裝置的 id |
  | -k --package | **system image for avd，需要透過 sdkmanager 下載**，eg. 'system-images;android-19;google_apis;x86'  |

    1. 透過 sdkmanager 查看當前有的 android 印象檔案 (images)
        
        ```shell=
        # 查看所有可用 ＆ 已安裝列表
        sdkmanager --list
        ```
        > ![](https://i.imgur.com/TWKCgzb.png)

    2. 使用參數創建
        
        ```shell=
        # 創建
        avdmanager create avd -c 125M -n 'Arm64' -b arm64-v8a -d 8 -k 'system-images;android-24;google_apis;arm64-v8a'
        ```
        :::info
        * 使用的 cpu 架構，需要查看自己 cpu 的架構
            ```shell=
            # 目前用的是 ubuntu 系統
            uname -p
            ```
            要依照當前裝置的 cpu 下載相對應的 system-image
            > ![](https://i.imgur.com/F6zloxA.png)

        :::

    3. 查看創建後的裝置
       
        ```shell=
        # 查看 list
        avdmanager list avd
        ```
        > ![](https://i.imgur.com/ZfnTmNR.png)

* 簡單創建：我們可以使用 AVD 已經提供的模板＋指定 package 就可以創建
  1. 查看所有可創建的模板
    ```shell=
    # 查看所有可創建的模板
    avdmanager list
    ```
    > ![](https://i.imgur.com/ryqj8Qt.png)

  2. 下載指定 images
    ```shell=
    # 過濾 images 檔案 && 指定 cpu 指令集
    sdkmanager --list | grep images | grep x86_64
    
    sdkmanager --install 'system-images;android-29;default;x86_64'
    ```
    > ![](https://i.imgur.com/5R2aU7j.png)

  3. 指定 name (-n)、package (-k) 創建模擬器
    ```shell=
    avdmanager create avd --name 'myPhone' -k 'system-images;android-29;default;x86_64'
    ```
  4. 查看 avd 創建結果
    ```shell=
    avdmanager list avd
    ```
    > ![](https://i.imgur.com/QaxU2xX.png)

  
### 重新命名 - move

```shell=
# 指令格式
avdmanager [global options] move avd [action options]
```

| Options | 功能 |
| -------- | -------- |
| -n --name | **必須**，用來指定需要改變的 avd 裝置 |
| -p --path | 改變裝置路徑 |
| -r --rename | 重新命名 |

```shell=
# 改變名稱
vdmanager move avd -n test3 -r ARMv7a-1
```

### 移除 - delete

* 刪除：若要刪除 avd 也可以使用指令刪除，刪除時必須指定 avd 名稱

  ```shell=
  # 指令格式
  avdmanager [global options] delete avd [action options]
  ```

  | Options | 功能 |
  | -------- | -------- |
  | -n --name | **必須**，用來指定需要改變的 avd 裝置 |



  ```shell=
  # 查看當前所有的虛擬機
  avdmanager list avd

  # 刪除指定名稱 avd, -n 使用名稱指定
  # 刪除 test2 虛擬機
  avdmanager delete avd -n test2
  ```

## avd 數據目錄

AVD數據目錄（也稱為內容目錄）特定於單獨的AVD實例，包含AVD的所有可修改數據。

默認位置如下，其中名稱是AVD名稱：

* Mac OS X 和 Linux - ~/.android/avd/name.avd/
* Microsoft Windows XP - C:\Documents and Settings\user\.android\name.avd\
* Windows Vista 及更高版本 - C:\Users\user\.android\name.avd\

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

### 啟動 
* 必須使用到 emulator 指令，該指令在 <SDK\>/emulator/emulator/ 資料夾下

* 運行 AVD：必須透過 emulator 指令來運行，使用 -avd or @
  ```shell=
  #1. 方法一，test 是我們上面創建的 AVD 環境
  emulator -avd test4

  #2. 方法二，使用 @ 符號 （功能同上）
  emulator @test4

  ```
  :::success
  上面兩種方式都會佔用終端機，但只要在指令的最後加上 `&` 就不會佔用到終端機
  > emulator -avd test4 &
  :::

## 異常

### Avdmanager - NoClassDefFoundError

* Avdmanager 在執行時若發生 NoClassDefFoundError 錯誤，那請先移除當前的 openjdk 版本，並安裝支援的 jdk 版本 ([**參考**](https://askubuntu.com/questions/1025743/avdmanager-throws-exception-when-trying-to-run-it-from-bash))
	```shell=
	#Remove all previous JDK version :

	sudo apt-get autoremove openjdk*

	#Then install JDK 8 :

	sudo apt-get install openjdk-8-jdk
	```
	> ![](https://i.imgur.com/S2OIP8r.png)

* 修正後就可以正常執行 avdmanager 指令
	> ![](https://i.imgur.com/5Zv4eHS.png)




## Appendix & FAQ

:::info
:::

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