Создание и использование модулей в Android Studio, настройка Gradle

Создание модуля в виде библиотеки очень полезно если планируется переиспользовать какой-либо кусок кода в других проектах, либо просто для более логичной организации структуры сложных проектов.

Для создания модуля в Android Studio выбираете File > New > New Module. Далее есть 2 варианта. Если вы планируете создать «чистую» java-библиотеку, в качестве типа указывайте Java Library. Если же вы собираетесь использовать android-специфичные вещи и вам понадобятся классы из пакетов android.*, то создавайте Android Library.

В итоге получается подобная структура (при выборе Java Library структура будет немного проще):

Android Library Structure

Android Studio при создании модуля зачем-то приводит название к lowercase, но если это принципиально, то после создания его можно переименовать с использованием нужного регистра.

Теперь нужно добавить соответствующую зависимость в build.gradle зависимых модулей:

dependencies {
	...
	compile project(":mylib")
}

В целом, на этом можно закончить. Однако если вы планируете использовать очень много сторонних библиотек, подключаемых в виде модулей, то очень скоро в корне проекта может скопиться значительное количество хлама. Поэтому возможно вы захотите организовать структуру получше, и все сторонние модули перенести в одну общую папку.

Для этого создаём целевую папку и перетаскиваем в неё все сторонние модули:

Android Modules

Затем открываем settings.gradle и прописываем кастомные пути для всех модулей:

project(':mylib').projectDir = new File('libs/mylib')
project(':anotherlib').projectDir = new File('libs/anotherlib')

Готово.

PS: Есть вариант, что при попытке запуска проекта всё упадёт примерно с такой ошибкой:

Error:Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 1

Такое возникает при использовании JDK8. Придётся откатиться до JDK7 (впрочем, в JDK8 смысла пока нет).