2015-05-18 5 views
11

Sto cercando di creare un'immagine di finestra mobile che possa essere utilizzata per creare progetti Android, utilizzando Shippable.Gli strumenti di Android SDK installati in Docker non funzionano

Il problema è il comando android update sdk, che dà il seguente errore:

Installing Android SDK Tools, revision 24.2 
    Failed to rename directory /opt/android-sdk-linux/tools to /opt/android-sdk-linux/temp/ToolPackage.old01. 
    Failed to create directory /opt/android-sdk-linux/tools 

ho trovato un po 'di una soluzione qui: https://stackoverflow.com/a/8839359/867099 ma è per Windows, e non sembra per risolvere il problema su Linux. Sembra che durante il comando update, la directory corrente sia in uso e quindi non può essere rinominata.

mia soluzione sofar, utilizzando tale workaroundsuggestion, è questa:

RUN cp -r /opt/android-sdk-linux/tools /opt/android-sdk-linux/tools_copy 

RUN cd /opt/android-sdk-linux/tools && echo 'y' | /opt/android-sdk-linux/tools_copy/android update sdk --no-ui -a --filter tools,platform-tools,build-tools-22.0.1,android-21,extra-android-support,extra-google-google_play_services --force 

Per accettare automaticamente la licenza, ho echo 'y' al comando di Android.

Ma penso che il comando android debba anche essere eseguito nella directory corretta, motivo per cui I cd in esso prima.

Tuttavia, non riesce ancora. Sono piuttosto stordito su come risolvere questo problema, quindi ogni aiuto è apprezzato.

------ AGGIORNAMENTO --------

faccio funzionare l'ordine android sdk update senza il filtro tools, e alla fine, il mio Gradle generazioni sono riuscito. Quindi non so con certezza se è un problema non aggiornarli ...

+1

"Sembra che durante il comando di aggiornamento, la directory corrente è in uso e quindi non può essere rinominato" - prova 'adb kill-server' prima di eseguire il comando' android update sdk'. O vedere se ci sono altri processi in esecuzione che potrebbero fare riferimento a questa directory. – CommonsWare

+0

Penso che sia effettivamente '' '' adb'''' che accede alla directory, ma viene avviato quando eseguo il comando update. Quindi non sembra possibile ucciderlo in tempo. – xorgate

+0

Può essere correlato al driver di archiviazione in base a questo https://github.com/travis-ci/travis-ci/issues/2848 – shbi

risposta

0

Questo è ciò che è attualmente funzionante per me, è possibile vedere il comando di aggiornamento eseguito correttamente sotto. Nel mio ambiente si tratta di 3 diverse immagini di finestra mobile in una gerarchia FROM, pertanto è possibile combinare molto il numero apt-get se non è il tuo caso.

FROM ubuntu:14.04 

# Set debconf to run non-interactively 
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections 

# Install base dependencies 
RUN apt-get update && apt-get install -y -q --no-install-recommends \ 
     apt-transport-https \ 
     build-essential \ 
     ca-certificates \ 
     curl \ 
     git \ 
     libssl-dev \ 
     python \ 
     rsync \ 
     software-properties-common \ 
     wget \ 
    && rm -rf /var/lib/apt/lists/* 

# Install the JDK 
RUN echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \ 
    echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && \ 
    add-apt-repository -y ppa:webupd8team/java && \ 
    apt-get update -qq && \ 
    DEBIAN_FRONTEND=noninteractive apt-get install -qqy --force-yes oracle-java7-installer && \ 
    rm -rf /var/lib/apt/lists/* /var/cache/oracle-jdk7-installer 

# Install Android Dev Tools 
RUN apt-get update && apt-get install -y -q --no-install-recommends \ 
     lib32ncurses5 \ 
     lib32stdc++6 \ 
     lib32z1 \ 
     libswt-gtk-3-java \ 
     unzip \ 
    && rm -rf /var/lib/apt/lists/* 

RUN wget -qO- "http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz" | tar -zxv -C /opt/ 

RUN cd /opt/android-sdk-linux/tools/ && \ 
    echo y | ./android update sdk --all --filter platform-tools,build-tools-20.0.0,android-17,sysimg-17,system-image,extra-android-support --no-ui --force 

ENV PATH /opt/android-sdk-linux/build-tools/20.0.0:$PATH 
+3

il tuo comando' ./android update sdk' non sta aggiornando il pacchetto "Android SDK Tools" (opzione 'tools' per' --filter') che l'OP sta avendo problemi nell'installazione. –

+0

Perché stai usando il flag '--force'? –

9

Questo può essere risolto combinando tutti i comandi SDK Android al comando di un singolo Dockerfile RUN. Ha qualcosa a che fare con il file system di Docker.

Per una spiegazione dettagliata da a post su Issue Tracker per Android Open Source Project:

The problem is caused when you run the SDK update in a Docker container. Docker uses a special filesystem which works like a version control system (e.g. git) and records all changes made to the filesystem. The problem is that the SDK update uses a hardlink move operation to move the 'tools' directory, which is not supported by the underlying Docker filesystem.

The solution for this is to simply run all Android SDK commands in a single 'RUN' command in Docker. That way, the hardlink move works as normal, as long as you don't use the 'hardlink move' operation between multiple RUN command (snapshots). The advantage of this is also that your Docker layers will be smaller (compared to running multiple seperate RUN commands).

Here is the line from the Dockerfile:

RUN wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz && \ 
    tar xzf android-sdk_r24.4.1-linux.tgz && \ 
    rm android-sdk_r24.4.1-linux.tgz && \ 
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter platform-tools,tools -a) && \ 
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository -a) && \ 
    (echo y | android-sdk-linux/tools/android -s update sdk --no-ui --filter build-tools-23.0.2,android-24 -a) 
+0

Perché ** build-tools-23.0.2 ** e non ** 25.0.0 **? –

+1

@IgorGanapolsky 25.0.0 non era disponibile in quel momento. https://developer.android.com/studio/releases/build-tools.html –

+0

Beh, non direi che non ha nulla a che fare con Docker se "l'aggiornamento SDK utilizza un'operazione di spostamento hardlink per spostare la directory 'tools', che non è supportata dal filesystem Docker sottostante." –