Конвейерное производство приложений
TRANSCRIPT
Конвейерное производство
приложений. Архитектура и инструменты
Мельников Андрей
Rambler&Co
Варианты реализация
Product flavors - нескольких версий buildTypes – настройки отдельных
параметров и ключей Android library – выделение
основной версии в библиотеку
Flavors
productFlavors { kassa35mm { applicationId "ru.rambler.kassa35mm" versionName "2.0" } kassabel { applicationId "ru.rambler.kassabel" versionName "2.2" versionCode 9 } }
Flavors
Отдельные ресурсы
Отдельный код
Отсутствие возможности проверки корректности других
веток
Легкая сборка
buildConfigField "boolean", "SUPPORT_FONTS", "true"
Архитектура
«Проект заготовка» Многоуровневая
архитектура, версии для менеджеров и теста flavors.
Специальные версии для отладки пушей и оплаты
Архитектура
Вся настройка с помощью главной фабрики
public class KassaApp extends Application { public void onCreate() {
… }
protected MainFactory createMainFactory() {
return new MainFactory();
}
}
Архитектура public class MainFactory {
public FragmentManager createFragmentManager() {
return new FragmentManager();
}
public UIManager createUIManager() {
return new UIManager();
}
public String getLatLng() {
return LocationManager.getInstance().getLatLngParams();
}
public String getCustomUrl() {
return getContext.getString(R.string.custom_url);
}
}
Архитектура
public class BolshoyFactory extends MainFactory {
public FragmentManager createFragmentManager() {
return new BolshoyFragmentManager();
}
@Override
public String getLatLng() {
return getString(R.string.lat_lng);
}
@Override
public UIManager createUIManager() {
return new CustomUIManager();
}
}
Архитектура
Основные компоненты:
MainFactory – фабрика основных сущностей
UIManager – тонкая настройка view элементов
FragmentManager – фабрика фрагментов
Архитектура
Работа с фрагментами: KassaFragmentManager:
…
@Override public Fragment getOneCinemaFragment() { return new CustomInfoFragment(); }
Настройка ключей
Вся ключи предоставляются через в хранятся в config.xml. Доступ через класс KeysProvider:
public class KeysProvider {
public String getAppKey() {}
public String getParseAppKey () {}
public String getAppKey() {}
}
Config.xml:
<string name="parse_app_key">***</string>
<string name=“flurry_key">***</string>
Получение дизайна
Дизайн создается по аналогии с основной версий. Все элементы поставляются в таком же формате.
Для цветовых настроек выделяется отдельный файл colors.xml:
<color name="kassa_delimiter">#bbe2f9</color>
Настройка ресурсов
Информация относительно кинотеатра хранится в отдельном файле :
<string name="support_custom_email">
</string>
<string name="app_name">
Киносеть Чарли </string>
Удаление элементов
Для удаления (скрытия) элементов используется
UIManager:
public boolean hasPosterSearch() {
return getBoolean(R.bool.config_poster_search_enabled);
}
public boolean hasHeaderLocation() {
return getBoolean(R.bool. config_header_location_enabled);
}
Пример использования:
if (!uiManager. hasHeaderLocation()) {
disableHeaderLocationView();
}
Добавление webView
За работу с webView отвечает
отдельный фрагмент.
Подменяем ссылку:
private String getUrl();
<string
name="custom_url_news">
http://kassa.rambler.ru
</string>
Добавление элементов
При добавлении элементов характерных для всех
типовых кинотеатров, мы добавляем их в основной
проект
При добавлении нетипичных элементов, мы
используем подмену фрагментов
@Override
public Place getPlace() {
Place customPlace = new Place();
customPlace.setId(52);
…
return customPlace;
}
Тестирование и отладка
Для unit тестирования используется Robolectric,
для UI - espresso
Для деплоя и аналитики используется fabric.io (ex
Crashlytics)
gradle assembleRelease
crashlyticsUploadDistributionRelease
ext.betaDistributionReleaseNotes=”Исправлено мигание превью.”
ext.betaDistributionEmails=“[email protected],
ext.betaDistributionGroupAliases=”ramblerCinema”
Continuous Integration
Для CI используется Jenkins
Сервер автоматически скачивает код из репозитория по событиям
Собираются все проекты
Автотесты проходят для всех проектов
Собранные apk доступны для скачивания и более детального анализа.
Доступен анализ покрытия кода тестами и
успешности выполнения
Управление аккаунтами
Приложение выкладывается из под аккаунта предоставленного заказчиком
К данному аккаунту привязываются сторонние сервисы, предоставляется доступ к статистике.
Публикация в google play и app store также
происходит от лица заказчика.
Возможно использование Publishing API
https://developers.google.com/android-publisher/