
# 批量安装应用至云手机
在一台云手机内安装APP后，可以通过调用接口的方式将此APP共享安装至多台云手机，省去重复安装的时间。
![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/note_3.0-zh-cn.png)
假设这台安装了APP的云手机为种子云手机。
#### 约束与限制
- 该方案仅适用于**非** qemu规格的云手机，即实例规格名称中**不包含** "qemu"字样。
  图1实例规格   
  ![](https://support.huaweicloud.com/bestpractice-cph/zh-cn_image_0000001912826654.png "点击放大") 
- 存储1.0和存储2.0服务器可通过控制台的服务器详情页面查看区分。
  图2服务器详情   
  ![](https://support.huaweicloud.com/bestpractice-cph/zh-cn_image_0000002140990797.png "点击放大") 
- 种子云手机必须为一台未进行过任何操作的云手机。如果云手机上存在历史操作，请[重置云手机](https://support.huaweicloud.com/usermanual-cph/cph_ug_0008.html)。
 
#### 操作步骤
1. 登录[OBS控制台](https://console.huaweicloud.com/obs/?#/obs/manager/buckets)，参考"[批量控制](https://support.huaweicloud.com/usermanual-cph/cph_ug_0003.html#section1)"创建一个用来存放文件的OBS桶，并授权CPH服务操作OBS桶权限。
   注意：为了成功上传文件到桶，请确保已授权CPH对应桶的读写权限。
   
2. 使用ADB方式连接种子云手机，并为其安装需要的APP。 详细指导请参考"[如何在单台云手机中安装APP？](https://support.huaweicloud.com/cph_faq/cph_faq_0013.html)"。
   
3. 通过调用接口的方式，导出种子云手机数据并打包上传至步骤[1]中的OBS桶。
   curl命令如下：
   ```
   curl -i -k -X POST "https://${CPH Endpoint}/v1/${projectId}/cloud-phone/phones/batch-storage" -H "Content-Type: application/json" -H "X-Auth-Token: $token" -d '
   {
       "storage_infos": [
           {
               "phone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
               "include_files": [
                   "/data/app/${package-name}-1",
                   "/data/data/${package-name}",
                   "/data/media/0/Android/data/${package-name}"
               ],
               "bucket_name": "${bucket_name}",
               "object_path": "${your_dir}/${package-name}.tar"
           }
       ]
   }'
   ```
   其中，
   - phone_id为种子云手机的ID。
   
   - bucket_name为导出数据所存储的OBS桶名。
   
   - object_path为导出数据所存储的OBS路径。
   
   
   ![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/caution_3.0-zh-cn.png)
   如果想全量打包云手机APP数据，必须要包含以下3个路径：
   - /data/app/${package-name}-1 其中${package-name}后面可能接的不是-1，需要根据云手机中的实际情况填写。
     
   
   - /data/data/${package-name}
   
   - /data/media/0/Android/data/${package-name}
    
   示例：
   ```
   curl -i -k -X POST "https://${CPH Endpoint}/v1/${projectId}/cloud-phone/phones/batch-storage" -H "Content-Type: application/json" -H "X-Auth-Token: $token" -d '
   {
       "storage_infos": [
           {
               "phone_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
               "include_files": [
                   "/data/app/com.taptap-1",
                   "/data/data/com.taptap",
                   "/data/media/0/Android/data/com.taptap"
               ],
               "bucket_name": "your-bucket-name",
               "object_path": "your/dir/taptap.tar"
           }
       ]
   }'
   ```
   
4. 进入步骤[1]中的OBS桶，在"对象"中查看并确认步骤[3]中打包上传的文件是否已全部上传成功。确认成功后执行下一步。
5. 此步骤需区分"存储1.0"和"存储2.0"服务器。
   - 存储2.0服务器（推荐） 通过调用接口的方式，将OBS桶内的文件推送至服务器。
     curl命令示例如下：
     ```
     curl -i -k -X POST "https://${CPH Endpoint}/v1/${projectId}/cloud-phone/phones/share-apps" -H "Content-Type: application/json" -H "X-Auth-Token: $token" -d '
     {
         "package_name": "com.miniteck.miniworld",
         "pre_install_app": 0, 
         "bucket_name": "your-bucket-name", 
         "object_path": "your/dir/miniworld.tar",
         "server_ids": ["1678567b8bab40f93711234cb8","1234567b8bab40ffb711234cb"]
     }'
     ```
     其中，
     - bucket_name、object_path分别对应步骤[3]中的内容。
     
     - pre_install_app为是否预装应用，非必选参数，默认不预装。0代表不预装，1代表预装。非预装应用需要手动安装，预装应用重置云手机会自动安装。
     
     - server_ids为接受文件推送的服务器ID列表。指定多个服务器ID，可以实现多台服务器上的云手机均安装APP的诉求。
     
     
     ![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/note_3.0-zh-cn.png)
     该接口的更多说明，请参考"[推送共享应用](https://support.huaweicloud.com/api-cph/cph_api_0546.html)"。
     
   
   
   
   - 存储1.0服务器 通过调用接口的方式，将OBS桶内的文件推送至服务器的共享存储目录。
     curl命令示例如下：
     ```
     curl -i -k -X POST "https://${CPH Endpoint}/v1/${projectId}/cloud-phone/phones/share-files" -H "Content-Type: application/json" -H "X-Auth-Token: $token" -d '
     {
         "bucket_name": "your-bucket-name", 
         "object_path": "your/dir/taptap.tar",
         "server_ids": ["1678567b8bab40f93711234cb8","1234567b8bab40ffb711234cb"]
     }'
     ```
     其中，
     - bucket_name、object_path分别对应步骤[3]中的内容。
     
     - server_ids为接受文件推送的服务器ID列表。指定多个服务器ID，可以实现多台服务器上的云手机均安装APP的诉求。
     
     
     ![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/note_3.0-zh-cn.png)
     该接口的更多说明，请参考"[推送共享存储文件](https://support.huaweicloud.com/api-cph/cph_api_0534.html)"。
     
    

6. 此步骤需区分"存储1.0"和"存储2.0"服务器
   - 存储2.0的服务器（推荐） 应用推送时为预装应用，批量重置对应的云手机，应用即可安装。非预装应用，在云手机中执行安装应用命令：appctrl install package_name，其中的包名对应[第五步]中的package_name，例如：com.miniteck.miniworld。
     ![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/caution_3.0-zh-cn.png)
     应用推送时为预装应用，应用卸载后，重置云手机应用会再次安装。
     
   
   
   
   - 存储1.0的服务器
     进入云手机控制台，单击已接受文件推送的服务器名称，在"实例管理"中，勾选所有需要安装以上APP的云手机实例，单击"重置"。
     ![](https://support.huaweicloud.com/bestpractice-cph/public_sys-resources/caution_3.0-zh-cn.png)
     此步骤为重置，并非重启。
     
    
 
#### 执行结果
存储1.0的机器在重置手机成功后均已安装APP；存储2.0的机器无需重置，后续需要时直接调用 appctrl start package_name来启动应用。
