Android 7.1 - Build on Docker Container

A vantagem de se usar um container do docker para realizar o build é na minha opinião que temos sempre um ambiente configurado e encapsulado em uma imagem para usarmos a hora que desejarmos, mesmo que outras versões forem lançadas.

Como não fazemos persistência, teremos esse ambiente sempre operacional para realizar as tarefas de build em versões anteriores caso seja necessário em algum momento.

Se caso você é novo em docker, recomendo que acesse o site https://mundodocker.com.br e conheça mais sobre.

Para que você construa sua imagem para o Android 7.1 (Nogaut) na API 25, se certifique que já esteja com o docker-machine instalado e em operação em seu MAC/Linux:

Dockerfile

É onde toda a mágica acontece em uma automação com docker, podemos comparar a todos os comandos que executamos manualmente na instalação e configuração desse ambiente.

Se preferir realizar o download dos arquivos, faça o clone do Gist abaixo:
1
$ git clone https://gist.github.com/andrebassi/8b07b5501347215e755a3bbee6466866 build
Ou então crie um arquivo denominado Dockerfile e coloque as instruções abaixo e siga os passos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
FROM ubuntu:14.04
MAINTAINER André Bassi "andrebassi@gmail.com"
# Sets language to UTF8 : this works in pretty much all cases
ENV LANG en_US.UTF-8
RUN locale-gen $LANG
ENV DOCKER_ANDROID_LANG en_US
ENV DOCKER_ANDROID_DISPLAY_NAME mobileci-docker
# Never ask for confirmations
ENV DEBIAN_FRONTEND noninteractive
# Updating & Installing packages
RUN apt-get update \
&& apt-get dist-upgrade -y \
&& apt-get install -y \
autoconf \
build-essential \
bzip2 \
curl \
gcc \
git \
groff \
lib32stdc++6 \
lib32z1 \
lib32z1-dev \
lib32ncurses5 \
lib32bz2-1.0 \
libc6-dev \
libgmp-dev \
libmpc-dev \
libmpfr-dev \
libxslt-dev \
libxml2-dev \
m4 \
make \
ncurses-dev \
ocaml \
openssh-client \
pkg-config \
python-software-properties \
rsync \
software-properties-common \
unzip \
wget \
zip \
zlib1g-dev \
--no-install-recommends \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Java
RUN apt-add-repository ppa:openjdk-r/ppa \
&& apt-get update \
&& apt-get -y install openjdk-8-jdk \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Environment variables
ENV ANDROID_HOME /usr/local/android-sdk
ENV ANDROID_SDK_HOME $ANDROID_HOME
ENV ANDROID_NDK_HOME /usr/local/android-ndk
ENV JENKINS_HOME $HOME
ENV PATH ${INFER_HOME}/bin:${PATH}
ENV PATH $PATH:$ANDROID_SDK_HOME/tools
ENV PATH $PATH:$ANDROID_SDK_HOME/platform-tools
ENV PATH $PATH:$ANDROID_SDK_HOME/build-tools/23.0.2
ENV PATH $PATH:$ANDROID_SDK_HOME/build-tools/24.0.0
ENV PATH $PATH:$ANDROID_NDK_HOME
# Export JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
# Add build user account, values are set to default below
ENV RUN_USER mobileci
ENV RUN_UID 5089
RUN id $RUN_USER || adduser --uid "$RUN_UID" \
--gecos 'Build User' \
--shell '/bin/sh' \
--disabled-login \
--disabled-password "$RUN_USER"
# Install Android SDK
RUN wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz \
&& tar -xvzf android-sdk_r24.4.1-linux.tgz \
&& mv android-sdk-linux /usr/local/android-sdk \
&& chown -R $RUN_USER:$RUN_USER $ANDROID_HOME \
&& chmod -R a+rx $ANDROID_HOME \
&& rm android-sdk_r24.4.1-linux.tgz
ENV ANDROID_COMPONENTS platform-tools,android-25,build-tools-25.0.3,extra-android-m2repository,extra-google-m2repository
# Install Android tools
RUN echo y | /usr/local/android-sdk/tools/android update sdk --filter "${ANDROID_COMPONENTS}" --no-ui -a \
&& chown -R $RUN_USER:$RUN_USER $ANDROID_HOME \
&& chmod -R a+rx $ANDROID_HOME
# Install Android NDK
RUN wget http://dl.google.com/android/repository/android-ndk-r12-linux-x86_64.zip \
&& unzip android-ndk-r12-linux-x86_64.zip \
&& mv android-ndk-r12 /usr/local/android-ndk \
&& chown -R $RUN_USER:$RUN_USER $ANDROID_NDK_HOME \
&& chmod -R a+rx $ANDROID_NDK_HOME \
&& rm android-ndk-r12-linux-x86_64.zip
# Support Gradle
ENV TERM dumb
ENV JAVA_OPTS "-Xms4096m -Xmx4096m"
ENV GRADLE_OPTS "-XX:+UseG1GC -XX:MaxGCPauseMillis=1000"
# Creating project directories prepared for build when running
# `docker run`
ENV PROJECT /project
RUN mkdir $PROJECT
RUN chown -R $RUN_USER:$RUN_USER $PROJECT
WORKDIR $PROJECT
USER $RUN_USER
RUN echo "sdk.dir=$ANDROID_HOME" > local.properties

Configurando a docker-machine :

1
$ docker-machine create -d virtualbox --virtualbox-disk-size "200000" --virtualbox-memory 4096 --virtualbox-hostonly-cidr "192.168.90.1/24" default

Construindo a imagem:

1
2
3
$ eval "$(docker-machine env default)"
$ docker build -t ab/android-build-environment .

Realizando o Build:

Simplesmente devemos estar no diretório onde se encontra os sources de seu projeto compatível com o Nogoaut - API 25 e executar o build através de um container que será processado em execução interativa.

Faça as seguintes instruções:

1
2
3
4
$ cd /path/do/projeto
$ docker run -i -u 0 -v $PWD:/project -t ab/android-build-environment /bin/bash ./gradlew assembleRelease

Jenkins:

Tanto em um JOB ou um Pipeline, temos a necessidade de injetar as variáveis de ambiente, com isso podemos utilizar um plug-in de sua escolha para a injeção e o bom funcionamento do build.

Variáveis de Ambiente:

1
2
3
4
5
6
# system config
DOCKER_MACHINE_IP=192.168.90.100
DOCKER_TLS_VERIFY=1
DOCKER_HOST=tcp://192.168.90.100:2376
DOCKER_CERT_PATH=/Users/andrebassi/.docker/machine/machines/default
DOCKER_MACHINE_NAME=default

Lembrando que o ip 192.168.90.100 é do meu docker-machine, criada anteriormente.

Para você encontrar essa informação execute:

1
$ docker-machine ip

Shell Script - JOB:

Na preferência na execução de um JOB FreeStyle, você pode configurar as variáveis de ambiente e em seguida executar o seu build conforme descrito:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash -x
set -e
# system config
export DOCKER_MACHINE_IP=192.168.90.100
export DOCKER_TLS_VERIFY=1
DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://$DOCKER_MACHINE_IP:2376
DOCKER_HOST=tcp://$DOCKER_MACHINE_IP:2376
export DOCKER_CERT_PATH=/Users/$(whoami)/.docker/machine/machines/default
DOCKER_CERT_PATH=/Users/$(whoami)/.docker/machine/machines/default
export DOCKER_MACHINE_NAME=default
DOCKER_MACHINE_NAME=default
# Execute gradle in docker
/usr/local/bin/docker run -u 0 -v $PWD:/project ab/android-build-environment /bin/bash gradlew assembleRelease

Jenkinsfile - Pipeline:

1
2
3
4
5
6
7
8
9
node('node-mac'){
stage('checkout') {
git url: "git@10.243.126.164:android/NetEmpresa.git", branch: 'develop'
}
stage('build') {
sh "/usr/local/bin/docker run -u 0 -v ${WORKSPACE}:/project ab/android-build-environment /bin/bash gradlew assembleRelease"
}
}

Lembrando que esse post é exclusivamente criado para realizar build para o Android 7.1 na API 25 com sua documentação disponível em https://developer.android.com/about/versions/nougat/android-7.1.html.

Mas você pode customizar e adaptar para outras versões de acordo com sua necessidades.

O dia-a-dia com o GIT

GIT é um sistema que registra as mudanças feitas em um arquivo ou um conjunto de arquivos ao longo do tempo de forma que você possa recuperar versões específicas e trabalhar em equipe de forma distríbuida com qualquer tipo de arquivo.

No ambiente corporativo o ideal é o uso do Git-Flow que se trata de um conjunto de ferramentas para te auxiliar no ciclo do seu trabalho e na entrega, conforme demonstra na imagem abaixo:

Alguns links para Referências:

Carro: Tesla em ação

Para quem tem curiosidade em ver como seria um trajeto de casa ao trabalho com um tela, assista o vídeo.

Como postado anteriormente, o Tesla tem um sistema de piloto automático, mais que não precise de um motorista, você tem que estar no carro para asssumir o controle em uma eventualidade.

Veja no vídeo abaixo como funciona o AutoPilot o “Full Self-Driving Hardware” da Tesla.

Para saber mais do sistema acesse o link:
https://www.tesla.com/autopilot