Как проверить, установлен ли определенный компонент Android SDK или нет через командную строку

Данный:

  • Я установил Android SDK, доступный в PATH
  • Я установил некоторые компоненты по идентификатору (например, android-23, extra-android-support, sys-img-armeabi-v7a-android-19 и т. д.), используя команду android update sdk -u -a -t some-ids

Вопрос:

Как проверить с помощью командной строки, установлены ли эти компоненты или нет, на основе тех же идентификаторов, что и я их установил?

Бонус: это можно сделать без подключения к интернету


Я собираюсь использовать его в своем скрипте Ansible Playbook. Мне это нужно, чтобы избежать запуска команды установки, если они уже существуют для идемпотентности. Хотя android update sdk не будет устанавливать уже установленные элементы, он всегда заранее запрашивает удаленный репозиторий Android, что будет ненужным.


person akhy    schedule 29.01.2016    source источник


Ответы (1)


Я знаю, что это довольно старый вопрос, но я некоторое время сталкивался с той же проблемой и не мог найти ответ.

Поэтому я сделал это в своей роли ansible (здесь: "android_sdk"), используя местные факты.
Вам нужно выполнить следующие шаги:

  1. Соберите некоторую переменную из локальных фактов (например, в defaults/main.yml):

    android_sdk_installed: "{{ ansible_local.android_sdk.sdks_installed
                               if (ansible_local|d() and ansible_local.android_sdk|d() and
                                   ansible_local.android_sdk.sdks_installed|d([]))
                               else [] }}"
    
  2. Установите указанные SDK/инструменты сборки/и т. д.

    - name: Install Android SDKs for applicable releases
      shell: /bin/bash -l -c 'echo y | android -s update sdk -u -a -t "{{ item }}"'
      with_items:
        - "{{ android_sdk_tools }}"
      when: item not in android_sdk_installed
      register: sdk_install_res
    

    Где android_sdk_tools, например, имеет значение:

    android_sdk_tools:
      - "build-tools-23.0.2"
      - "build-tools-19.1.0"
    
  3. Измените локальную переменную android_sdk_installed (я знаю, что это довольно уродливо - это просто для фильтрации вывода с предыдущего шага для чистого представления)

    - name: Set local android_sdk_installed fact
      set_fact: android_sdk_installed="{{ android_sdk_installed|d([]) + [item.item|d()] }}"
      with_items: |
        {% set items=[] %}
        {% for item in sdk_install_res.results %}
        {% if item.item is defined %}{% if item.rc is defined %}
        {% if items.append({'item':item.item,'rc':item.rc}) %}{% endif %}
        {% endif %}{% endif %}
        {% endfor %}
        {{ items | to_nice_json }}
      when: sdk_install_res is defined and item.rc == 0
    
  4. Сохраните местные факты (это основано на коде из DebOps Ansible project)

    - name: Make sure that Ansible local facts directory is present
      file:
        path: '/etc/ansible/facts.d'
        state: 'directory'
        owner: 'root'
        group: 'root'
        mode: '0755'
    
    - name: Save android_sdk local facts
      template:
        src: 'etc/ansible/facts.d/android_sdk.fact.j2'
        dest: '/etc/ansible/facts.d/android_sdk.fact'
        owner: 'root'
        group: 'root'
        mode: '0644'
      register: android_sdk_register_local_facts
    
    - name: Gather facts if they were modified
      action: setup
      when: android_sdk_register_local_facts.changed
    

    Где содержимое файла шаблона «android_sdk.fact.j2»:

    {% set android_sdk_tpl_sdks_installed = [] %}
    {% if (ansible_local|d() and ansible_local.android_sdk|d() and
           ansible_local.android_sdk.sdks_installed|d()) %}
    {%   for element in ansible_local.android_sdk.sdks_installed %}
    {%     set _ = android_sdk_tpl_sdks_installed.append(element) %}
    {%   endfor %}
    {% endif %}
    {% for element in android_sdk_installed or [] %}
    {%       set _ = android_sdk_tpl_sdks_installed.append(element) %}
    {% endfor %}
    {
    "sdks_installed": {{ android_sdk_tpl_sdks_installed | unique | sort | to_nice_json }}
    }
    

Надеюсь, это поможет, ура! :)

person Soal    schedule 08.04.2016