Cинхронизация данных между приложениями на одном устройстве
Алексей ВитенкоРазработчик Yandex.Store
Я.СубботникМинск. 2013
Где мы?
ПроблемаЧто делать?Как делать?
Проблема
Проблема
Проблема
Общие компоненты
Яркий пример: Account Manager
Yandex Account Manager
Yandex Account Manager
Yandex Account Manager
Общие компонентыЕщё один пример: сервис Push сообщений.
Общие компонентыЕщё один пример: сервис Push сообщений.
Yandex Push Server
User's device
Application
Push-service #1
Push-service #2
AppToken #2
AppToken #1
Push Login #2
Push Login #1
Где мы?
ПроблемаЧто делать?Как делать?
Правильное решение*
* по версии Google
Правильное решение*Отдельное приложение для всех общих
компонентов
* по версии Google
Правильное решение*
* по версии Google
Но почему же никто так не делает?
Отдельное приложение для всех общих компонентов
Это пугает пользователей
Что-то типа такого
ПримерПакет Google Play Services (Google Settings)
ПримерПакет Google Play Services (Google Settings)
ПримерПакет Google Play Services (Google Settings)
Без синхронизацииApp1 App2 App3 App4 App5
Без синхронизации
Плюсы: предельная простота решения
App1 App2 App3 App4 App5
Без синхронизации
Плюсы: предельная простота решения
App1 App2 App3 App4 App5
Без синхронизации
Плюсы: предельная простота решения
Минусы:● Дополнительная нагрузка (не на систему)● трудности при предоставлении доступа другим приложениям
App1 App2 App3 App4 App5
Примерyandex old
Ещё пример
Приложение-флагманУстановлено
Приложение-флагманУстановлено
Приложение-флагманНе установлено
А если нет флагманского приложения?
Многократное дублирование
Многократное дублирование
Многократное дублированиеПлюсы:
● В системе гарантированно будет один набор компонентов
● Пользователь не видит разницы● Наиболее интересное решение с точки
зрения разработки
Многократное дублированиеПлюсы:
● В системе гарантированно будет один набор компонентов
● Пользователь не видит разницы● Наиболее интересное решение с точки
зрения разработки
Минусы:● Наиболее сложное решение● Дополнительные затраты на пересылку
данных● Увеличение размера приложения● Обеспечение безопасности
Где мы?
ПроблемаЧто делать?Как делать?
●SharedUserID●Content Providers●Services●Broadcasts
Механизмы
SharedUserIDЗащищённый доступ приложений к файлам и базам данных приложений с тем же UserID
SharedUserIDЗащищённый доступ приложений к файлам и базам данных приложений с тем же UserID
НО:● Это надо делать сразу● Иначе:
–Теряется доступ к старым данным–Необходимо вручную переустанавливать приложение.
SharedUserIDЗащищённый доступ приложений к файлам и базам данных приложений с тем же UserID
НО:● Это надо делать сразу● Иначе:
–Теряется доступ к старым данным–Необходимо вручную переустанавливать приложение.
● Всё равно надо синхронизировать данные
Content Providers
MasterBroadcast
Backup Backup Backup
Broadcast
Content ProvidersНедостатки:
●Данные с разной структуры
Content ProvidersНедостатки:
●Данные с разной структуры●Данные вычитываются по очереди из мастера
Content ProvidersНедостатки:
●Данные с разной структуры●Данные вычитываются по очереди из мастера●Системный баг и факапы
Issue 7716In app A's AndroidManifest.xml: (to serve a.apk/assets/web/* files)
<provider android:name="com.mycompany.apps.shared.WebContentProvider"
android:authorities="com.twowire.appengine.apps.app_a.web"
android:multiprocess="true"
android:exported="true" />
In app B's AndroidManifest.xml (to serve b.apk/assets/web/* files)
<provider android:name="com.mycompany.apps.shared.WebContentProvider"
android:authorities="com.twowire.appengine.apps.app_b.web"
android:multiprocess="true"
android:exported="true" />
Services
MasterBroadcast
Backup Backup Backup
Broadcast
Broadcasts
MasterBroadcast
Backup Backup Backup
Broadcast
BroadcastsДостоинства:
●Не зависит от состояния отправителя
BroadcastsДостоинства:
●Не зависит от состояния отправителяНедостатки:
●Размер передаваемых данных ограничен
Broadcasts
512 kB1024 kB256 kB htc