Системы
автоматизированной сборки
Android
Александр Вайцеховский
Преимущества
Windows, Linux, MacOS
Зависимости
Автоматическое создание:
JavaDoc
Web-страниц проекта
Отчеты
Непрерывная интеграция
Автоматизация сборки
Автоматизированное тестирование
Сборка проектов на Java
1976
Make
2000
2004
2009
XML-сценарий build.xml*
Императивная настройка
Цели target
Могут зависеть друг от друга
Задачи task
ant, antcall,
mkdir, copy, delete, move, exec, get,
jar, java, javac, javadoc,
property, tstamp, style, cvs, echo
Не умеет управлять зависимостями** :(
* Может называться как угодно, по умолчанию ant будет искать build.xml
** Для зависимостей нужно использовать вместе с Apache Ivy
Пример build.xml
1 <project name="MyProject" default="run" basedir=".">
2 <description>Simple example build file</description>
3 <property name="src" location="src"/>
4 <property name="build" location="build"/>
5 <property name="dist" location="dist"/>
6 <property name="class" value="com.noveogroup.Main"/>
7
8 <target name="clean">
9 <delete dir="${build}"/>
10 <delete dir="${dist}"/>
11 </target>
12
13 <target name="init" depends="clean">
14 <tstamp/> <!-- Create the time stamp -->
15 <mkdir dir="${build}"/>
16 <mkdir dir="${build}/META-INF"/>
17 </target>
18
19 <target name="compile" depends="init">
20 <javac srcdir="${src}" destdir="${build}"/>
21 <manifest file="${build}/META-INF/MANIFEST.MF">
22 <attribute name="Main-Class" value="${class}"/>
23 </manifest>
Фреймворк
Сценарий сборки pom.xml*
Декларативная настройка
Стандартная структура директорий
Жизненный цикл:   clean, compile, test, package, install, deploy
Плагины
*Похож на XML
Maven-репозиторий
Управление зависимостями
Maven: Pom.xml
1 <project>
2 <modelVersion>4.0.0</modelVersion>
3
4 <groupId>com.noveogroup.example</groupId>
5 <artifactId>maven</artifactId>
6 <version>1.0</version>
7
8 <dependencies>
9 <dependency>
10 <groupId>com.noveogroup.example</groupId>
11 <artifactId>library</artifactId>
12 <version>3.0.1</version>
13 </dependency>
14 <dependency>
15 <groupId>junit</groupId>
16 <artifactId>junit</artifactId>
17 </dependency>
18 </dependencies>
19 </project>
Maven: минимальная конфигурация
версия конфигурационного файла
координаты проекта:
artifactId: имя проекта
groupId: автор проекта
version: версия проекта
"groupId:artifcatId:version"
Любую зависимость можно указать через эту тройку  
Супер Pom обеспечивает конфигурацию модулей по умолчанию
Maven: структура проекта
Это DSL - Domain Speci c Language (ура, не XML)
Основан на Groovy
Статическая и динамическая типизация
Замыкания
Перегрузка операций
Улучшенный синтаксис Java
Интеграция с Maven-репозиторием
Стандартная структура директорий
Плагины для сборки проекта, настраеваемые декларативно
Направленный ациклический граф задач
Встроенная поддержка задач Apache Ant
Императивное описание задачи
Gradle Daemon, Wrapper
Gradle: плагины
1 //эмуляция жизненного цикла maven
2 apply plugin: 'java'
3
4 //запуск java-приложения
5 apply plugin: 'application'
6
7 //сборка android-приложения  
8 apply plugin: 'com.android.application'
Gradle: Структура директорий
Gradle: Структура директорий
Build Script
allprojects {}
настройки для всех проектов (подхватываются каждым модулем)
buildscript {}
настройка build-скрипта Gradle
repositories {}
откуда нужно качать зависимости
чтобы не указывать в каждом модуле - выносим в корень
dependencies {}
какие зависимости нужны
О репозиториях
Maven Central
jCenter
Можно поднимать свои серваки с репозиториями
./build.gradle
1 buildscript {
2 repositories {
3 jcenter()
4 }
5 dependencies {
6 /* Плагин для сборки регистрируется как зависимость:
7 com.android.tools.build - группа
8 gradle - идентификатор
9 2.1.2 - версия */
10 classpath 'com.android.tools.build:gradle:2.1.2'
11 }
12 }
13
14 allprojects {
15 repositories {
16 jcenter()
17 }
18 }
./settings.gradle
1 include ':app', ':super-library', 'one-more-module'
./application/build.gradle
1 apply plugin: 'com.android.application'
2
3 android {
4 compileSdkVersion 23
5 buildToolsVersion "23.0.3"
6
7 defaultConfig {
8 applicationId "com.noveogroup.example.android"
9 minSdkVersion 16
10 targetSdkVersion 23
11 versionCode 1
12 versionName "1.0"
13 }
14 }
15
16 dependencies {
17 compile fileTree(dir: 'libs', include: ['*.jar'])
18 compile 'com.android.support:support-v4:23.4.0'
19 compile 'com.android.support:appcompat-v7:23.4.0'
20 }
./application/build.gradle
apply - применяет к проекту плагин. Плагин добавляет задачи
android - содержит настройки для плагина com.android.application
compileSdkVersion
buildToolsVersion - утилита для сброки apk
defaultCon g - параметры Android-проекта
dependencies - список зависимостей модуля
./library/build.gradle
1 apply plugin: 'com.android.library'
2
3 android {
4 compileSdkVersion 23
5 buildToolsVersion "23.0.3"
6
7 defaultConfig {
8 applicationId "com.noveogroup.example.library"
9 minSdkVersion 16
10 targetSdkVersion 23
11 versionCode 1
12 versionName "1.0"
13 }
14 }
15
16 dependencies {
17 compile fileTree(dir: 'libs', include: ['*.jar'])
18 }
Зависимости gradle
1 dependencies {
2 //от другого модуля
3 compile project(':mylibrary')
4 //от библиотеки из репозитория
5 compile 'com.android.support:appcompat-v7:23.4.0'
6 //от локальных библиотек
7 compile fileTree(dir: 'libs', include: ['*.jar'])
8 }
* Gradle зависимости можно подключать так же как в maven:
compile 'groupId : artifactId : version'
Варианты сборки
Build Type
различные способы сборки/компиляции проекта
ключ для подписи
минимизация и запутывание (обфускация)
возможность отладки
суффикс для пакета приложения
Product Flavor
различные исходники для включения в apk
разные варианты одного класса
разные варианты ресурсов
можно изменять пакет приложения
...и версию
./application/build.gradle
1 android {
2 defaultConfig { ... }
3 lintOptions { ... }
4 buildTypes {
5 debug {
6 debuggable true
7 applicationIdSuffix ".debug"
8 }
9 release {
10 debuggable false
11 applicationIdSuffix ".release"
12 }
13 }
14
15 productFlavors {
16 free {
17 applicationId "com.noveogroup.android.free"
18 }
19 paid {
20 applicationId "com.noveogroup.android.paid"
21 }
22 }
23 }
Build Variants
Полезные ссылки.
Wiki о Gradle
Официальная документация
Gradle в Android

Системы автоматизированной сборки (Lecture 05 – gradle)

  • 1.
  • 2.
    Преимущества Windows, Linux, MacOS Зависимости Автоматическоесоздание: JavaDoc Web-страниц проекта Отчеты Непрерывная интеграция Автоматизация сборки Автоматизированное тестирование
  • 3.
    Сборка проектов наJava 1976 Make 2000 2004 2009
  • 4.
    XML-сценарий build.xml* Императивная настройка Целиtarget Могут зависеть друг от друга Задачи task ant, antcall, mkdir, copy, delete, move, exec, get, jar, java, javac, javadoc, property, tstamp, style, cvs, echo Не умеет управлять зависимостями** :( * Может называться как угодно, по умолчанию ant будет искать build.xml ** Для зависимостей нужно использовать вместе с Apache Ivy
  • 5.
    Пример build.xml 1 <projectname="MyProject" default="run" basedir="."> 2 <description>Simple example build file</description> 3 <property name="src" location="src"/> 4 <property name="build" location="build"/> 5 <property name="dist" location="dist"/> 6 <property name="class" value="com.noveogroup.Main"/> 7 8 <target name="clean"> 9 <delete dir="${build}"/> 10 <delete dir="${dist}"/> 11 </target> 12 13 <target name="init" depends="clean"> 14 <tstamp/> <!-- Create the time stamp --> 15 <mkdir dir="${build}"/> 16 <mkdir dir="${build}/META-INF"/> 17 </target> 18 19 <target name="compile" depends="init"> 20 <javac srcdir="${src}" destdir="${build}"/> 21 <manifest file="${build}/META-INF/MANIFEST.MF"> 22 <attribute name="Main-Class" value="${class}"/> 23 </manifest>
  • 6.
    Фреймворк Сценарий сборки pom.xml* Декларативнаянастройка Стандартная структура директорий Жизненный цикл:   clean, compile, test, package, install, deploy Плагины *Похож на XML
  • 7.
  • 8.
    Maven: Pom.xml 1 <project> 2<modelVersion>4.0.0</modelVersion> 3 4 <groupId>com.noveogroup.example</groupId> 5 <artifactId>maven</artifactId> 6 <version>1.0</version> 7 8 <dependencies> 9 <dependency> 10 <groupId>com.noveogroup.example</groupId> 11 <artifactId>library</artifactId> 12 <version>3.0.1</version> 13 </dependency> 14 <dependency> 15 <groupId>junit</groupId> 16 <artifactId>junit</artifactId> 17 </dependency> 18 </dependencies> 19 </project>
  • 9.
    Maven: минимальная конфигурация версияконфигурационного файла координаты проекта: artifactId: имя проекта groupId: автор проекта version: версия проекта "groupId:artifcatId:version" Любую зависимость можно указать через эту тройку   Супер Pom обеспечивает конфигурацию модулей по умолчанию
  • 10.
  • 12.
    Это DSL -Domain Speci c Language (ура, не XML) Основан на Groovy Статическая и динамическая типизация Замыкания Перегрузка операций Улучшенный синтаксис Java
  • 13.
    Интеграция с Maven-репозиторием Стандартнаяструктура директорий Плагины для сборки проекта, настраеваемые декларативно
  • 14.
    Направленный ациклический графзадач Встроенная поддержка задач Apache Ant Императивное описание задачи Gradle Daemon, Wrapper
  • 15.
    Gradle: плагины 1 //эмуляцияжизненного цикла maven 2 apply plugin: 'java' 3 4 //запуск java-приложения 5 apply plugin: 'application' 6 7 //сборка android-приложения   8 apply plugin: 'com.android.application'
  • 17.
  • 18.
  • 19.
    Build Script allprojects {} настройкидля всех проектов (подхватываются каждым модулем) buildscript {} настройка build-скрипта Gradle repositories {} откуда нужно качать зависимости чтобы не указывать в каждом модуле - выносим в корень dependencies {} какие зависимости нужны
  • 20.
    О репозиториях Maven Central jCenter Можноподнимать свои серваки с репозиториями
  • 21.
    ./build.gradle 1 buildscript { 2repositories { 3 jcenter() 4 } 5 dependencies { 6 /* Плагин для сборки регистрируется как зависимость: 7 com.android.tools.build - группа 8 gradle - идентификатор 9 2.1.2 - версия */ 10 classpath 'com.android.tools.build:gradle:2.1.2' 11 } 12 } 13 14 allprojects { 15 repositories { 16 jcenter() 17 } 18 }
  • 22.
    ./settings.gradle 1 include ':app',':super-library', 'one-more-module'
  • 23.
    ./application/build.gradle 1 apply plugin:'com.android.application' 2 3 android { 4 compileSdkVersion 23 5 buildToolsVersion "23.0.3" 6 7 defaultConfig { 8 applicationId "com.noveogroup.example.android" 9 minSdkVersion 16 10 targetSdkVersion 23 11 versionCode 1 12 versionName "1.0" 13 } 14 } 15 16 dependencies { 17 compile fileTree(dir: 'libs', include: ['*.jar']) 18 compile 'com.android.support:support-v4:23.4.0' 19 compile 'com.android.support:appcompat-v7:23.4.0' 20 }
  • 24.
    ./application/build.gradle apply - применяетк проекту плагин. Плагин добавляет задачи android - содержит настройки для плагина com.android.application compileSdkVersion buildToolsVersion - утилита для сброки apk defaultCon g - параметры Android-проекта dependencies - список зависимостей модуля
  • 25.
    ./library/build.gradle 1 apply plugin:'com.android.library' 2 3 android { 4 compileSdkVersion 23 5 buildToolsVersion "23.0.3" 6 7 defaultConfig { 8 applicationId "com.noveogroup.example.library" 9 minSdkVersion 16 10 targetSdkVersion 23 11 versionCode 1 12 versionName "1.0" 13 } 14 } 15 16 dependencies { 17 compile fileTree(dir: 'libs', include: ['*.jar']) 18 }
  • 26.
    Зависимости gradle 1 dependencies{ 2 //от другого модуля 3 compile project(':mylibrary') 4 //от библиотеки из репозитория 5 compile 'com.android.support:appcompat-v7:23.4.0' 6 //от локальных библиотек 7 compile fileTree(dir: 'libs', include: ['*.jar']) 8 } * Gradle зависимости можно подключать так же как в maven: compile 'groupId : artifactId : version'
  • 27.
  • 28.
    Build Type различные способысборки/компиляции проекта ключ для подписи минимизация и запутывание (обфускация) возможность отладки суффикс для пакета приложения
  • 29.
    Product Flavor различные исходникидля включения в apk разные варианты одного класса разные варианты ресурсов можно изменять пакет приложения ...и версию
  • 30.
    ./application/build.gradle 1 android { 2defaultConfig { ... } 3 lintOptions { ... } 4 buildTypes { 5 debug { 6 debuggable true 7 applicationIdSuffix ".debug" 8 } 9 release { 10 debuggable false 11 applicationIdSuffix ".release" 12 } 13 } 14 15 productFlavors { 16 free { 17 applicationId "com.noveogroup.android.free" 18 } 19 paid { 20 applicationId "com.noveogroup.android.paid" 21 } 22 } 23 }
  • 31.
  • 32.
    Полезные ссылки. Wiki оGradle Официальная документация Gradle в Android